X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=types%2Ftypes.c;h=b9576ea3109ab98e07ff3473f23983a5a0d77e14;hp=17dcffb92576f868e3a212c05d235aed24617bc7;hb=a35173fe7e72fe456cbd19db34a5ff7a09a0c7ff;hpb=c6e183c2bacc6ee12b0545ef47fb41b63686d8c8 diff --git a/types/types.c b/types/types.c index 17dcffb9..b9576ea3 100644 --- a/types/types.c +++ b/types/types.c @@ -146,40 +146,7 @@ end: static struct definition_scope * get_definition_scope(struct definition *definition) { - switch (definition->declaration->id) { - case CTF_TYPE_STRUCT: - { - struct definition_struct *def = - container_of(definition, struct definition_struct, p); - return def->scope; - } - case CTF_TYPE_VARIANT: - { - struct definition_variant *def = - container_of(definition, struct definition_variant, p); - return def->scope; - } - case CTF_TYPE_ARRAY: - { - struct definition_array *def = - container_of(definition, struct definition_array, p); - return def->scope; - } - case CTF_TYPE_SEQUENCE: - { - struct definition_sequence *def = - container_of(definition, struct definition_sequence, p); - return def->scope; - } - - case CTF_TYPE_INTEGER: - case CTF_TYPE_FLOAT: - case CTF_TYPE_ENUM: - case CTF_TYPE_STRING: - case CTF_TYPE_UNKNOWN: - default: - return NULL; - } + return definition->scope; } /* @@ -203,9 +170,9 @@ static struct definition_scope * * scope: the definition scope containing the variant definition. */ struct definition * - lookup_definition(GArray *cur_path, - GArray *lookup_path, - struct definition_scope *scope) + lookup_path_definition(GArray *cur_path, + GArray *lookup_path, + struct definition_scope *scope) { struct definition *definition, *lookup_definition; GQuark last; @@ -629,3 +596,69 @@ void free_definition_scope(struct definition_scope *scope) g_hash_table_destroy(scope->definitions); g_free(scope); } + +static +struct definition *lookup_definition(struct definition *definition, + const char *field_name) +{ + struct definition_scope *scope = get_definition_scope(definition); + + if (!scope) + return NULL; + + return lookup_field_definition_scope(g_quark_from_string(field_name), + scope); +} + +struct definition_integer *lookup_integer(struct definition *definition, + const char *field_name, + int signedness) +{ + struct definition *lookup; + struct definition_integer *lookup_integer; + + lookup = lookup_definition(definition, field_name); + if (!lookup) + return NULL; + if (lookup->declaration->id != CTF_TYPE_INTEGER) + return NULL; + lookup_integer = container_of(lookup, struct definition_integer, p); + if (lookup_integer->declaration->signedness != signedness) + return NULL; + return lookup_integer; +} + +struct definition_enum *lookup_enum(struct definition *definition, + const char *field_name, + int signedness) +{ + struct definition *lookup; + struct definition_enum *lookup_enum; + + lookup = lookup_definition(definition, field_name); + if (!lookup) + return NULL; + if (lookup->declaration->id != CTF_TYPE_ENUM) + return NULL; + lookup_enum = container_of(lookup, struct definition_enum, p); + if (lookup_enum->integer->declaration->signedness != signedness) + return NULL; + return lookup_enum; +} + +struct definition *lookup_variant(struct definition *definition, + const char *field_name) +{ + struct definition *lookup; + struct definition_variant *lookup_variant; + + lookup = lookup_definition(definition, field_name); + if (!lookup) + return NULL; + if (lookup->declaration->id != CTF_TYPE_VARIANT) + return NULL; + lookup_variant = container_of(lookup, struct definition_variant, p); + lookup = variant_get_current_field(lookup_variant); + assert(lookup); + return lookup; +}