X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Ftypes.h;h=c8e31337c7bf452baed599e0b3fd3dfd50998a53;hp=ed2aae87f054727342629f30121d8c08fd44af5d;hb=d60cb676b003e5eb83566f9a2707b4dfea005020;hpb=1934b94f75b4e9804e92d8c62de21dca5a4322d6 diff --git a/include/babeltrace/types.h b/include/babeltrace/types.h index ed2aae87..c8e31337 100644 --- a/include/babeltrace/types.h +++ b/include/babeltrace/types.h @@ -105,6 +105,15 @@ struct definition_scope { /* Hash table mapping field name GQuark to "struct definition" */ GHashTable *definitions; struct definition_scope *parent_scope; + /* + * Complete "path" leading to this definition scope. + * Includes dynamic scope name '.' field name '.' field name '.' .... + * Array of GQuark elements (which are each separated by dots). + * The dynamic scope name can contain dots, and is encoded into + * a single GQuark. Thus, scope_path[0] returns the GQuark + * identifying the dynamic scope. + */ + GArray *scope_path; /* array of GQuark */ }; enum ctf_type_id { @@ -114,6 +123,7 @@ enum ctf_type_id { CTF_TYPE_ENUM, CTF_TYPE_STRING, CTF_TYPE_STRUCT, + CTF_TYPE_UNTAGGED_VARIANT, CTF_TYPE_VARIANT, CTF_TYPE_ARRAY, CTF_TYPE_SEQUENCE, @@ -131,7 +141,8 @@ struct declaration { void (*declaration_free)(struct declaration *declaration); struct definition * (*definition_new)(struct declaration *declaration, - struct definition_scope *parent_scope); + struct definition_scope *parent_scope, + GQuark field_name, int index); /* * definition_free called with definition ref is decremented to 0. */ @@ -147,6 +158,7 @@ struct declaration { struct definition { struct declaration *declaration; + int index; /* Position of the definition in its container */ int ref; /* number of references to the definition */ }; @@ -274,15 +286,20 @@ struct definition_struct { GArray *fields; /* Array of struct field */ }; -struct declaration_variant { +struct declaration_untagged_variant { struct declaration p; GHashTable *fields_by_tag; /* Tuples (field tag, field index) */ struct declaration_scope *scope; GArray *fields; /* Array of declaration_field */ - GQuark tag_name; /* TODO */ - /* Tag name must be nonzero and must exist when defining the variant */ }; +struct declaration_variant { + struct declaration p; + struct declaration_untagged_variant *untagged_variant; + GArray *tag_name; /* Array of GQuark */ +}; + +/* A variant needs to be tagged to be defined. */ struct definition_variant { struct definition p; struct declaration_variant *declaration; @@ -360,13 +377,18 @@ void free_declaration_scope(struct declaration_scope *scope); * definition scopes. */ struct definition * - lookup_field_definition(GQuark field_name, - struct definition_scope *scope); + lookup_definition(GArray *cur_path, /* array of GQuark */ + GArray *lookup_path, /* array of GQuark */ + struct definition_scope *scope); int register_field_definition(GQuark field_name, struct definition *definition, struct definition_scope *scope); struct definition_scope * - new_definition_scope(struct definition_scope *parent_scope); + new_definition_scope(struct definition_scope *parent_scope, + GQuark field_name); +void set_dynamic_definition_scope(struct definition *definition, + struct definition_scope *scope, + const char *root_name); void free_definition_scope(struct definition_scope *scope); void declaration_ref(struct declaration *declaration); @@ -452,13 +474,16 @@ struct_get_field_from_index(struct definition_struct *struct_definition, * from numeric values to a single tag. Overlapping tag value ranges are * therefore forbidden. */ -struct declaration_variant *variant_declaration_new(const char *name, +struct declaration_untagged_variant *untagged_variant_declaration_new(const char *name, struct declaration_scope *parent_scope); -void variant_declaration_add_field(struct declaration_variant *variant_declaration, - const char *tag_name, - struct declaration *tag_declaration); +struct declaration_variant *variant_declaration_new(struct declaration_untagged_variant *untagged_variant, + const char *tag); + +void untagged_variant_declaration_add_field(struct declaration_untagged_variant *untagged_variant_declaration, + const char *field_name, + struct declaration *field_declaration); struct declaration_field * - variant_declaration_get_field_from_tag(struct declaration_variant *variant_declaration, + untagged_variant_declaration_get_field_from_tag(struct declaration_untagged_variant *untagged_variant_declaration, GQuark tag); /* * Returns 0 on success, -EPERM on error. @@ -492,4 +517,9 @@ struct declaration_sequence * struct declaration *elem_declaration, struct declaration_scope *parent_scope); +/* + * in: path (dot separated), out: q (GArray of GQuark) + */ +void append_scope_path(const char *path, GArray *q); + #endif /* _BABELTRACE_declarationS_H */