From 5792eb34cf619c28d52da0c55f1053ddcda7cf5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 18 Feb 2014 02:04:22 -0500 Subject: [PATCH] Python bindings: return char arrays as strings in value() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Implement the same logic as in ctf-text to return a string when value() is called on an array of elements that are encoded as ASCII or UTF8 and 8-bits long. Signed-off-by: Jérémie Galarneau --- bindings/python/babeltrace.i.in | 31 ++++++++++++++++++++++------ bindings/python/python-complements.c | 31 ++++++++++++++++++++++++++++ bindings/python/python-complements.h | 3 +++ 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index aaa400aa..294177fa 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -60,6 +60,7 @@ trace to it." typedef unsigned long long uint64_t; typedef long long int64_t; typedef int bt_intern_str; +typedef int64_t ssize_t; /* ================================================================= PYTHON-COMPLEMENTS.H @@ -90,6 +91,9 @@ struct definition_array *_bt_python_get_array_from_def( struct bt_definition *field); struct definition_sequence *_bt_python_get_sequence_from_def( struct bt_definition *field); +struct bt_declaration *_bt_python_get_array_element_declaration( + struct bt_declaration *field); +const char *_bt_python_get_array_string(struct bt_definition *field); int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field); enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field); @@ -935,6 +939,14 @@ class ArrayFieldDeclaration(FieldDeclaration): """ return _bt_ctf_get_array_len(self._fd) + @property + def element_declaration(self): + """ + Return element declaration. + """ + field_decl_ptr = _bt_python_get_array_element_declaration(self._fd) + return _create_field_declaration(field_decl_ptr, "", self.scope) + class SequenceFieldDeclaration(FieldDeclaration): """Do not instantiate.""" def __init__(self): @@ -1015,7 +1027,7 @@ class _Definition(object): """Return the name of a field or None on error.""" return _bt_ctf_field_name(self._d) - @property + @property def type(self): """Return the type of a field or -1 if unknown.""" return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d)) @@ -1145,13 +1157,20 @@ class _Definition(object): """ id = self.type value = None + if id == CTFTypeId.STRING: value = self._get_str() elif id == CTFTypeId.ARRAY: - value = [] - for i in range(self.declaration.length): - element = self._get_array_element_at(i) - value.append(element.value) + element_decl = self.declaration.element_declaration + if ((element_decl.type == CTFTypeId.INTEGER + and element_decl.length == 8) + and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)): + value = _bt_python_get_array_string(self._d) + else: + value = [] + for i in range(self.declaration.length): + element = self._get_array_element_at(i) + value.append(element.value) elif id == CTFTypeId.INTEGER: if self.declaration.signedness == 0: value = self._get_uint64() @@ -1178,7 +1197,7 @@ class _Definition(object): value[member.name] = member.value if field_error(): - raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(self.declaration.type))) + raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(id))) return value @property diff --git a/bindings/python/python-complements.c b/bindings/python/python-complements.c index b6f1d5a8..e1c52c98 100644 --- a/bindings/python/python-complements.c +++ b/bindings/python/python-complements.c @@ -135,6 +135,37 @@ end: return array; } +struct bt_declaration *_bt_python_get_array_element_declaration( + struct bt_declaration *field) +{ + struct declaration_array *array_decl; + struct bt_declaration *ret = NULL; + + if (!field) { + goto end; + } + + array_decl = container_of(field, struct declaration_array, p); + ret = array_decl->elem; +end: + return ret; +} + +const char *_bt_python_get_array_string(struct bt_definition *field) +{ + struct definition_array *array; + const char *ret = NULL; + + if (!field) { + goto end; + } + + array = container_of(field, struct definition_array, p); + ret = array->string->str; +end: + return ret; +} + struct definition_sequence *_bt_python_get_sequence_from_def( struct bt_definition *field) { diff --git a/bindings/python/python-complements.h b/bindings/python/python-complements.h index 43b77197..fc7c426e 100644 --- a/bindings/python/python-complements.h +++ b/bindings/python/python-complements.h @@ -61,6 +61,9 @@ struct definition_array *_bt_python_get_array_from_def( struct bt_definition *field); struct definition_sequence *_bt_python_get_sequence_from_def( struct bt_definition *field); +struct bt_declaration *_bt_python_get_array_element_declaration( + struct bt_declaration *field); +const char *_bt_python_get_array_string(struct bt_definition *field); /* ctf writer */ int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field); -- 2.34.1