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 <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
return container_of(decl, const struct declaration_array, p);
}
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;
int bt_ctf_get_int_signedness(const struct declaration *decl)
{
const struct declaration_integer *integer;
enum ctf_string_encoding bt_ctf_get_encoding(const struct declaration *decl)
{
enum ctf_string_encoding ret = 0;
enum ctf_string_encoding bt_ctf_get_encoding(const struct declaration *decl)
{
enum ctf_string_encoding ret = 0;
const struct declaration_integer *integer;
const struct declaration_string *string;
const struct declaration_integer *integer;
const struct declaration_string *string;
+ const struct declaration_array *array;
+ const struct declaration_sequence *sequence;
- 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)
- }
- } 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);
string = get_declaration_string(decl);
- if (string) {
- ret = string->encoding;
- } 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;
goto error;
}
return ret;
ssize_t bt_ctf_get_int_len(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);
* return a negative value on error
*/
enum ctf_string_encoding bt_ctf_get_encoding(const struct declaration *decl);