X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=43fdcb22442386cace3e60553842e3b5c7eabd82;hp=9ded71627a65af988bc23eb0ddce68c5f0024356;hb=50052405724a3b901b258c00beb424751c579217;hpb=e003ab503def7b0db6c130cccbc03685adb32bbb diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 9ded7162..43fdcb22 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -40,6 +40,13 @@ #define _bt_list_first_entry(ptr, type, member) \ bt_list_entry((ptr)->next, type, member) +struct last_enum_value { + union { + int64_t s; + uint64_t u; + } u; +}; + int opt_clock_force_correlate; static @@ -933,7 +940,8 @@ error: static int ctf_enumerator_list_visit(FILE *fd, int depth, struct ctf_node *enumerator, - struct declaration_enum *enum_declaration) + struct declaration_enum *enum_declaration, + struct last_enum_value *last) { GQuark q; struct ctf_node *iter; @@ -969,8 +977,11 @@ int ctf_enumerator_list_visit(FILE *fd, int depth, } nr_vals++; } - if (nr_vals == 1) + if (nr_vals == 0) + start = last->u.s; + if (nr_vals <= 1) end = start; + last->u.s = end + 1; enum_signed_insert(enum_declaration, start, end, q); } else { uint64_t start, end; @@ -1006,8 +1017,11 @@ int ctf_enumerator_list_visit(FILE *fd, int depth, } nr_vals++; } - if (nr_vals == 1) + if (nr_vals == 0) + start = last->u.u; + if (nr_vals <= 1) end = start; + last->u.u = end + 1; enum_unsigned_insert(enum_declaration, start, end, q); } return 0; @@ -1025,6 +1039,7 @@ struct declaration *ctf_declaration_enum_visit(FILE *fd, int depth, struct declaration *declaration; struct declaration_enum *enum_declaration; struct declaration_integer *integer_declaration; + struct last_enum_value last_value; struct ctf_node *iter; GQuark dummy_id; int ret; @@ -1076,8 +1091,14 @@ struct declaration *ctf_declaration_enum_visit(FILE *fd, int depth, integer_declaration = container_of(declaration, struct declaration_integer, p); enum_declaration = enum_declaration_new(integer_declaration); declaration_unref(&integer_declaration->p); /* leave ref to enum */ + if (enum_declaration->integer_declaration->signedness) { + last_value.u.s = 0; + } else { + last_value.u.u = 0; + } bt_list_for_each_entry(iter, enumerator_list, siblings) { - ret = ctf_enumerator_list_visit(fd, depth + 1, iter, enum_declaration); + ret = ctf_enumerator_list_visit(fd, depth + 1, iter, enum_declaration, + &last_value); if (ret) goto error; } @@ -2339,7 +2360,7 @@ int ctf_clock_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace } if (!CTF_CLOCK_FIELD_IS_SET(clock, name)) { ret = -EPERM; - fprintf(fd, "[error] %s: missing namefield in clock declaration\n", __func__); + fprintf(fd, "[error] %s: missing name field in clock declaration\n", __func__); goto error; } if (g_hash_table_size(trace->clocks) > 0) {