X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fevents.c;h=b837b128393baf87905c81b28fc444cb2f434c42;hp=7619de74b9ac85993e4132325822ed2431b1045f;hb=c22b9327cbc4e6d9053f998952ea71c3227b8e36;hpb=b14d90bea808a063c60256d649f9fa009c7bda0b diff --git a/formats/ctf/events.c b/formats/ctf/events.c index 7619de74..b837b128 100644 --- a/formats/ctf/events.c +++ b/formats/ctf/events.c @@ -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; @@ -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;