From 164078da31b3612e3618e8e8046a3866cb22f80e Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 13 May 2011 19:35:43 -0400 Subject: [PATCH] Add base integer attribute, and use it in ctf-text Signed-off-by: Mathieu Desnoyers --- formats/ctf-text/types/integer.c | 45 +++++++++++---- .../metadata/ctf-visitor-generate-io-struct.c | 53 +++++++++++++++++- include/babeltrace/types.h | 4 +- tests/ctf-traces/fail/fail1/dummystream | Bin 16384 -> 16384 bytes tests/ctf-traces/fail/fail1/metadata | 4 +- tests/ctf-traces/succeed/succeed2/metadata | 4 +- types/float.c | 6 +- types/integer.c | 3 +- 8 files changed, 97 insertions(+), 22 deletions(-) diff --git a/formats/ctf-text/types/integer.c b/formats/ctf-text/types/integer.c index 8b2df2c0..a0128458 100644 --- a/formats/ctf-text/types/integer.c +++ b/formats/ctf-text/types/integer.c @@ -39,20 +39,41 @@ int ctf_text_integer_write(struct stream_pos *ppos, struct definition *definitio fprintf(pos->fp, "%s = ", g_quark_to_string(definition->name)); - if (!compare_definition_path(definition, g_quark_from_static_string("stream.event.header.timestamp"))) { - fprintf(pos->fp, "%" PRIu64, - integer_definition->value._unsigned); - return 0; - } + switch (integer_declaration->base) { + case 2: + { + int bitnr; + uint64_t v = integer_definition->value._unsigned; - if (!integer_declaration->signedness) { - fprintf(pos->fp, "%" PRIu64" (0x%" PRIX64 ")", - integer_definition->value._unsigned, + fprintf(pos->fp, "b"); + for (bitnr = 0; bitnr < integer_declaration->len; bitnr++) + v <<= 1; + for (; bitnr < sizeof(v) * CHAR_BIT; bitnr++) { + fprintf(pos->fp, "%u", ((v & 1ULL) << 63) ? 1 : 0); + v <<= 1; + } + break; + } + case 8: + fprintf(pos->fp, "0%" PRIo64, + integer_definition->value._unsigned); + break; + case 10: + if (!integer_declaration->signedness) { + fprintf(pos->fp, "%" PRIu64, + integer_definition->value._unsigned); + } else { + fprintf(pos->fp, "%" PRId64, + integer_definition->value._signed); + } + break; + case 16: + fprintf(pos->fp, "0x%" PRIX64, integer_definition->value._unsigned); - } else { - fprintf(pos->fp, "%" PRId64" (0x%" PRIX64 ")", - integer_definition->value._signed, - integer_definition->value._signed); + break; + default: + return -EINVAL; } + return 0; } diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 23734284..de760ca0 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -1069,6 +1069,7 @@ struct declaration *ctf_declaration_integer_visit(FILE *fd, int depth, int byte_order = trace->byte_order; int signedness = 0; int has_alignment = 0, has_size = 0; + int base = 10; struct declaration_integer *integer_declaration; cds_list_for_each_entry(expression, expressions, siblings) { @@ -1107,6 +1108,56 @@ struct declaration *ctf_declaration_integer_visit(FILE *fd, int depth, return NULL; } has_alignment = 1; + } else if (!strcmp(left->u.unary_expression.u.string, "base")) { + switch (right->u.unary_expression.type) { + case UNARY_UNSIGNED_CONSTANT: + switch (right->u.unary_expression.u.unsigned_constant) { + case 2: + case 8: + case 10: + case 16: + base = right->u.unary_expression.u.unsigned_constant; + break; + default: + fprintf(fd, "[error] %s: base not supported (%" PRIu64 ")\n", + __func__, right->u.unary_expression.u.unsigned_constant); + return NULL; + } + break; + case UNARY_STRING: + { + char *s_right = concatenate_unary_strings(&expression->u.ctf_expression.right); + if (!s_right) { + fprintf(fd, "[error] %s: unexpected unary expression for integer base\n", __func__); + g_free(s_right); + return NULL; + } + if (!strcmp(s_right, "decimal") || !strcmp(s_right, "dec") || !strcmp(s_right, "d") + || !strcmp(s_right, "i") || !strcmp(s_right, "u")) { + base = 10; + } else if (!strcmp(s_right, "hexadecimal") || !strcmp(s_right, "hex") + || !strcmp(s_right, "x") || !strcmp(s_right, "X") + || !strcmp(s_right, "p")) { + base = 16; + } else if (!strcmp(s_right, "octal") || !strcmp(s_right, "oct") + || !strcmp(s_right, "o")) { + base = 8; + } else if (!strcmp(s_right, "binary") || !strcmp(s_right, "b")) { + base = 2; + } else { + fprintf(fd, "[error] %s: unexpected expression for integer base (%s)\n", __func__, s_right); + g_free(s_right); + return NULL; + } + + g_free(s_right); + break; + } + default: + fprintf(fd, "[error] %s: base: expecting unsigned constant or unary string\n", + __func__); + return NULL; + } } else { fprintf(fd, "[error] %s: unknown attribute name %s\n", __func__, left->u.unary_expression.u.string); @@ -1127,7 +1178,7 @@ struct declaration *ctf_declaration_integer_visit(FILE *fd, int depth, } } integer_declaration = integer_declaration_new(size, - byte_order, signedness, alignment); + byte_order, signedness, alignment, base); return &integer_declaration->p; } diff --git a/include/babeltrace/types.h b/include/babeltrace/types.h index a4dcdee9..33311a68 100644 --- a/include/babeltrace/types.h +++ b/include/babeltrace/types.h @@ -138,6 +138,7 @@ struct declaration_integer { size_t len; /* length, in bits. */ int byte_order; /* byte order */ int signedness; + int base; /* Base for pretty-printing: 2, 8, 10, 16 */ }; struct definition_integer { @@ -378,7 +379,8 @@ void definition_ref(struct definition *definition); void definition_unref(struct definition *definition); struct declaration_integer *integer_declaration_new(size_t len, int byte_order, - int signedness, size_t alignment); + int signedness, size_t alignment, + int base); /* * mantissa_len is the length of the number of bytes represented by the mantissa diff --git a/tests/ctf-traces/fail/fail1/dummystream b/tests/ctf-traces/fail/fail1/dummystream index 87d8c06d2c82b37646e9f50941b28bcd985cb05c..26010671613e67c00fcd3c4c8de8e216834a637f 100644 GIT binary patch delta 35 ocmZo@U~Fh$oNz}($Rw;{6%gzOf-`6C-hKD~-T#e>{Pv8A06mEk*#H0l delta 17 YcmZo@U~Fh$oN#9obyte_order = byte_order; float_declaration->sign = integer_declaration_new(1, - byte_order, false, 1); + byte_order, false, 1, 2); float_declaration->mantissa = integer_declaration_new(mantissa_len - 1, - byte_order, false, 1); + byte_order, false, 1, 10); float_declaration->exp = integer_declaration_new(exp_len, - byte_order, true, 1); + byte_order, true, 1, 10); return float_declaration; } diff --git a/types/integer.c b/types/integer.c index 5aa9c44f..059c6d89 100644 --- a/types/integer.c +++ b/types/integer.c @@ -38,7 +38,7 @@ void _integer_declaration_free(struct declaration *declaration) struct declaration_integer * integer_declaration_new(size_t len, int byte_order, - int signedness, size_t alignment) + int signedness, size_t alignment, int base) { struct declaration_integer *integer_declaration; @@ -52,6 +52,7 @@ struct declaration_integer * integer_declaration->len = len; integer_declaration->byte_order = byte_order; integer_declaration->signedness = signedness; + integer_declaration->base = base; return integer_declaration; } -- 2.34.1