From fef0e5211cd1cb9a2acb5dad6045d15cfd75fe5b Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 2 May 2012 11:47:50 -0400 Subject: [PATCH] Fix: add missing bt_ctf_get_int_len API Useful to track the overflow of integer values. Signed-off-by: Mathieu Desnoyers --- formats/ctf/events.c | 14 ++++++++++++++ include/babeltrace/ctf/events.h | 6 ++++++ include/babeltrace/types.h | 1 + types/integer.c | 11 +++++++++++ 4 files changed, 32 insertions(+) diff --git a/formats/ctf/events.c b/formats/ctf/events.c index 27a5fe7b..4fa8f303 100644 --- a/formats/ctf/events.c +++ b/formats/ctf/events.c @@ -357,6 +357,20 @@ int bt_ctf_get_int_byte_order(const struct definition *field) return ret; } +ssize_t bt_ctf_get_int_len(const struct definition *field) +{ + ssize_t ret; + + if (field && bt_ctf_field_type(field) == CTF_TYPE_INTEGER) { + ret = (ssize_t) get_int_len(field); + } else { + ret = -1; + bt_ctf_field_set_error(-EINVAL); + } + + return ret; +} + enum ctf_string_encoding bt_ctf_get_encoding(const struct definition *field) { enum ctf_string_encoding ret = 0; diff --git a/include/babeltrace/ctf/events.h b/include/babeltrace/ctf/events.h index 30365aaa..1cfa9e3b 100644 --- a/include/babeltrace/ctf/events.h +++ b/include/babeltrace/ctf/events.h @@ -155,6 +155,12 @@ int bt_ctf_get_int_base(const struct definition *field); */ int bt_ctf_get_int_byte_order(const struct definition *field); +/* + * bt_ctf_get_int_len: return the size, in bits, of an int or a negative + * value on error + */ +ssize_t bt_ctf_get_int_len(const struct definition *field); + /* * bt_ctf_get_encoding: return the encoding of an int or a string. * return a negative value on error diff --git a/include/babeltrace/types.h b/include/babeltrace/types.h index 845a8ae9..a0ad283d 100644 --- a/include/babeltrace/types.h +++ b/include/babeltrace/types.h @@ -371,6 +371,7 @@ int64_t get_signed_int(const struct definition *field); int get_int_signedness(const struct definition *field); int get_int_byte_order(const struct definition *field); int get_int_base(const struct definition *field); +size_t get_int_len(const struct definition *field); /* in bits */ enum ctf_string_encoding get_int_encoding(const struct definition *field); /* diff --git a/types/integer.c b/types/integer.c index 808a4893..af5cc39f 100644 --- a/types/integer.c +++ b/types/integer.c @@ -129,6 +129,17 @@ int get_int_base(const struct definition *field) return integer_declaration->base; } +size_t get_int_len(const struct definition *field) +{ + struct definition_integer *integer_definition; + const struct declaration_integer *integer_declaration; + + integer_definition = container_of(field, struct definition_integer, p); + integer_declaration = integer_definition->declaration; + + return integer_declaration->len; +} + int get_int_byte_order(const struct definition *field) { struct definition_integer *integer_definition; -- 2.34.1