X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=f54a276a486305a001aa1eae9038a69e9c0c0826;hp=3ba0a7fed1b9f5f28b619ee6f2b453851c1b5c42;hb=41253107837c6698a01af3133d11762302d8f9e5;hpb=d20f5e59af1c0db93913661a3daa92c087860e6e diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 3ba0a7fe..f54a276a 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ctf-scanner.h" #include "ctf-parser.h" #include "ctf-ast.h" @@ -72,7 +73,10 @@ int ctf_visitor_print_type_specifier(FILE *fd, int depth, struct ctf_node *node) fprintf(fd, "bool"); break; case TYPESPEC_COMPLEX: - fprintf(fd, "complex"); + fprintf(fd, "_Complex"); + break; + case TYPESPEC_IMAGINARY: + fprintf(fd, "_Imaginary"); break; case TYPESPEC_CONST: fprintf(fd, "const"); @@ -175,24 +179,76 @@ int ctf_visitor_print_type_declarator(FILE *fd, int depth, struct ctf_node *node } /* - * String returned must be freed by the caller. + * String returned must be freed by the caller using g_free. */ static char *concatenate_unary_strings(struct list_head *head) { - + struct ctf_node *node; + GString *str; + int i = 0; + + str = g_string_new(); + cds_list_for_each_entry(node, head, siblings) { + char *src_string; + + assert(node->type == NODE_UNARY_EXPRESSION); + assert(node->u.unary_expression.type == UNARY_STRING); + assert((node->u.unary_expression.link == UNARY_LINK_UNKNOWN) + ^ (i != 0)) + switch (node->u.unary_expression.link) { + case UNARY_DOTLINK: + g_string_append(str, ".") + break; + case UNARY_ARROWLINK: + g_string_append(str, "->") + break; + case UNARY_DOTDOTDOT: + g_string_append(str, "...") + break; + } + src_string = u.unary_expression.u.string; + g_string_append(str, src_string); + i++; + } + return g_string_free(str, FALSE); } static int get_unary_unsigned(struct list_head *head, uint64_t *value) { - + struct ctf_node *node; + int i = 0; + + 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.link == UNARY_LINK_UNKNOWN); + assert(i == 0); + *value = node->u.unary_expression.unsigned_constant + i++; + } + return 0; } static int get_unary_uuid(struct list_head *head, uuid_t *uuid) { - + struct ctf_node *node; + int i = 0; + int ret = -1; + + cds_list_for_each_entry(node, head, siblings) { + const char *src_string; + + assert(node->type == NODE_UNARY_EXPRESSION); + assert(node->u.unary_expression.type == UNARY_STRING); + assert(node->u.unary_expression.link == UNARY_LINK_UNKNOWN); + assert(i == 0); + src_string = u.unary_expression.u.string; + ret = uuid_parse(u.unary_expression.u.string, *uuid); + } + return ret; } static @@ -357,7 +413,7 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru return -EINVAL; } event->name = g_quark_from_string(right); - free(right); + g_free(right); CTF_EVENT_SET_FIELD(event, name); } else if (!strcmp(left, "id")) { if (CTF_EVENT_FIELD_IS_SET(event, id)) @@ -381,11 +437,6 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru fprintf(stderr, "[error] %s: stream id %" PRIu64 " cannot be found\n", __func__, event->stream_id); return -EINVAL; } - event->definition_scope = new_definition_scope(stream->definition_scope); - if (!event->definition_scope) { - fprintf(stderr, "[error] %s: Error allocating declaration scope\n", __func__); - return -EPERM; - } CTF_EVENT_SET_FIELD(event, stream_id); } else if (!strcmp(left, "context")) { struct declaration *declaration; @@ -399,8 +450,7 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru return -EPERM; if (declaration->type->id != CTF_TYPE_STRUCT) return -EPERM; - /* TODO: definition */ - event->context = container_of(declaration, struct declaration_struct, p); + event->context_decl = container_of(declaration, struct declaration_struct, p); } else if (!strcmp(left, "fields")) { struct declaration *declaration; @@ -413,10 +463,9 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru return -EPERM; if (declaration->type->id != CTF_TYPE_STRUCT) return -EPERM; - /* TODO: definition */ - event->fields = container_of(declaration, struct declaration_struct, p); + event->fields_decl = container_of(declaration, struct declaration_struct, p); } - free(left); + g_free(left); break; } default: @@ -434,6 +483,7 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, int ret = 0; struct ctf_node *iter; struct ctf_event *event; + struct definition_scope *parent_def_scope; event = g_new0(struct ctf_event, 1); event->declaration_scope = new_declaration_scope(parent_declaration_scope); @@ -460,11 +510,30 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, g_hash_table_insert(event->stream->event_quark_to_id, (gpointer)(unsigned long) event->name, &event->id); + parent_def_scope = stream->definition_scope; + if (event->context_decl) { + event->context = + event->context_decl->definition_new(event->context_decl, + parent_def_scope, 0, 0); + set_dynamic_definition_scope(event->context->scope, + g_quark_from_string("event.context")); + parent_def_scope = event->context->scope; + declaration_unref(event->context_decl); + } + if (event->fields_decl) { + event->fields = + event->fields_decl->definition_new(event->fields_decl, + parent_def_scope, 0, 0); + set_dynamic_definition_scope(event->fields->scope, + g_quark_from_string("event.fields")); + parent_def_scope = event->fields->scope; + declaration_unref(event->fields_decl); + } return 0; error: - declaration_unref(event->fields); - declaration_unref(event->context); + declaration_unref(event->fields_decl); + declaration_unref(event->context_decl); free_definition_scope(event->definition_scope); free_declaration_scope(event->declaration_scope); g_free(event); @@ -507,7 +576,7 @@ int ctf_stream_declaration_visit(FILE *fd, int depth, struct ctf_node *node, str return -EINVAL; } CTF_EVENT_SET_FIELD(event, stream_id); - } else if (!strcmp(left, "event_header")) { + } else if (!strcmp(left, "event.header")) { struct declaration *declaration; declaration = ctf_declaration_specifier_visit(fd, depth, @@ -517,9 +586,8 @@ int ctf_stream_declaration_visit(FILE *fd, int depth, struct ctf_node *node, str return -EPERM; if (declaration->type->id != CTF_TYPE_STRUCT) return -EPERM; - /* TODO: definition */ - stream->event_header = container_of(declaration, struct declaration_struct, p); - } else if (!strcmp(left, "event_context")) { + stream->event_header_decl = container_of(declaration, struct declaration_struct, p); + } else if (!strcmp(left, "event.context")) { struct declaration *declaration; declaration = ctf_declaration_specifier_visit(fd, depth, @@ -529,9 +597,8 @@ int ctf_stream_declaration_visit(FILE *fd, int depth, struct ctf_node *node, str return -EPERM; if (declaration->type->id != CTF_TYPE_STRUCT) return -EPERM; - /* TODO: definition */ - stream->event_context = container_of(declaration, struct declaration_struct, p); - } else if (!strcmp(left, "packet_context")) { + stream->event_context_decl = container_of(declaration, struct declaration_struct, p); + } else if (!strcmp(left, "packet.context")) { struct declaration *declaration; declaration = ctf_declaration_specifier_visit(fd, depth, @@ -541,10 +608,9 @@ int ctf_stream_declaration_visit(FILE *fd, int depth, struct ctf_node *node, str return -EPERM; if (declaration->type->id != CTF_TYPE_STRUCT) return -EPERM; - /* TODO: definition */ - stream->packet_context = container_of(declaration, struct declaration_struct, p); + stream->packet_context_decl = container_of(declaration, struct declaration_struct, p); } - free(left); + g_free(left); break; } default: @@ -562,10 +628,10 @@ int ctf_stream_visit(FILE *fd, int depth, struct ctf_node *node, int ret = 0; struct ctf_node *iter; struct ctf_stream *stream; + struct definition_scope *parent_def_scope; stream = g_new0(struct ctf_stream, 1); stream->declaration_scope = new_declaration_scope(parent_declaration_scope); - stream->definition_scope = new_definition_scope(trace->definition_scope); stream->events_by_id = g_ptr_array_new(); stream->event_quark_to_id = g_hash_table_new(g_int_hash, g_int_equal); cds_list_for_each_entry(iter, &node->u.stream.declaration_list, siblings) { @@ -580,6 +646,37 @@ int ctf_stream_visit(FILE *fd, int depth, struct ctf_node *node, if (trace->streams->len <= stream->stream_id) g_ptr_array_set_size(trace->streams, stream->stream_id + 1); g_ptr_array_index(trace->streams, stream->stream_id) = stream; + + parent_def_scope = NULL; + if (stream->packet_context_decl) { + stream->packet_context = + stream->packet_context_decl->definition_new(stream->packet_context_decl, + parent_def_scope, 0, 0); + set_dynamic_definition_scope(stream->packet_context->scope, + g_quark_from_string("stream.packet.context")); + parent_def_scope = stream->packet_context->scope; + declaration_unref(stream->packet_context_decl); + } + if (stream->event_header_decl) { + stream->event_header = + stream->event_header_decl->definition_new(stream->event_header_decl, + parent_def_scope, 0, 0); + set_dynamic_definition_scope(stream->event_header->scope, + g_quark_from_string("stream.event.header")); + parent_def_scope = stream->event_header->scope; + declaration_unref(stream->event_header_decl); + } + if (stream->event_context_decl) { + stream->event_context = + stream->event_context_decl->definition_new(stream->event_context_decl, + parent_def_scope, 0, 0); + set_dynamic_definition_scope(stream->event_context_scope, + g_quark_from_string("stream.event.context")); + parent_def_scope = stream->event_context->scope; + declaration_unref(stream->event_context_decl); + } + stream->definition_scope = parent_def_scope; + return 0; error: @@ -657,7 +754,7 @@ int ctf_trace_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru } CTF_EVENT_SET_FIELD(trace, uuid); } - free(left); + g_free(left); break; } default: @@ -678,7 +775,7 @@ int ctf_trace_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace if (trace->declaration_scope) return -EEXIST; trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope); - trace->definition_scope = new_definition_scope(trace->root_definition_scope); + trace->definition_scope = new_dynamic_definition_scope(trace->root_definition_scope); trace->streams = g_ptr_array_new(); cds_list_for_each_entry(iter, &node->u.trace.declaration_list, siblings) { ret = ctf_trace_declaration_visit(fd, depth + 1, iter, trace); @@ -747,13 +844,13 @@ int _ctf_visitor(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace *t } cds_list_for_each_entry(iter, &node->u.root.stream, siblings) { ret = ctf_stream_visit(fd, depth + 1, iter, - trace->declaration_scope, trace); + trace->root_declaration_scope, trace); if (ret) return ret; } cds_list_for_each_entry(iter, &node->u.root.event, siblings) { ret = ctf_event_visit(fd, depth + 1, iter, - trace->declaration_scope, trace); + trace->root_declaration_scope, trace); if (ret) return ret; }