X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=2db25794aed6741cea5e8ef1b5dc4afd5740d5f0;hb=31bdef5c0395938cf373fee199d4133c8f2f49a8;hp=dee8384d703b07778fd5fa46b1045a6b0e1ce7d0;hpb=11ac667403ca915f51cc5981fa4bb8bd443fb606;p=babeltrace.git diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index dee8384d..2db25794 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -156,10 +156,20 @@ int get_unary_signed(struct cds_list_head *head, int64_t *value) cds_list_for_each_entry(node, head, siblings) { assert(node->type == NODE_UNARY_EXPRESSION); - assert(node->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT); + assert(node->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT + || node->u.unary_expression.type == UNARY_SIGNED_CONSTANT); assert(node->u.unary_expression.link == UNARY_LINK_UNKNOWN); assert(i == 0); - *value = node->u.unary_expression.u.signed_constant; + switch (node->u.unary_expression.type) { + case UNARY_UNSIGNED_CONSTANT: + *value = (int64_t) node->u.unary_expression.u.unsigned_constant; + break; + case UNARY_SIGNED_CONSTANT: + *value = node->u.unary_expression.u.signed_constant; + break; + default: + assert(0); + } i++; } return 0; @@ -1649,36 +1659,22 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru goto error; } event->fields_decl = container_of(declaration, struct declaration_struct, p); - } else if (!strcmp(left, "loglevel.identifier")) { - char *right; + } else if (!strcmp(left, "loglevel")) { + int64_t loglevel = -1; - if (CTF_EVENT_FIELD_IS_SET(event, loglevel_identifier)) { - fprintf(fd, "[error] %s: identifier already declared in event declaration\n", __func__); - ret = -EPERM; - goto error; - } - right = concatenate_unary_strings(&node->u.ctf_expression.right); - if (!right) { - fprintf(fd, "[error] %s: unexpected unary expression for event identifier\n", __func__); - ret = -EINVAL; - goto error; - } - event->loglevel_identifier = g_quark_from_string(right); - g_free(right); - CTF_EVENT_SET_FIELD(event, loglevel_identifier); - } else if (!strcmp(left, "loglevel.value")) { - if (CTF_EVENT_FIELD_IS_SET(event, loglevel_value)) { - fprintf(fd, "[error] %s: loglevel value already declared in event declaration\n", __func__); + if (CTF_EVENT_FIELD_IS_SET(event, loglevel)) { + fprintf(fd, "[error] %s: loglevel already declared in event declaration\n", __func__); ret = -EPERM; goto error; } - ret = get_unary_signed(&node->u.ctf_expression.right, &event->loglevel_value); + ret = get_unary_signed(&node->u.ctf_expression.right, &loglevel); if (ret) { - fprintf(fd, "[error] %s: unexpected unary expression for event loglevel value\n", __func__); + fprintf(fd, "[error] %s: unexpected unary expression for event loglevel\n", __func__); ret = -EINVAL; goto error; } - CTF_EVENT_SET_FIELD(event, loglevel_value); + event->loglevel = (int) loglevel; + CTF_EVENT_SET_FIELD(event, loglevel); } else { fprintf(fd, "[warning] %s: attribute \"%s\" is unknown in event declaration.\n", __func__, left); /* Fall-through after warning */ @@ -1705,6 +1701,7 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, event = g_new0(struct ctf_event, 1); event->declaration_scope = new_declaration_scope(parent_declaration_scope); + event->loglevel = -1; cds_list_for_each_entry(iter, &node->u.event.declaration_list, siblings) { ret = ctf_event_declaration_visit(fd, depth + 1, iter, event, trace); if (ret) @@ -2304,6 +2301,13 @@ void clock_free(gpointer data) g_free(clock); } +static +int ctf_env_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace *trace) +{ + fprintf(fd, "[warning] %s: environment declaration support not implement yet.\n", __func__); + return 0; /* continue */ +} + static int ctf_root_declaration_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace *trace) { @@ -2355,7 +2359,7 @@ int ctf_visitor_construct_metadata(FILE *fd, int depth, struct ctf_node *node, { int ret = 0; struct ctf_node *iter; - int clock_done = 0; + int env_clock_done = 0; printf_verbose("CTF visitor: metadata construction... "); trace->byte_order = byte_order; @@ -2367,7 +2371,16 @@ retry: switch (node->type) { case NODE_ROOT: - if (!clock_done) { + if (!env_clock_done) { + cds_list_for_each_entry(iter, &node->u.root.env, siblings) { + ret = ctf_env_visit(fd, depth + 1, iter, + trace); + if (ret) { + fprintf(fd, "[error] %s: env declaration error\n", __func__); + goto error; + } + } + /* * declarations need to query clock hash table, * so clock need to be treated first. @@ -2380,7 +2393,7 @@ retry: goto error; } } - clock_done = 1; + env_clock_done = 1; } cds_list_for_each_entry(iter, &node->u.root.declaration_list, siblings) {