#include "common/assert.h"
#include <inttypes.h>
#include <ctype.h>
+#include <stdbool.h>
#include <string.h>
#include "pretty.h"
#define NSEC_PER_SEC 1000000000LL
-#define COLOR_NAME BT_COMMON_COLOR_BOLD
-#define COLOR_FIELD_NAME BT_COMMON_COLOR_FG_CYAN
-#define COLOR_RST BT_COMMON_COLOR_RESET
-#define COLOR_STRING_VALUE BT_COMMON_COLOR_BOLD
-#define COLOR_NUMBER_VALUE BT_COMMON_COLOR_BOLD
-#define COLOR_ENUM_MAPPING_NAME BT_COMMON_COLOR_BOLD
-#define COLOR_UNKNOWN BT_COMMON_COLOR_BOLD BT_COMMON_COLOR_FG_RED
-#define COLOR_EVENT_NAME BT_COMMON_COLOR_BOLD BT_COMMON_COLOR_FG_MAGENTA
-#define COLOR_TIMESTAMP BT_COMMON_COLOR_BOLD BT_COMMON_COLOR_FG_YELLOW
+static char color_name[32];
+static char color_field_name[32];
+static char color_rst[32];
+static char color_string_value[32];
+static char color_number_value[32];
+static char color_enum_mapping_name[32];
+static char color_unknown[32];
+static char color_event_name[32];
+static char color_timestamp[32];
struct timestamp {
int64_t real_timestamp; /* Relative to UNIX epoch. */
void print_name_equal(struct pretty_component *pretty, const char *name)
{
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_NAME);
+ bt_common_g_string_append(pretty->string, color_name);
bt_common_g_string_append(pretty->string, name);
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
} else {
bt_common_g_string_append(pretty->string, name);
}
void print_field_name_equal(struct pretty_component *pretty, const char *name)
{
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_FIELD_NAME);
+ bt_common_g_string_append(pretty->string, color_field_name);
bt_common_g_string_append(pretty->string, name);
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
} else {
bt_common_g_string_append(pretty->string, name);
}
bt_common_g_string_append(pretty->string, "[");
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_TIMESTAMP);
+ bt_common_g_string_append(pretty->string, color_timestamp);
}
if (pretty->options.print_timestamp_cycles) {
print_timestamp_cycles(pretty, clock_snapshot, true);
print_timestamp_wall(pretty, clock_snapshot, true);
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
if (!print_names)
&log_level);
if (prop_avail == BT_PROPERTY_AVAILABILITY_AVAILABLE) {
log_level_str = log_level_names[log_level];
- BT_ASSERT(log_level_str);
+ BT_ASSERT_DBG(log_level_str);
if (!pretty->start_line) {
bt_common_g_string_append(pretty->string, ", ");
if (pretty->use_colors) {
if (ev_name) {
bt_common_g_string_append(pretty->string,
- COLOR_EVENT_NAME);
+ color_event_name);
} else {
bt_common_g_string_append(pretty->string,
- COLOR_UNKNOWN);
+ color_unknown);
}
}
if (ev_name) {
bt_common_g_string_append(pretty->string, "<unknown>");
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
if (!print_names) {
bt_common_g_string_append(pretty->string, ": ");
bt_field_class_type ft_type;
int_fc = bt_field_borrow_class_const(field);
- BT_ASSERT(int_fc);
+ BT_ASSERT_DBG(int_fc);
ft_type = bt_field_get_class_type(field);
- if (ft_type == BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER ||
- ft_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
+ if (bt_field_class_type_is(ft_type,
+ BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER)) {
v.u = bt_field_integer_unsigned_get_value(field);
} else {
v.s = bt_field_integer_signed_get_value(field);
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_NUMBER_VALUE);
+ bt_common_g_string_append(pretty->string, color_number_value);
rst_color = true;
}
}
case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL:
{
- if (ft_type == BT_FIELD_CLASS_TYPE_SIGNED_INTEGER ||
- ft_type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
+ if (bt_field_class_type_is(ft_type,
+ BT_FIELD_CLASS_TYPE_SIGNED_INTEGER)) {
int len;
len = bt_field_class_integer_get_field_value_range(
if (len < 64) {
size_t rounded_len;
- BT_ASSERT(len != 0);
+ BT_ASSERT_DBG(len != 0);
/* Round length to the nearest 3-bit */
rounded_len = (((len - 1) / 3) + 1) * 3;
v.u &= ((uint64_t) 1 << rounded_len) - 1;
break;
}
case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL:
- if (ft_type == BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER ||
- ft_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
+ if (bt_field_class_type_is(ft_type,
+ BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER)) {
bt_common_g_string_append_printf(pretty->string, "%" PRIu64, v.u);
} else {
bt_common_g_string_append_printf(pretty->string, "%" PRId64, v.s);
}
end:
if (rst_color) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
return ret;
}
&label_array, &label_count);
break;
default:
- abort();
+ bt_common_abort();
}
if (ret) {
bt_common_g_string_append(pretty->string, "( ");
if (label_count == 0) {
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_UNKNOWN);
+ bt_common_g_string_append(pretty->string, color_unknown);
}
bt_common_g_string_append(pretty->string, "<unknown>");
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
goto skip_loop;
}
bt_common_g_string_append(pretty->string, ", ");
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_ENUM_MAPPING_NAME);
+ bt_common_g_string_append(pretty->string, color_enum_mapping_name);
}
print_escape_string(pretty, mapping_name);
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
}
skip_loop:
}
field = bt_field_array_borrow_element_field_by_index_const(array, i);
- BT_ASSERT(field);
+ BT_ASSERT_DBG(field);
return print_field(pretty, field, print_names);
}
}
field = bt_field_array_borrow_element_field_by_index_const(seq, i);
- BT_ASSERT(field);
+ BT_ASSERT_DBG(field);
return print_field(pretty, field, print_names);
}
return ret;
}
+static
+int print_option(struct pretty_component *pretty,
+ const bt_field *option, bool print_names)
+{
+ int ret = 0;
+ const bt_field *field = NULL;
+
+ field = bt_field_option_borrow_field_const(option);
+ if (field) {
+ bt_common_g_string_append(pretty->string, "{ ");
+ pretty->depth++;
+ if (print_names) {
+ // TODO: find tag's name using field path
+ // print_field_name_equal(pretty, tag_choice);
+ }
+ ret = print_field(pretty, field, print_names);
+ if (ret != 0) {
+ goto end;
+ }
+ pretty->depth--;
+ bt_common_g_string_append(pretty->string, " }");
+ } else {
+ bt_common_g_string_append(pretty->string, "<none>");
+ }
+
+end:
+ return ret;
+}
+
static
int print_variant(struct pretty_component *pretty,
const bt_field *variant, bool print_names)
const bt_field *field = NULL;
field = bt_field_variant_borrow_selected_option_field_const(variant);
- BT_ASSERT(field);
+ BT_ASSERT_DBG(field);
bt_common_g_string_append(pretty->string, "{ ");
pretty->depth++;
if (print_names) {
bt_field_class_type class_id;
class_id = bt_field_get_class_type(field);
- switch (class_id) {
- case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
- case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
+ if (class_id == BT_FIELD_CLASS_TYPE_BOOL) {
+ bt_bool v;
+ const char *text;
+
+ v = bt_field_bool_get_value(field);
+ if (pretty->use_colors) {
+ bt_common_g_string_append(pretty->string, color_number_value);
+ }
+ if (v) {
+ text = "true";
+ } else {
+ text = "false";
+ }
+ bt_common_g_string_append(pretty->string, text);
+ if (pretty->use_colors) {
+ bt_common_g_string_append(pretty->string, color_rst);
+ }
+ return 0;
+ } else if (class_id == BT_FIELD_CLASS_TYPE_BIT_ARRAY) {
+ uint64_t v = bt_field_bit_array_get_value_as_integer(field);
+
+ if (pretty->use_colors) {
+ bt_common_g_string_append(pretty->string,
+ color_number_value);
+ }
+ bt_common_g_string_append_printf(pretty->string, "0x%" PRIX64,
+ v);
+ if (pretty->use_colors) {
+ bt_common_g_string_append(pretty->string, color_rst);
+ }
+ return 0;
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_ENUMERATION)) {
+ return print_enum(pretty, field);
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_INTEGER)) {
return print_integer(pretty, field);
- case BT_FIELD_CLASS_TYPE_REAL:
- {
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_REAL)) {
double v;
- v = bt_field_real_get_value(field);
+ if (class_id == BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL) {
+ v = bt_field_real_single_precision_get_value(field);
+ } else {
+ v = bt_field_real_double_precision_get_value(field);
+ }
+
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_NUMBER_VALUE);
+ bt_common_g_string_append(pretty->string, color_number_value);
}
bt_common_g_string_append_printf(pretty->string, "%g", v);
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
return 0;
- }
- case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
- case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION:
- return print_enum(pretty, field);
- case BT_FIELD_CLASS_TYPE_STRING:
- {
+ } else if (class_id == BT_FIELD_CLASS_TYPE_STRING) {
const char *str;
str = bt_field_string_get_value(field);
}
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_STRING_VALUE);
+ bt_common_g_string_append(pretty->string, color_string_value);
}
print_escape_string(pretty, str);
if (pretty->use_colors) {
- bt_common_g_string_append(pretty->string, COLOR_RST);
+ bt_common_g_string_append(pretty->string, color_rst);
}
return 0;
- }
- case BT_FIELD_CLASS_TYPE_STRUCTURE:
+ } else if (class_id == BT_FIELD_CLASS_TYPE_STRUCTURE) {
return print_struct(pretty, field, print_names);
- case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR:
- case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR:
- case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR:
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_OPTION)) {
+ return print_option(pretty, field, print_names);
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_VARIANT)) {
return print_variant(pretty, field, print_names);
- case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
+ } else if (class_id == BT_FIELD_CLASS_TYPE_STATIC_ARRAY) {
return print_array(pretty, field, print_names);
- case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY:
+ } else if (bt_field_class_type_is(class_id,
+ BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY)) {
return print_sequence(pretty, field, print_names);
- default:
+ } else {
// TODO: log instead
fprintf(pretty->err, "[error] Unknown type id: %d\n", (int) class_id);
return -1;
const bt_event *event =
bt_message_event_borrow_event_const(event_msg);
- BT_ASSERT(event);
+ BT_ASSERT_DBG(event);
pretty->start_line = true;
g_string_assign(pretty->string, "");
ret = print_event_header(pretty, event_msg);
elem_type = "packet";
break;
default:
- abort();
+ bt_common_abort();
}
BT_ASSERT(stream);
break;
default:
- abort();
+ bt_common_abort();
}
print_discarded_elements_msg(pretty, stream, begin, end,
count, elem_type);
return 0;
}
+
+BT_HIDDEN
+void pretty_print_init(void)
+{
+ strcpy(color_name, bt_common_color_bold());
+ strcpy(color_field_name, bt_common_color_fg_cyan());
+ strcpy(color_rst, bt_common_color_reset());
+ strcpy(color_string_value, bt_common_color_bold());
+ strcpy(color_number_value, bt_common_color_bold());
+ strcpy(color_enum_mapping_name, bt_common_color_bold());
+ strcpy(color_unknown, bt_common_color_bold());
+ strcat(color_unknown, bt_common_color_fg_bright_red());
+ strcpy(color_event_name, bt_common_color_bold());
+ strcat(color_event_name, bt_common_color_fg_bright_magenta());
+ strcpy(color_timestamp, bt_common_color_bold());
+ strcat(color_timestamp, bt_common_color_fg_bright_yellow());
+}