X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Fctf%2Fcommon%2Fmetadata%2Fdecoder.c;fp=src%2Fplugins%2Fctf%2Fcommon%2Fmetadata%2Fdecoder.c;h=7407ad339dbf927bce3f741f29e61ac6782a8a64;hb=1a6da3f9c9a9377973679ca269cd81079d834044;hp=17b2aa4bd211be1474d4d7da288207f7cc7fc2a7;hpb=06be99464988953e390114337ccdd20622fb50d1;p=babeltrace.git diff --git a/src/plugins/ctf/common/metadata/decoder.c b/src/plugins/ctf/common/metadata/decoder.c index 17b2aa4b..7407ad33 100644 --- a/src/plugins/ctf/common/metadata/decoder.c +++ b/src/plugins/ctf/common/metadata/decoder.c @@ -406,3 +406,80 @@ int ctf_metadata_decoder_get_uuid(struct ctf_metadata_decoder *mdec, end: return ret; } + +static +enum ctf_metadata_decoder_status find_uuid_in_trace_decl( + struct ctf_metadata_decoder *mdec, struct ctf_node *trace_node, + bt_uuid_t uuid) +{ + enum ctf_metadata_decoder_status status = + CTF_METADATA_DECODER_STATUS_OK; + struct ctf_node *entry_node; + struct bt_list_head *decl_list = &trace_node->u.trace.declaration_list; + char *left = NULL; + + bt_list_for_each_entry(entry_node, decl_list, siblings) { + if (entry_node->type == NODE_CTF_EXPRESSION) { + int ret; + + left = ctf_ast_concatenate_unary_strings( + &entry_node->u.ctf_expression.left); + if (!left) { + BT_COMP_LOGE("Cannot concatenate unary strings."); + status = CTF_METADATA_DECODER_STATUS_ERROR; + goto end; + } + + if (strcmp(left, "uuid") == 0) { + ret = ctf_ast_get_unary_uuid( + &entry_node->u.ctf_expression.right, + uuid, mdec->config.log_level, + mdec->config.self_comp); + if (ret) { + BT_COMP_LOGE("Invalid trace's `uuid` attribute."); + status = CTF_METADATA_DECODER_STATUS_ERROR; + goto end; + } + + goto end; + } + + g_free(left); + left = NULL; + } + } + + status = CTF_METADATA_DECODER_STATUS_NONE; + +end: + g_free(left); + return status; +} + +BT_HIDDEN +enum ctf_metadata_decoder_status ctf_metadata_decoder_get_trace_class_uuid( + struct ctf_metadata_decoder *mdec, bt_uuid_t uuid) +{ + enum ctf_metadata_decoder_status status = + CTF_METADATA_DECODER_STATUS_INCOMPLETE; + struct ctf_node *root_node = &mdec->scanner->ast->root; + struct ctf_node *trace_node; + + if (!root_node) { + status = CTF_METADATA_DECODER_STATUS_INCOMPLETE; + goto end; + } + + trace_node = + bt_list_entry(root_node->u.root.trace.next, + struct ctf_node, siblings); + if (!trace_node) { + status = CTF_METADATA_DECODER_STATUS_INCOMPLETE; + goto end; + } + + status = find_uuid_in_trace_decl(mdec, trace_node, uuid); + +end: + return status; +}