X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fevents.c;h=b837b128393baf87905c81b28fc444cb2f434c42;hp=d3488b3f9d7b8e3cb010d2c6d8497e16afbaa4ff;hb=c22b9327cbc4e6d9053f998952ea71c3227b8e36;hpb=554cf4241db0bda1b76e18859b24fb0e14f0f0f9 diff --git a/formats/ctf/events.c b/formats/ctf/events.c index d3488b3f..b837b128 100644 --- a/formats/ctf/events.c +++ b/formats/ctf/events.c @@ -110,7 +110,7 @@ const struct definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event, def = lookup_definition(scope, field_underscore); g_free(field_underscore); } - if (bt_ctf_field_type(bt_ctf_get_field_decl(def)) == CTF_TYPE_VARIANT) { + if (bt_ctf_field_type(bt_ctf_get_decl_from_def(def)) == CTF_TYPE_VARIANT) { const struct definition_variant *variant_definition; variant_definition = container_of(def, const struct definition_variant, p); @@ -128,12 +128,12 @@ const struct definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event, if (!ctf_event || !field) return NULL; - if (bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_ARRAY) { + if (bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_ARRAY) { struct definition_array *array_definition; array_definition = container_of(field, struct definition_array, p); ret = array_index(array_definition, index); - } else if (bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_SEQUENCE) { + } else if (bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_SEQUENCE) { struct definition_sequence *sequence_definition; sequence_definition = container_of(field, struct definition_sequence, p); @@ -182,7 +182,7 @@ int bt_ctf_get_field_list(const struct bt_ctf_event *ctf_event, if (!ctf_event || !scope || !list || !count) return -EINVAL; - switch (bt_ctf_field_type(bt_ctf_get_field_decl(scope))) { + switch (bt_ctf_field_type(bt_ctf_get_decl_from_def(scope))) { case CTF_TYPE_INTEGER: case CTF_TYPE_FLOAT: case CTF_TYPE_STRING: @@ -373,6 +373,14 @@ get_declaration_array(const struct declaration *decl) return container_of(decl, const struct declaration_array, p); } +static const struct declaration_sequence * +get_declaration_sequence(const struct declaration *decl) +{ + if (!decl || bt_ctf_field_type(decl) != CTF_TYPE_SEQUENCE) + return NULL; + return container_of(decl, const struct declaration_sequence, p); +} + int bt_ctf_get_int_signedness(const struct declaration *decl) { const struct declaration_integer *integer; @@ -425,7 +433,7 @@ const struct definition *bt_ctf_get_enum_int(const struct definition *field) { const struct definition_enum *def_enum; - if (!field || bt_ctf_field_type(bt_ctf_get_field_decl(field)) != CTF_TYPE_ENUM) { + if (!field || bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) != CTF_TYPE_ENUM) { bt_ctf_field_set_error(-EINVAL); return NULL; } @@ -440,7 +448,7 @@ const char *bt_ctf_get_enum_str(const struct definition *field) GArray *array; const char *ret; - if (!field || bt_ctf_field_type(bt_ctf_get_field_decl(field)) != CTF_TYPE_ENUM) { + if (!field || bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) != CTF_TYPE_ENUM) { bt_ctf_field_set_error(-EINVAL); return NULL; } @@ -472,27 +480,49 @@ const char *bt_ctf_get_enum_str(const struct definition *field) enum ctf_string_encoding bt_ctf_get_encoding(const struct declaration *decl) { enum ctf_string_encoding ret = 0; + enum ctf_type_id type; const struct declaration_integer *integer; const struct declaration_string *string; + const struct declaration_array *array; + const struct declaration_sequence *sequence; if (!decl) goto error; - if (bt_ctf_field_type(decl) == CTF_TYPE_INTEGER) { - integer = get_declaration_integer(decl); - if (integer) { - ret = integer->encoding; - } else { + type = bt_ctf_field_type(decl); + + switch (type) { + case CTF_TYPE_ARRAY: + array = get_declaration_array(decl); + if (!array) goto error; - } - } else if (bt_ctf_field_type(decl) == CTF_TYPE_STRING) { + integer = get_declaration_integer(array->elem); + if (!integer) + goto error; + ret = integer->encoding; + break; + case CTF_TYPE_SEQUENCE: + sequence = get_declaration_sequence(decl); + if (!sequence) + goto error; + integer = get_declaration_integer(sequence->elem); + if (!integer) + goto error; + ret = integer->encoding; + break; + case CTF_TYPE_STRING: string = get_declaration_string(decl); - if (string) { - ret = string->encoding; - } else { + if (!string) goto error; - } - } else { + ret = string->encoding; + break; + case CTF_TYPE_INTEGER: + integer = get_declaration_integer(decl); + if (!integer) + goto error; + ret = integer->encoding; + break; + default: goto error; } return ret; @@ -520,7 +550,7 @@ uint64_t bt_ctf_get_uint64(const struct definition *field) { uint64_t ret = 0; - if (field && bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_INTEGER) + if (field && bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_INTEGER) ret = get_unsigned_int(field); else bt_ctf_field_set_error(-EINVAL); @@ -532,7 +562,7 @@ int64_t bt_ctf_get_int64(const struct definition *field) { int64_t ret = 0; - if (field && bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_INTEGER) + if (field && bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_INTEGER) ret = get_signed_int(field); else bt_ctf_field_set_error(-EINVAL); @@ -545,7 +575,7 @@ char *bt_ctf_get_char_array(const struct definition *field) char *ret = NULL; GString *char_array; - if (field && bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_ARRAY) { + if (field && bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_ARRAY) { char_array = get_char_array(field); if (char_array) { ret = char_array->str; @@ -562,7 +592,7 @@ char *bt_ctf_get_string(const struct definition *field) { char *ret = NULL; - if (field && bt_ctf_field_type(bt_ctf_get_field_decl(field)) == CTF_TYPE_STRING) + if (field && bt_ctf_field_type(bt_ctf_get_decl_from_def(field)) == CTF_TYPE_STRING) ret = get_string(field); else bt_ctf_field_set_error(-EINVAL); @@ -729,10 +759,19 @@ const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field) return rem_(g_quark_to_string(((struct declaration_field *) field)->name)); } -const struct declaration *bt_ctf_get_field_decl(const struct definition *def) +const struct declaration *bt_ctf_get_decl_from_def(const struct definition *def) { if (def) return def->declaration; return NULL; } + +const struct declaration *bt_ctf_get_decl_from_field_decl( + const struct bt_ctf_field_decl *field) +{ + if (field) + return ((struct declaration_field *) field)->declaration; + + return NULL; +}