X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=types%2Ftypes.c;h=327ddbb3a1102976ebcb3733affd547eba7cf660;hb=b9e662acc05d66a1eddda359712281fde8e6b120;hp=227a1e5e3125976730b79197a987e291e82a1714;hpb=9e29e16ee50d03cf4fdc0cea0220832323939dc3;p=babeltrace.git diff --git a/types/types.c b/types/types.c index 227a1e5e..327ddbb3 100644 --- a/types/types.c +++ b/types/types.c @@ -19,6 +19,7 @@ */ #include +#include #include #include @@ -328,7 +329,7 @@ int register_struct_declaration(GQuark struct_name, } static -struct declaration_variant * +struct declaration_untagged_variant * lookup_variant_declaration_scope(GQuark variant_name, struct declaration_scope *scope) { @@ -336,11 +337,11 @@ struct declaration_variant * (gconstpointer) (unsigned long) variant_name); } -struct declaration_variant * +struct declaration_untagged_variant * lookup_variant_declaration(GQuark variant_name, struct declaration_scope *scope) { - struct declaration_variant *declaration; + struct declaration_untagged_variant *declaration; while (scope) { declaration = lookup_variant_declaration_scope(variant_name, scope); @@ -352,7 +353,7 @@ struct declaration_variant * } int register_variant_declaration(GQuark variant_name, - struct declaration_variant *variant_declaration, + struct declaration_untagged_variant *untagged_variant_declaration, struct declaration_scope *scope) { if (!variant_name) @@ -364,8 +365,8 @@ int register_variant_declaration(GQuark variant_name, g_hash_table_insert(scope->variant_declarations, (gpointer) (unsigned long) variant_name, - variant_declaration); - declaration_ref(&variant_declaration->p); + untagged_variant_declaration); + declaration_ref(&untagged_variant_declaration->p); return 0; } @@ -446,17 +447,49 @@ struct definition_scope * } /* - * Same as new_definition_scope, but reset the scope path. + * in: path (dot separated), out: q (GArray of GQuark) */ -struct definition_scope * - new_dynamic_definition_scope(struct definition_scope *parent_scope, - GQuark field_name) +void append_scope_path(const char *path, GArray *q) { - struct definition_scope *scope; + const char *ptrbegin, *ptrend = path; + GQuark quark; + + for (;;) { + char *str; + size_t len; + + ptrbegin = ptrend; + ptrend = strchr(ptrbegin, '.'); + if (!ptrend) + break; + len = ptrend - ptrbegin; + /* Don't accept two consecutive dots */ + assert(len != 0); + str = g_new(char, len + 1); /* include \0 */ + memcpy(str, ptrbegin, len); + str[len] = '\0'; + quark = g_quark_from_string(str); + g_array_append_val(q, quark); + g_free(str); + } + /* last. Check for trailing dot (and discard). */ + if (ptrbegin[0] != '\0') { + quark = g_quark_from_string(ptrbegin); + g_array_append_val(q, quark); + } +} - scope = _new_definition_scope(parent_scope, 1); - g_array_index(scope->scope_path, GQuark, 0) = field_name; - return scope; +void set_dynamic_definition_scope(struct definition *definition, + struct definition_scope *scope, + const char *root_name) +{ + g_array_set_size(scope->scope_path, 0); + append_scope_path(root_name, scope->scope_path); + /* + * Use INT_MAX order to ensure that all fields of the parent + * scope are seen as being prior to this scope. + */ + definition->index = INT_MAX; } void free_definition_scope(struct definition_scope *scope)