From c22b9327cbc4e6d9053f998952ea71c3227b8e36 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Mon, 10 Sep 2012 22:01:58 -0400 Subject: [PATCH] Fix: get encoding for char arrays and sequences The bt_ctf_get_encoding works for strings and integer, but not for char arrays or sequences. For these compound types, we need to return the encoding of the integer contained inside. This patch adds the support of char arrays and sequences. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- formats/ctf/events.c | 54 +++++++++++++++++++++++++-------- include/babeltrace/ctf/events.h | 3 +- 2 files changed, 44 insertions(+), 13 deletions(-) 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; diff --git a/include/babeltrace/ctf/events.h b/include/babeltrace/ctf/events.h index e4074037..461cf06c 100644 --- a/include/babeltrace/ctf/events.h +++ b/include/babeltrace/ctf/events.h @@ -191,7 +191,8 @@ int bt_ctf_get_int_byte_order(const struct declaration *decl); ssize_t bt_ctf_get_int_len(const struct declaration *decl); /* - * bt_ctf_get_encoding: return the encoding of an int or a string. + * bt_ctf_get_encoding: return the encoding of an int, a string, or of + * the integer contained in a char array or a sequence. * return a negative value on error */ enum ctf_string_encoding bt_ctf_get_encoding(const struct declaration *decl); -- 2.34.1