X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Ftext%2Fpretty%2Fprint.c;h=a9e6104d667ff84437fafbab9ec310da1a7b6d97;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hp=3615cfd07ecf1597a5c406f6b66f66fd467ca885;hpb=7b4717447467c0767abebe2d8ed359f733c8abbe;p=babeltrace.git diff --git a/plugins/text/pretty/print.c b/plugins/text/pretty/print.c index 3615cfd0..a9e6104d 100644 --- a/plugins/text/pretty/print.c +++ b/plugins/text/pretty/print.c @@ -27,43 +27,26 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include #include +#include +#include #include #include #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 inline -const char *rem_(const char *str) -{ - if (str[0] == '_') - return &str[1]; - else - return str; -} +#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 struct timestamp { int64_t real_timestamp; /* Relative to UNIX epoch. */ @@ -72,16 +55,17 @@ struct timestamp { static enum bt_component_status print_field(struct pretty_component *pretty, - struct bt_ctf_field *field, bool print_names, + struct bt_field *field, bool print_names, GQuark *filters_fields, int filter_array_len); static void print_name_equal(struct pretty_component *pretty, const char *name) { if (pretty->use_colors) { - fprintf(pretty->out, "%s%s%s = ", COLOR_NAME, name, COLOR_RST); + g_string_append_printf(pretty->string, "%s%s%s = ", COLOR_NAME, + name, COLOR_RST); } else { - fprintf(pretty->out, "%s = ", name); + g_string_append_printf(pretty->string, "%s = ", name); } } @@ -89,35 +73,36 @@ static void print_field_name_equal(struct pretty_component *pretty, const char *name) { if (pretty->use_colors) { - fprintf(pretty->out, "%s%s%s = ", COLOR_FIELD_NAME, name, - COLOR_RST); + g_string_append_printf(pretty->string, "%s%s%s = ", + COLOR_FIELD_NAME, name, COLOR_RST); } else { - fprintf(pretty->out, "%s = ", name); + g_string_append_printf(pretty->string, "%s = ", name); } } static void print_timestamp_cycles(struct pretty_component *pretty, - struct bt_ctf_clock_class *clock_class, - struct bt_ctf_event *event) + struct bt_clock_class *clock_class, + struct bt_event *event) { int ret; - struct bt_ctf_clock_value *clock_value; + struct bt_clock_value *clock_value; uint64_t cycles; - clock_value = bt_ctf_event_get_clock_value(event, clock_class); + clock_value = bt_event_borrow_clock_value(event, clock_class); if (!clock_value) { - fputs("????????????????????", pretty->out); + g_string_append(pretty->string, "????????????????????"); return; } - ret = bt_ctf_clock_value_get_value(clock_value, &cycles); - bt_put(clock_value); + ret = bt_clock_value_get_value(clock_value, &cycles); if (ret) { - fprintf(pretty->out, "Error"); + // TODO: log, this is unexpected + g_string_append(pretty->string, "Error"); return; } - fprintf(pretty->out, "%020" PRIu64, cycles); + + g_string_append_printf(pretty->string, "%020" PRIu64, cycles); if (pretty->last_cycles_timestamp != -1ULL) { pretty->delta_cycles = cycles - pretty->last_cycles_timestamp; @@ -127,36 +112,34 @@ void print_timestamp_cycles(struct pretty_component *pretty, static void print_timestamp_wall(struct pretty_component *pretty, - struct bt_ctf_clock_class *clock_class, - struct bt_ctf_event *event) + struct bt_clock_value *clock_value) { int ret; - struct bt_ctf_clock_value *clock_value; int64_t ts_nsec = 0; /* add configurable offset */ int64_t ts_sec = 0; /* add configurable offset */ uint64_t ts_sec_abs, ts_nsec_abs; bool is_negative; - clock_value = bt_ctf_event_get_clock_value(event, clock_class); if (!clock_value) { - fputs("??:??:??.?????????", pretty->out); + g_string_append(pretty->string, "??:??:??.?????????"); return; } - ret = bt_ctf_clock_value_get_value_ns_from_epoch(clock_value, &ts_nsec); - bt_put(clock_value); + ret = bt_clock_value_get_value_ns_from_epoch(clock_value, &ts_nsec); if (ret) { - fprintf(pretty->out, "Error"); + // TODO: log, this is unexpected + g_string_append(pretty->string, "Error"); return; } if (pretty->last_real_timestamp != -1ULL) { pretty->delta_real_timestamp = ts_nsec - pretty->last_real_timestamp; } - pretty->last_real_timestamp = ts_nsec; + pretty->last_real_timestamp = ts_nsec; ts_sec += ts_nsec / NSEC_PER_SEC; ts_nsec = ts_nsec % NSEC_PER_SEC; + if (ts_sec >= 0 && ts_nsec >= 0) { is_negative = false; ts_sec_abs = ts_sec; @@ -187,24 +170,28 @@ void print_timestamp_wall(struct pretty_component *pretty, struct tm tm; time_t time_s = (time_t) ts_sec_abs; - if (is_negative) { + if (is_negative && !pretty->negative_timestamp_warning_done) { + // TODO: log instead fprintf(stderr, "[warning] Fallback to [sec.ns] to print negative time value. Use --clock-seconds.\n"); + pretty->negative_timestamp_warning_done = true; goto seconds; } if (!pretty->options.clock_gmt) { struct tm *res; - res = localtime_r(&time_s, &tm); + res = bt_localtime_r(&time_s, &tm); if (!res) { + // TODO: log instead fprintf(stderr, "[warning] Unable to get localtime.\n"); goto seconds; } } else { struct tm *res; - res = gmtime_r(&time_s, &tm); + res = bt_gmtime_r(&time_s, &tm); if (!res) { + // TODO: log instead fprintf(stderr, "[warning] Unable to get gmtime.\n"); goto seconds; } @@ -215,51 +202,54 @@ void print_timestamp_wall(struct pretty_component *pretty, /* Print date and time */ res = strftime(timestr, sizeof(timestr), - "%F ", &tm); + "%Y-%m-%d ", &tm); if (!res) { + // TODO: log instead fprintf(stderr, "[warning] Unable to print ascii time.\n"); goto seconds; } - fprintf(pretty->out, "%s", timestr); + + g_string_append(pretty->string, timestr); } + /* Print time in HH:MM:SS.ns */ - fprintf(pretty->out, "%02d:%02d:%02d.%09" PRIu64, - tm.tm_hour, tm.tm_min, tm.tm_sec, ts_nsec_abs); + g_string_append_printf(pretty->string, + "%02d:%02d:%02d.%09" PRIu64, tm.tm_hour, tm.tm_min, + tm.tm_sec, ts_nsec_abs); goto end; } seconds: - fprintf(pretty->out, "%s%" PRId64 ".%09" PRIu64, - is_negative ? "-" : "", ts_sec_abs, ts_nsec_abs); + g_string_append_printf(pretty->string, "%s%" PRId64 ".%09" PRIu64, + is_negative ? "-" : "", ts_sec_abs, ts_nsec_abs); end: return; } static enum bt_component_status print_event_timestamp(struct pretty_component *pretty, - struct bt_ctf_event *event, + struct bt_event *event, struct bt_clock_class_priority_map *cc_prio_map, bool *start_line) { bool print_names = pretty->options.print_header_field_names; enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_stream *stream = NULL; - struct bt_ctf_stream_class *stream_class = NULL; - struct bt_ctf_trace *trace = NULL; - struct bt_ctf_clock_class *clock_class = NULL; - FILE *out = pretty->out; + struct bt_stream *stream = NULL; + struct bt_stream_class *stream_class = NULL; + struct bt_trace *trace = NULL; + struct bt_clock_class *clock_class = NULL; - stream = bt_ctf_event_get_stream(event); + stream = bt_event_borrow_stream(event); if (!stream) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - stream_class = bt_ctf_stream_get_class(stream); + stream_class = bt_stream_borrow_class(stream); if (!stream_class) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - trace = bt_ctf_stream_class_get_trace(stream_class); + trace = bt_stream_class_borrow_trace(stream_class); if (!trace) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -271,7 +261,7 @@ enum bt_component_status print_event_timestamp(struct pretty_component *pretty, } clock_class = - bt_clock_class_priority_map_get_highest_priority_clock_class( + bt_clock_class_priority_map_borrow_highest_priority_clock_class( cc_prio_map); if (!clock_class) { ret = BT_COMPONENT_STATUS_ERROR; @@ -281,35 +271,40 @@ enum bt_component_status print_event_timestamp(struct pretty_component *pretty, if (print_names) { print_name_equal(pretty, "timestamp"); } else { - fputs("[", out); + g_string_append(pretty->string, "["); } if (pretty->use_colors) { - fputs(COLOR_TIMESTAMP, pretty->out); + g_string_append(pretty->string, COLOR_TIMESTAMP); } if (pretty->options.print_timestamp_cycles) { print_timestamp_cycles(pretty, clock_class, event); } else { - print_timestamp_wall(pretty, clock_class, event); + struct bt_clock_value *clock_value = + bt_event_borrow_clock_value(event, clock_class); + + print_timestamp_wall(pretty, clock_value); } if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } if (!print_names) - fputs("] ", out); + g_string_append(pretty->string, "] "); if (pretty->options.print_delta_field) { if (print_names) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); print_name_equal(pretty, "delta"); } else { - fputs("(", pretty->out); + g_string_append(pretty->string, "("); } if (pretty->options.print_timestamp_cycles) { if (pretty->delta_cycles == -1ULL) { - fputs("+??????????\?\?) ", pretty->out); /* Not a trigraph. */ + g_string_append(pretty->string, + "+??????????\?\?) "); /* Not a trigraph. */ } else { - fprintf(pretty->out, "+%012" PRIu64, pretty->delta_cycles); + g_string_append_printf(pretty->string, + "+%012" PRIu64, pretty->delta_cycles); } } else { if (pretty->delta_real_timestamp != -1ULL) { @@ -318,49 +313,46 @@ enum bt_component_status print_event_timestamp(struct pretty_component *pretty, delta = pretty->delta_real_timestamp; delta_sec = delta / NSEC_PER_SEC; delta_nsec = delta % NSEC_PER_SEC; - fprintf(pretty->out, "+%" PRIu64 ".%09" PRIu64, + g_string_append_printf(pretty->string, + "+%" PRIu64 ".%09" PRIu64, delta_sec, delta_nsec); } else { - fputs("+?.?????????", pretty->out); + g_string_append(pretty->string, "+?.?????????"); } } if (!print_names) { - fputs(") ", pretty->out); + g_string_append(pretty->string, ") "); } } *start_line = !print_names; end: - bt_put(stream); - bt_put(clock_class); - bt_put(stream_class); - bt_put(trace); return ret; } static enum bt_component_status print_event_header(struct pretty_component *pretty, - struct bt_ctf_event *event, + struct bt_event *event, struct bt_clock_class_priority_map *cc_prio_map) { bool print_names = pretty->options.print_header_field_names; enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_event_class *event_class = NULL; - struct bt_ctf_stream_class *stream_class = NULL; - struct bt_ctf_trace *trace_class = NULL; + struct bt_event_class *event_class = NULL; + struct bt_stream_class *stream_class = NULL; + struct bt_trace *trace_class = NULL; int dom_print = 0; - event_class = bt_ctf_event_get_class(event); + event_class = bt_event_borrow_class(event); if (!event_class) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - stream_class = bt_ctf_event_class_get_stream_class(event_class); + stream_class = bt_event_class_borrow_stream_class(event_class); if (!stream_class) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - trace_class = bt_ctf_stream_class_get_trace(stream_class); + trace_class = bt_stream_class_borrow_trace(stream_class); if (!trace_class) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -373,255 +365,263 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, if (pretty->options.print_trace_field) { const char *name; - name = bt_ctf_trace_get_name(trace_class); + name = bt_trace_get_name(trace_class); if (name) { if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "trace"); } - fprintf(pretty->out, "%s", name); + + g_string_append(pretty->string, name); + if (!print_names) { - fprintf(pretty->out, " "); + g_string_append(pretty->string, " "); } } } if (pretty->options.print_trace_hostname_field) { struct bt_value *hostname_str; - hostname_str = bt_ctf_trace_get_environment_field_value_by_name(trace_class, - "hostname"); + hostname_str = bt_trace_borrow_environment_field_value_by_name( + trace_class, "hostname"); if (hostname_str) { const char *str; if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "trace:hostname"); } if (bt_value_string_get(hostname_str, &str) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); + g_string_append(pretty->string, str); } - bt_put(hostname_str); dom_print = 1; } } if (pretty->options.print_trace_domain_field) { struct bt_value *domain_str; - domain_str = bt_ctf_trace_get_environment_field_value_by_name(trace_class, - "domain"); + domain_str = bt_trace_borrow_environment_field_value_by_name( + trace_class, "domain"); if (domain_str) { const char *str; if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "trace:domain"); } else if (dom_print) { - fputs(":", pretty->out); + g_string_append(pretty->string, ":"); } if (bt_value_string_get(domain_str, &str) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); + g_string_append(pretty->string, str); } - bt_put(domain_str); dom_print = 1; } } if (pretty->options.print_trace_procname_field) { struct bt_value *procname_str; - procname_str = bt_ctf_trace_get_environment_field_value_by_name(trace_class, - "procname"); + procname_str = bt_trace_borrow_environment_field_value_by_name( + trace_class, "procname"); if (procname_str) { const char *str; if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "trace:procname"); } else if (dom_print) { - fputs(":", pretty->out); + g_string_append(pretty->string, ":"); } if (bt_value_string_get(procname_str, &str) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); + g_string_append(pretty->string, str); } - bt_put(procname_str); + dom_print = 1; } } if (pretty->options.print_trace_vpid_field) { struct bt_value *vpid_value; - vpid_value = bt_ctf_trace_get_environment_field_value_by_name(trace_class, - "vpid"); + vpid_value = bt_trace_borrow_environment_field_value_by_name( + trace_class, "vpid"); if (vpid_value) { int64_t value; if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "trace:vpid"); } else if (dom_print) { - fputs(":", pretty->out); + g_string_append(pretty->string, ":"); } if (bt_value_integer_get(vpid_value, &value) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "(%" PRId64 ")", value); + g_string_append_printf(pretty->string, "(%" PRId64 ")", value); } - bt_put(vpid_value); + dom_print = 1; } } if (pretty->options.print_loglevel_field) { - struct bt_value *loglevel_str, *loglevel_value; - - loglevel_str = bt_ctf_event_class_get_attribute_value_by_name(event_class, - "loglevel_string"); - loglevel_value = bt_ctf_event_class_get_attribute_value_by_name(event_class, - "loglevel"); - if (loglevel_str || loglevel_value) { - bool has_str = false; + static const char *log_level_names[] = { + [ BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY ] = "TRACE_EMERG", + [ BT_EVENT_CLASS_LOG_LEVEL_ALERT ] = "TRACE_ALERT", + [ BT_EVENT_CLASS_LOG_LEVEL_CRITICAL ] = "TRACE_CRIT", + [ BT_EVENT_CLASS_LOG_LEVEL_ERROR ] = "TRACE_ERR", + [ BT_EVENT_CLASS_LOG_LEVEL_WARNING ] = "TRACE_WARNING", + [ BT_EVENT_CLASS_LOG_LEVEL_NOTICE ] = "TRACE_NOTICE", + [ BT_EVENT_CLASS_LOG_LEVEL_INFO ] = "TRACE_INFO", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM ] = "TRACE_DEBUG_SYSTEM", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM ] = "TRACE_DEBUG_PROGRAM", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS ] = "TRACE_DEBUG_PROCESS", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE ] = "TRACE_DEBUG_MODULE", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT ] = "TRACE_DEBUG_UNIT", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION ] = "TRACE_DEBUG_FUNCTION", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE ] = "TRACE_DEBUG_LINE", + [ BT_EVENT_CLASS_LOG_LEVEL_DEBUG ] = "TRACE_DEBUG", + }; + enum bt_event_class_log_level log_level; + const char *log_level_str = NULL; + + log_level = bt_event_class_get_log_level(event_class); + BT_ASSERT(log_level != BT_EVENT_CLASS_LOG_LEVEL_UNKNOWN); + if (log_level != BT_EVENT_CLASS_LOG_LEVEL_UNSPECIFIED) { + log_level_str = log_level_names[log_level]; + } + if (log_level_str) { if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "loglevel"); } else if (dom_print) { - fputs(":", pretty->out); - } - if (loglevel_str) { - const char *str; - - if (bt_value_string_get(loglevel_str, &str) - == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); - has_str = true; - } - } - if (loglevel_value) { - int64_t value; - - if (bt_value_integer_get(loglevel_value, &value) - == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s(%" PRId64 ")", - has_str ? " " : "", value); - } + g_string_append(pretty->string, ":"); } - bt_put(loglevel_str); - bt_put(loglevel_value); + + g_string_append(pretty->string, log_level_str); + g_string_append_printf( + pretty->string, " (%d)", (int) log_level); dom_print = 1; } } if (pretty->options.print_emf_field) { - struct bt_value *uri_str; + const char *uri_str; - uri_str = bt_ctf_event_class_get_attribute_value_by_name(event_class, - "model.emf.uri"); + uri_str = bt_event_class_get_emf_uri(event_class); if (uri_str) { if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } if (print_names) { print_name_equal(pretty, "model.emf.uri"); } else if (dom_print) { - fputs(":", pretty->out); + g_string_append(pretty->string, ":"); } - if (uri_str) { - const char *str; - if (bt_value_string_get(uri_str, &str) - == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); - } - } - bt_put(uri_str); + g_string_append(pretty->string, uri_str); dom_print = 1; } } if (dom_print && !print_names) { - fputs(" ", pretty->out); + g_string_append(pretty->string, " "); } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = true; if (print_names) { print_name_equal(pretty, "name"); } if (pretty->use_colors) { - fputs(COLOR_EVENT_NAME, pretty->out); + g_string_append(pretty->string, COLOR_EVENT_NAME); } - fputs(bt_ctf_event_class_get_name(event_class), pretty->out); + g_string_append(pretty->string, bt_event_class_get_name(event_class)); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } if (!print_names) { - fputs(": ", pretty->out); + g_string_append(pretty->string, ": "); } else { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } + end: - bt_put(trace_class); - bt_put(stream_class); - bt_put(event_class); return ret; } static enum bt_component_status print_integer(struct pretty_component *pretty, - struct bt_ctf_field *field) + struct bt_field *field) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field_type *field_type = NULL; - enum bt_ctf_integer_base base; - enum bt_ctf_string_encoding encoding; + struct bt_field_type *field_type = NULL; + enum bt_integer_base base; + enum bt_string_encoding encoding; int signedness; + struct bt_field_type *int_ft; union { uint64_t u; int64_t s; } v; bool rst_color = false; + enum bt_field_type_id ft_id; - field_type = bt_ctf_field_get_type(field); + field_type = bt_field_borrow_type(field); if (!field_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - signedness = bt_ctf_field_type_integer_get_signed(field_type); + + ft_id = bt_field_get_type_id(field); + + switch (ft_id) { + case BT_FIELD_TYPE_ID_INTEGER: + int_ft = field_type; + break; + case BT_FIELD_TYPE_ID_ENUM: + int_ft = bt_field_type_enumeration_borrow_container_field_type( + field_type); + break; + default: + abort(); + } + + signedness = bt_field_type_integer_is_signed(int_ft); if (signedness < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (!signedness) { - if (bt_ctf_field_unsigned_integer_get_value(field, &v.u) < 0) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } + ret = bt_field_integer_unsigned_get_value(field, &v.u); } else { - if (bt_ctf_field_signed_integer_get_value(field, &v.s) < 0) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } + ret = bt_field_integer_signed_get_value(field, &v.s); } - encoding = bt_ctf_field_type_integer_get_encoding(field_type); + if (ret < 0) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + encoding = bt_field_type_integer_get_encoding(int_ft); switch (encoding) { - case BT_CTF_STRING_ENCODING_UTF8: - case BT_CTF_STRING_ENCODING_ASCII: - g_string_append_c(pretty->string, (int) v.u); + case BT_STRING_ENCODING_UTF8: + case BT_STRING_ENCODING_ASCII: + g_string_append_c(pretty->tmp_string, (int) v.u); goto end; - case BT_CTF_STRING_ENCODING_NONE: - case BT_CTF_STRING_ENCODING_UNKNOWN: + case BT_STRING_ENCODING_NONE: + case BT_STRING_ENCODING_UNKNOWN: break; default: ret = BT_COMPONENT_STATUS_ERROR; @@ -629,35 +629,35 @@ enum bt_component_status print_integer(struct pretty_component *pretty, } if (pretty->use_colors) { - fputs(COLOR_NUMBER_VALUE, pretty->out); + g_string_append(pretty->string, COLOR_NUMBER_VALUE); rst_color = true; } - base = bt_ctf_field_type_integer_get_base(field_type); + base = bt_field_type_integer_get_base(int_ft); switch (base) { - case BT_CTF_INTEGER_BASE_BINARY: + case BT_INTEGER_BASE_BINARY: { int bitnr, len; - len = bt_ctf_field_type_integer_get_size(field_type); + len = bt_field_type_integer_get_size(int_ft); if (len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - fprintf(pretty->out, "0b"); + g_string_append(pretty->string, "0b"); v.u = _bt_piecewise_lshift(v.u, 64 - len); for (bitnr = 0; bitnr < len; bitnr++) { - fprintf(pretty->out, "%u", (v.u & (1ULL << 63)) ? 1 : 0); + g_string_append_printf(pretty->string, "%u", (v.u & (1ULL << 63)) ? 1 : 0); v.u = _bt_piecewise_lshift(v.u, 1); } break; } - case BT_CTF_INTEGER_BASE_OCTAL: + case BT_INTEGER_BASE_OCTAL: { if (signedness) { int len; - len = bt_ctf_field_type_integer_get_size(field_type); + len = bt_field_type_integer_get_size(int_ft); if (len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -665,28 +665,29 @@ enum bt_component_status print_integer(struct pretty_component *pretty, if (len < 64) { size_t rounded_len; - assert(len != 0); + BT_ASSERT(len != 0); /* Round length to the nearest 3-bit */ rounded_len = (((len - 1) / 3) + 1) * 3; v.u &= ((uint64_t) 1 << rounded_len) - 1; } } - fprintf(pretty->out, "0%" PRIo64, v.u); + g_string_append_printf(pretty->string, "0%" PRIo64, v.u); break; } - case BT_CTF_INTEGER_BASE_DECIMAL: + case BT_INTEGER_BASE_DECIMAL: + case BT_INTEGER_BASE_UNSPECIFIED: if (!signedness) { - fprintf(pretty->out, "%" PRIu64, v.u); + g_string_append_printf(pretty->string, "%" PRIu64, v.u); } else { - fprintf(pretty->out, "%" PRId64, v.s); + g_string_append_printf(pretty->string, "%" PRId64, v.s); } break; - case BT_CTF_INTEGER_BASE_HEXADECIMAL: + case BT_INTEGER_BASE_HEXADECIMAL: { int len; - len = bt_ctf_field_type_integer_get_size(field_type); + len = bt_field_type_integer_get_size(int_ft); if (len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -698,7 +699,7 @@ enum bt_component_status print_integer(struct pretty_component *pretty, v.u &= ((uint64_t) 1 << rounded_len) - 1; } - fprintf(pretty->out, "0x%" PRIX64, v.u); + g_string_append_printf(pretty->string, "0x%" PRIX64, v.u); break; } default: @@ -707,9 +708,8 @@ enum bt_component_status print_integer(struct pretty_component *pretty, } end: if (rst_color) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } - bt_put(field_type); return ret; } @@ -718,166 +718,138 @@ void print_escape_string(struct pretty_component *pretty, const char *str) { int i; - fputc('"', pretty->out); + g_string_append_c(pretty->string, '"'); + for (i = 0; i < strlen(str); i++) { /* Escape sequences not recognized by iscntrl(). */ switch (str[i]) { case '\\': - fputs("\\\\", pretty->out); + g_string_append(pretty->string, "\\\\"); continue; case '\'': - fputs("\\\'", pretty->out); + g_string_append(pretty->string, "\\\'"); continue; case '\"': - fputs("\\\"", pretty->out); + g_string_append(pretty->string, "\\\""); continue; case '\?': - fputs("\\\?", pretty->out); + g_string_append(pretty->string, "\\\?"); continue; } /* Standard characters. */ if (!iscntrl(str[i])) { - fputc(str[i], pretty->out); + g_string_append_c(pretty->string, str[i]); continue; } switch (str[i]) { case '\0': - fputs("\\0", pretty->out); + g_string_append(pretty->string, "\\0"); break; case '\a': - fputs("\\a", pretty->out); + g_string_append(pretty->string, "\\a"); break; case '\b': - fputs("\\b", pretty->out); + g_string_append(pretty->string, "\\b"); break; case '\e': - fputs("\\e", pretty->out); + g_string_append(pretty->string, "\\e"); break; case '\f': - fputs("\\f", pretty->out); + g_string_append(pretty->string, "\\f"); break; case '\n': - fputs("\\n", pretty->out); + g_string_append(pretty->string, "\\n"); break; case '\r': - fputs("\\r", pretty->out); + g_string_append(pretty->string, "\\r"); break; case '\t': - fputs("\\t", pretty->out); + g_string_append(pretty->string, "\\t"); break; case '\v': - fputs("\\v", pretty->out); + g_string_append(pretty->string, "\\v"); break; default: /* Unhandled control-sequence, print as hex. */ - fprintf(pretty->out, "\\x%02x", str[i]); + g_string_append_printf(pretty->string, "\\x%02x", str[i]); break; } } - fputc('"', pretty->out); + + g_string_append_c(pretty->string, '"'); } static enum bt_component_status print_enum(struct pretty_component *pretty, - struct bt_ctf_field *field) + struct bt_field *field) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *container_field = NULL; - struct bt_ctf_field_type *enumeration_field_type = NULL; - struct bt_ctf_field_type *container_field_type = NULL; - struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL; + struct bt_field_type *enumeration_field_type = NULL; + struct bt_field_type *container_field_type = NULL; + struct bt_field_type_enumeration_mapping_iterator *iter = NULL; int nr_mappings = 0; - int is_signed; - enumeration_field_type = bt_ctf_field_get_type(field); + enumeration_field_type = bt_field_borrow_type(field); if (!enumeration_field_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - container_field = bt_ctf_field_enumeration_get_container(field); - if (!container_field) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } - container_field_type = bt_ctf_field_get_type(container_field); + container_field_type = + bt_field_type_enumeration_borrow_container_field_type( + enumeration_field_type); if (!container_field_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - is_signed = bt_ctf_field_type_integer_get_signed(container_field_type); - if (is_signed < 0) { + iter = bt_field_enumeration_get_mappings(field); + if (!iter) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - if (is_signed) { - int64_t value; - - if (bt_ctf_field_signed_integer_get_value(container_field, - &value)) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; + g_string_append(pretty->string, "( "); + ret = bt_field_type_enumeration_mapping_iterator_next(iter); + if (ret) { + if (pretty->use_colors) { + g_string_append(pretty->string, COLOR_UNKNOWN); } - iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value( - enumeration_field_type, value); - } else { - uint64_t value; - - if (bt_ctf_field_unsigned_integer_get_value(container_field, - &value)) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; + g_string_append(pretty->string, ""); + if (pretty->use_colors) { + g_string_append(pretty->string, COLOR_RST); } - iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value( - enumeration_field_type, value); - } - if (!iter) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; + goto skip_loop; } - fprintf(pretty->out, "( "); for (;;) { const char *mapping_name; - if (bt_ctf_field_type_enumeration_mapping_iterator_get_signed( + if (bt_field_type_enumeration_mapping_iterator_signed_get( iter, &mapping_name, NULL, NULL) < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } if (nr_mappings++) - fprintf(pretty->out, ", "); + g_string_append(pretty->string, ", "); if (pretty->use_colors) { - fputs(COLOR_ENUM_MAPPING_NAME, pretty->out); + g_string_append(pretty->string, COLOR_ENUM_MAPPING_NAME); } print_escape_string(pretty, mapping_name); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } - if (bt_ctf_field_type_enumeration_mapping_iterator_next(iter) < 0) { + if (bt_field_type_enumeration_mapping_iterator_next(iter) < 0) { break; } } - if (!nr_mappings) { - if (pretty->use_colors) { - fputs(COLOR_UNKNOWN, pretty->out); - } - fprintf(pretty->out, ""); - if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); - } - } - fprintf(pretty->out, " : container = "); - ret = print_integer(pretty, container_field); +skip_loop: + g_string_append(pretty->string, " : container = "); + ret = print_integer(pretty, field); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } - fprintf(pretty->out, " )"); + g_string_append(pretty->string, " )"); end: bt_put(iter); - bt_put(container_field_type); - bt_put(container_field); - bt_put(enumeration_field_type); return ret; } @@ -902,22 +874,22 @@ int filter_field_name(struct pretty_component *pretty, const char *field_name, static enum bt_component_status print_struct_field(struct pretty_component *pretty, - struct bt_ctf_field *_struct, - struct bt_ctf_field_type *struct_type, + struct bt_field *_struct, + struct bt_field_type *struct_type, int i, bool print_names, int *nr_printed_fields, GQuark *filter_fields, int filter_array_len) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; const char *field_name; - struct bt_ctf_field *field = NULL; - struct bt_ctf_field_type *field_type = NULL;; + struct bt_field *field = NULL; + struct bt_field_type *field_type = NULL;; - field = bt_ctf_field_structure_get_field_by_index(_struct, i); + field = bt_field_structure_borrow_field_by_index(_struct, i); if (!field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - if (bt_ctf_field_type_structure_get_field(struct_type, + if (bt_field_type_structure_borrow_field_by_index(struct_type, &field_name, &field_type, i) < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -930,41 +902,40 @@ enum bt_component_status print_struct_field(struct pretty_component *pretty, } if (*nr_printed_fields > 0) { - fprintf(pretty->out, ", "); + g_string_append(pretty->string, ", "); } else { - fprintf(pretty->out, " "); + g_string_append(pretty->string, " "); } if (print_names) { - print_field_name_equal(pretty, rem_(field_name)); + print_field_name_equal(pretty, field_name); } ret = print_field(pretty, field, print_names, NULL, 0); *nr_printed_fields += 1; + end: - bt_put(field_type); - bt_put(field); return ret; } static enum bt_component_status print_struct(struct pretty_component *pretty, - struct bt_ctf_field *_struct, bool print_names, + struct bt_field *_struct, bool print_names, GQuark *filter_fields, int filter_array_len) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field_type *struct_type = NULL; + struct bt_field_type *struct_type = NULL; int nr_fields, i, nr_printed_fields; - struct_type = bt_ctf_field_get_type(_struct); + struct_type = bt_field_borrow_type(_struct); if (!struct_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - nr_fields = bt_ctf_field_type_structure_get_field_count(struct_type); + nr_fields = bt_field_type_structure_get_field_count(struct_type); if (nr_fields < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - fprintf(pretty->out, "{"); + g_string_append(pretty->string, "{"); pretty->depth++; nr_printed_fields = 0; for (i = 0; i < nr_fields; i++) { @@ -976,81 +947,81 @@ enum bt_component_status print_struct(struct pretty_component *pretty, } } pretty->depth--; - fprintf(pretty->out, " }"); + g_string_append(pretty->string, " }"); + end: - bt_put(struct_type); return ret; } static enum bt_component_status print_array_field(struct pretty_component *pretty, - struct bt_ctf_field *array, uint64_t i, + struct bt_field *array, uint64_t i, bool is_string, bool print_names) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *field = NULL; + struct bt_field *field = NULL; if (!is_string) { if (i != 0) { - fprintf(pretty->out, ", "); + g_string_append(pretty->string, ", "); } else { - fprintf(pretty->out, " "); + g_string_append(pretty->string, " "); } if (print_names) { - fprintf(pretty->out, "[%" PRIu64 "] = ", i); + g_string_append_printf(pretty->string, "[%" PRIu64 "] = ", i); } } - field = bt_ctf_field_array_get_field(array, i); + field = bt_field_array_borrow_field(array, i); if (!field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } ret = print_field(pretty, field, print_names, NULL, 0); + end: - bt_put(field); return ret; } static enum bt_component_status print_array(struct pretty_component *pretty, - struct bt_ctf_field *array, bool print_names) + struct bt_field *array, bool print_names) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field_type *array_type = NULL, *field_type = NULL; - enum bt_ctf_field_type_id type_id; + struct bt_field_type *array_type = NULL, *field_type = NULL; + enum bt_field_type_id type_id; int64_t len; uint64_t i; bool is_string = false; - array_type = bt_ctf_field_get_type(array); + array_type = bt_field_borrow_type(array); if (!array_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - field_type = bt_ctf_field_type_array_get_element_type(array_type); + field_type = bt_field_type_array_borrow_element_field_type(array_type); if (!field_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - len = bt_ctf_field_type_array_get_length(array_type); + len = bt_field_type_array_get_length(array_type); if (len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - type_id = bt_ctf_field_type_get_type_id(field_type); - if (type_id == BT_CTF_FIELD_TYPE_ID_INTEGER) { - enum bt_ctf_string_encoding encoding; + type_id = bt_field_type_get_type_id(field_type); + if (type_id == BT_FIELD_TYPE_ID_INTEGER) { + enum bt_string_encoding encoding; - encoding = bt_ctf_field_type_integer_get_encoding(field_type); - if (encoding == BT_CTF_STRING_ENCODING_UTF8 - || encoding == BT_CTF_STRING_ENCODING_ASCII) { + encoding = bt_field_type_integer_get_encoding(field_type); + if (encoding == BT_STRING_ENCODING_UTF8 + || encoding == BT_STRING_ENCODING_ASCII) { int integer_len, integer_alignment; - integer_len = bt_ctf_field_type_integer_get_size(field_type); + integer_len = bt_field_type_integer_get_size(field_type); if (integer_len < 0) { return BT_COMPONENT_STATUS_ERROR; } - integer_alignment = bt_ctf_field_type_get_alignment(field_type); + integer_alignment = bt_field_type_get_alignment(field_type); if (integer_alignment < 0) { return BT_COMPONENT_STATUS_ERROR; } @@ -1062,9 +1033,9 @@ enum bt_component_status print_array(struct pretty_component *pretty, } if (is_string) { - g_string_assign(pretty->string, ""); + g_string_assign(pretty->tmp_string, ""); } else { - fprintf(pretty->out, "["); + g_string_append(pretty->string, "["); } pretty->depth++; @@ -1078,96 +1049,90 @@ enum bt_component_status print_array(struct pretty_component *pretty, if (is_string) { if (pretty->use_colors) { - fputs(COLOR_STRING_VALUE, pretty->out); + g_string_append(pretty->string, COLOR_STRING_VALUE); } - print_escape_string(pretty, pretty->string->str); + print_escape_string(pretty, pretty->tmp_string->str); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } } else { - fprintf(pretty->out, " ]"); + g_string_append(pretty->string, " ]"); } + end: - bt_put(field_type); - bt_put(array_type); return ret; } static enum bt_component_status print_sequence_field(struct pretty_component *pretty, - struct bt_ctf_field *seq, uint64_t i, + struct bt_field *seq, uint64_t i, bool is_string, bool print_names) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *field = NULL; + struct bt_field *field = NULL; if (!is_string) { if (i != 0) { - fprintf(pretty->out, ", "); + g_string_append(pretty->string, ", "); } else { - fprintf(pretty->out, " "); + g_string_append(pretty->string, " "); } if (print_names) { - fprintf(pretty->out, "[%" PRIu64 "] = ", i); + g_string_append_printf(pretty->string, "[%" PRIu64 "] = ", i); } } - field = bt_ctf_field_sequence_get_field(seq, i); + field = bt_field_sequence_borrow_field(seq, i); if (!field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } ret = print_field(pretty, field, print_names, NULL, 0); + end: - bt_put(field); return ret; } static enum bt_component_status print_sequence(struct pretty_component *pretty, - struct bt_ctf_field *seq, bool print_names) + struct bt_field *seq, bool print_names) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field_type *seq_type = NULL, *field_type = NULL; - struct bt_ctf_field *length_field = NULL; - enum bt_ctf_field_type_id type_id; - uint64_t len; + struct bt_field_type *seq_type = NULL, *field_type = NULL; + enum bt_field_type_id type_id; + int64_t len; uint64_t i; bool is_string = false; - seq_type = bt_ctf_field_get_type(seq); + seq_type = bt_field_borrow_type(seq); if (!seq_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - length_field = bt_ctf_field_sequence_get_length(seq); - if (!length_field) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } - if (bt_ctf_field_unsigned_integer_get_value(length_field, &len) < 0) { + len = bt_field_sequence_get_length(seq); + if (len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - field_type = bt_ctf_field_type_sequence_get_element_type(seq_type); + field_type = bt_field_type_sequence_borrow_element_field_type(seq_type); if (!field_type) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - type_id = bt_ctf_field_type_get_type_id(field_type); - if (type_id == BT_CTF_FIELD_TYPE_ID_INTEGER) { - enum bt_ctf_string_encoding encoding; + type_id = bt_field_type_get_type_id(field_type); + if (type_id == BT_FIELD_TYPE_ID_INTEGER) { + enum bt_string_encoding encoding; - encoding = bt_ctf_field_type_integer_get_encoding(field_type); - if (encoding == BT_CTF_STRING_ENCODING_UTF8 - || encoding == BT_CTF_STRING_ENCODING_ASCII) { + encoding = bt_field_type_integer_get_encoding(field_type); + if (encoding == BT_STRING_ENCODING_UTF8 + || encoding == BT_STRING_ENCODING_ASCII) { int integer_len, integer_alignment; - integer_len = bt_ctf_field_type_integer_get_size(field_type); + integer_len = bt_field_type_integer_get_size(field_type); if (integer_len < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - integer_alignment = bt_ctf_field_type_get_alignment(field_type); + integer_alignment = bt_field_type_get_alignment(field_type); if (integer_alignment < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -1180,9 +1145,9 @@ enum bt_component_status print_sequence(struct pretty_component *pretty, } if (is_string) { - g_string_assign(pretty->string, ""); + g_string_assign(pretty->tmp_string, ""); } else { - fprintf(pretty->out, "["); + g_string_append(pretty->string, "["); } pretty->depth++; @@ -1197,66 +1162,96 @@ enum bt_component_status print_sequence(struct pretty_component *pretty, if (is_string) { if (pretty->use_colors) { - fputs(COLOR_STRING_VALUE, pretty->out); + g_string_append(pretty->string, COLOR_STRING_VALUE); } - print_escape_string(pretty, pretty->string->str); + print_escape_string(pretty, pretty->tmp_string->str); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } } else { - fprintf(pretty->out, " ]"); + g_string_append(pretty->string, " ]"); } + end: - bt_put(length_field); - bt_put(field_type); - bt_put(seq_type); return ret; } static enum bt_component_status print_variant(struct pretty_component *pretty, - struct bt_ctf_field *variant, bool print_names) + struct bt_field *variant, bool print_names) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *field = NULL; + struct bt_field *field = NULL; - field = bt_ctf_field_variant_get_current_field(variant); + field = bt_field_variant_borrow_current_field(variant); if (!field) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - fprintf(pretty->out, "{ "); + g_string_append(pretty->string, "{ "); pretty->depth++; if (print_names) { - int iter_ret; - struct bt_ctf_field *tag_field = NULL; + int iret; + struct bt_field_type *var_ft; + struct bt_field_type *tag_ft; + struct bt_field_type *container_ft; const char *tag_choice; - struct bt_ctf_field_type_enumeration_mapping_iterator *iter; + bt_bool is_signed; + struct bt_field_type_enumeration_mapping_iterator *iter; + + var_ft = bt_field_borrow_type(variant); + tag_ft = bt_field_type_variant_borrow_tag_field_type( + var_ft); + container_ft = + bt_field_type_enumeration_borrow_container_field_type( + tag_ft); + is_signed = bt_field_type_integer_is_signed(container_ft); + + if (is_signed) { + int64_t tag; + + iret = bt_field_variant_get_tag_signed(variant, &tag); + if (iret) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + iter = bt_field_type_enumeration_signed_find_mappings_by_value( + tag_ft, tag); + } else { + uint64_t tag; + + iret = bt_field_variant_get_tag_unsigned(variant, &tag); + if (iret) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } - tag_field = bt_ctf_field_variant_get_tag(variant); - if (!tag_field) { + iter = bt_field_type_enumeration_unsigned_find_mappings_by_value( + tag_ft, tag); + } + + if (!iter) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - iter = bt_ctf_field_enumeration_get_mappings(tag_field); - if (!iter) { - bt_put(tag_field); + iret = bt_field_type_enumeration_mapping_iterator_next( + iter); + if (!iter || ret) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - iter_ret = - bt_ctf_field_type_enumeration_mapping_iterator_get_signed( + iret = + bt_field_type_enumeration_mapping_iterator_signed_get( iter, &tag_choice, NULL, NULL); - if (iter_ret) { + if (iret) { bt_put(iter); - bt_put(tag_field); ret = BT_COMPONENT_STATUS_ERROR; goto end; } - print_field_name_equal(pretty, rem_(tag_choice)); - bt_put(tag_field); + print_field_name_equal(pretty, tag_choice); bt_put(iter); } ret = print_field(pretty, field, print_names, NULL, 0); @@ -1264,60 +1259,70 @@ enum bt_component_status print_variant(struct pretty_component *pretty, goto end; } pretty->depth--; - fprintf(pretty->out, " }"); + g_string_append(pretty->string, " }"); + end: - bt_put(field); return ret; } static enum bt_component_status print_field(struct pretty_component *pretty, - struct bt_ctf_field *field, bool print_names, + struct bt_field *field, bool print_names, GQuark *filter_fields, int filter_array_len) { - enum bt_ctf_field_type_id type_id; + enum bt_field_type_id type_id; - type_id = bt_ctf_field_get_type_id(field); + type_id = bt_field_get_type_id(field); switch (type_id) { - case CTF_TYPE_INTEGER: + case BT_CTF_FIELD_TYPE_ID_INTEGER: return print_integer(pretty, field); - case CTF_TYPE_FLOAT: + case BT_CTF_FIELD_TYPE_ID_FLOAT: { double v; - if (bt_ctf_field_floating_point_get_value(field, &v)) { + if (bt_field_floating_point_get_value(field, &v)) { return BT_COMPONENT_STATUS_ERROR; } if (pretty->use_colors) { - fputs(COLOR_NUMBER_VALUE, pretty->out); + g_string_append(pretty->string, COLOR_NUMBER_VALUE); } - fprintf(pretty->out, "%g", v); + g_string_append_printf(pretty->string, "%g", v); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } return BT_COMPONENT_STATUS_OK; } - case CTF_TYPE_ENUM: + case BT_CTF_FIELD_TYPE_ID_ENUM: return print_enum(pretty, field); - case CTF_TYPE_STRING: + case BT_CTF_FIELD_TYPE_ID_STRING: + { + const char *str; + + str = bt_field_string_get_value(field); + if (!str) { + return BT_COMPONENT_STATUS_ERROR; + } + if (pretty->use_colors) { - fputs(COLOR_STRING_VALUE, pretty->out); + g_string_append(pretty->string, COLOR_STRING_VALUE); } - print_escape_string(pretty, bt_ctf_field_string_get_value(field)); + print_escape_string(pretty, str); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } return BT_COMPONENT_STATUS_OK; - case CTF_TYPE_STRUCT: + } + case BT_CTF_FIELD_TYPE_ID_STRUCT: return print_struct(pretty, field, print_names, filter_fields, filter_array_len); - case CTF_TYPE_VARIANT: + case BT_CTF_FIELD_TYPE_ID_VARIANT: return print_variant(pretty, field, print_names); - case CTF_TYPE_ARRAY: + case BT_CTF_FIELD_TYPE_ID_ARRAY: return print_array(pretty, field, print_names); - case CTF_TYPE_SEQUENCE: + case BT_CTF_FIELD_TYPE_ID_SEQUENCE: return print_sequence(pretty, field, print_names); default: + // TODO: log instead fprintf(pretty->err, "[error] Unknown type id: %d\n", (int) type_id); return BT_COMPONENT_STATUS_ERROR; } @@ -1325,23 +1330,23 @@ enum bt_component_status print_field(struct pretty_component *pretty, static enum bt_component_status print_stream_packet_context(struct pretty_component *pretty, - struct bt_ctf_event *event) + struct bt_event *event) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_packet *packet = NULL; - struct bt_ctf_field *main_field = NULL; + struct bt_packet *packet = NULL; + struct bt_field *main_field = NULL; - packet = bt_ctf_event_get_packet(event); + packet = bt_event_borrow_packet(event); if (!packet) { ret = BT_COMPONENT_STATUS_ERROR; goto end; } - main_field = bt_ctf_packet_get_context(packet); + main_field = bt_packet_borrow_context(packet); if (!main_field) { goto end; } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = false; if (pretty->options.print_scope_field_names) { @@ -1351,25 +1356,24 @@ enum bt_component_status print_stream_packet_context(struct pretty_component *pr pretty->options.print_context_field_names, stream_packet_context_quarks, STREAM_PACKET_CONTEXT_QUARKS_LEN); + end: - bt_put(main_field); - bt_put(packet); return ret; } static enum bt_component_status print_event_header_raw(struct pretty_component *pretty, - struct bt_ctf_event *event) + struct bt_event *event) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *main_field = NULL; + struct bt_field *main_field = NULL; - main_field = bt_ctf_event_get_header(event); + main_field = bt_event_borrow_header(event); if (!main_field) { goto end; } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = false; if (pretty->options.print_scope_field_names) { @@ -1377,24 +1381,24 @@ enum bt_component_status print_event_header_raw(struct pretty_component *pretty, } ret = print_field(pretty, main_field, pretty->options.print_header_field_names, NULL, 0); + end: - bt_put(main_field); return ret; } static enum bt_component_status print_stream_event_context(struct pretty_component *pretty, - struct bt_ctf_event *event) + struct bt_event *event) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *main_field = NULL; + struct bt_field *main_field = NULL; - main_field = bt_ctf_event_get_stream_event_context(event); + main_field = bt_event_borrow_stream_event_context(event); if (!main_field) { goto end; } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = false; if (pretty->options.print_scope_field_names) { @@ -1402,24 +1406,24 @@ enum bt_component_status print_stream_event_context(struct pretty_component *pre } ret = print_field(pretty, main_field, pretty->options.print_context_field_names, NULL, 0); + end: - bt_put(main_field); return ret; } static enum bt_component_status print_event_context(struct pretty_component *pretty, - struct bt_ctf_event *event) + struct bt_event *event) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *main_field = NULL; + struct bt_field *main_field = NULL; - main_field = bt_ctf_event_get_event_context(event); + main_field = bt_event_borrow_context(event); if (!main_field) { goto end; } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = false; if (pretty->options.print_scope_field_names) { @@ -1427,24 +1431,24 @@ enum bt_component_status print_event_context(struct pretty_component *pretty, } ret = print_field(pretty, main_field, pretty->options.print_context_field_names, NULL, 0); + end: - bt_put(main_field); return ret; } static enum bt_component_status print_event_payload(struct pretty_component *pretty, - struct bt_ctf_event *event) + struct bt_event *event) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_ctf_field *main_field = NULL; + struct bt_field *main_field = NULL; - main_field = bt_ctf_event_get_event_payload(event); + main_field = bt_event_borrow_payload(event); if (!main_field) { goto end; } if (!pretty->start_line) { - fputs(", ", pretty->out); + g_string_append(pretty->string, ", "); } pretty->start_line = false; if (pretty->options.print_scope_field_names) { @@ -1452,8 +1456,25 @@ enum bt_component_status print_event_payload(struct pretty_component *pretty, } ret = print_field(pretty, main_field, pretty->options.print_payload_field_names, NULL, 0); + +end: + return ret; +} + +static +int flush_buf(struct pretty_component *pretty) +{ + int ret = 0; + + if (pretty->string->len == 0) { + goto end; + } + + if (fwrite(pretty->string->str, pretty->string->len, 1, pretty->out) != 1) { + ret = -1; + } + end: - bt_put(main_field); return ret; } @@ -1462,14 +1483,16 @@ enum bt_component_status pretty_print_event(struct pretty_component *pretty, struct bt_notification *event_notif) { enum bt_component_status ret; - struct bt_ctf_event *event = - bt_notification_event_get_event(event_notif); + struct bt_event *event = + bt_notification_event_borrow_event(event_notif); struct bt_clock_class_priority_map *cc_prio_map = - bt_notification_event_get_clock_class_priority_map(event_notif); + bt_notification_event_borrow_clock_class_priority_map( + event_notif); - assert(event); - assert(cc_prio_map); + BT_ASSERT(event); + BT_ASSERT(cc_prio_map); pretty->start_line = true; + g_string_assign(pretty->string, ""); ret = print_event_header(pretty, event, cc_prio_map); if (ret != BT_COMPONENT_STATUS_OK) { goto end; @@ -1502,9 +1525,130 @@ enum bt_component_status pretty_print_event(struct pretty_component *pretty, goto end; } - fputc('\n', pretty->out); + g_string_append_c(pretty->string, '\n'); + if (flush_buf(pretty)) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + end: - bt_put(event); - bt_put(cc_prio_map); + return ret; +} + +BT_HIDDEN +enum bt_component_status pretty_print_discarded_elements( + struct pretty_component *pretty, + struct bt_notification *notif) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_stream *stream = NULL; + struct bt_stream_class *stream_class = NULL; + struct bt_trace *trace = NULL; + const char *stream_name; + const char *trace_name; + const unsigned char *trace_uuid; + int64_t stream_class_id; + int64_t stream_id; + bool is_discarded_events; + int64_t count; + struct bt_clock_value *clock_value = NULL; + + /* Stream name */ + switch (bt_notification_get_type(notif)) { + case BT_NOTIFICATION_TYPE_DISCARDED_EVENTS: + stream = bt_notification_discarded_events_borrow_stream(notif); + count = bt_notification_discarded_events_get_count(notif); + is_discarded_events = true; + break; + case BT_NOTIFICATION_TYPE_DISCARDED_PACKETS: + stream = bt_notification_discarded_packets_borrow_stream(notif); + count = bt_notification_discarded_packets_get_count(notif); + is_discarded_events = false; + break; + default: + abort(); + } + + BT_ASSERT(stream); + stream_name = bt_stream_get_name(stream); + + /* Stream class ID */ + stream_class = bt_stream_borrow_class(stream); + BT_ASSERT(stream_class); + stream_class_id = bt_stream_class_get_id(stream_class); + + /* Stream ID */ + stream_id = bt_stream_get_id(stream); + + /* Trace path */ + trace = bt_stream_class_borrow_trace(stream_class); + BT_ASSERT(trace); + trace_name = bt_trace_get_name(trace); + if (!trace_name) { + trace_name = "(unknown)"; + } + + /* Trace UUID */ + trace_uuid = bt_trace_get_uuid(trace); + + /* + * Print to standard error stream to remain backward compatible + * with Babeltrace 1. + */ + fprintf(stderr, + "%s%sWARNING%s%s: Tracer discarded %" PRId64 " %s%s between [", + bt_common_color_fg_yellow(), + bt_common_color_bold(), + bt_common_color_reset(), + bt_common_color_fg_yellow(), + count, is_discarded_events ? "event" : "packet", + count == 1 ? "" : "s"); + g_string_assign(pretty->string, ""); + clock_value = is_discarded_events ? + bt_notification_discarded_events_borrow_begin_clock_value(notif) : + bt_notification_discarded_packets_borrow_begin_clock_value(notif); + print_timestamp_wall(pretty, clock_value); + fprintf(stderr, "%s] and [", pretty->string->str); + g_string_assign(pretty->string, ""); + clock_value = is_discarded_events ? + bt_notification_discarded_events_borrow_end_clock_value(notif) : + bt_notification_discarded_packets_borrow_end_clock_value(notif); + print_timestamp_wall(pretty, clock_value); + fprintf(stderr, "%s] in trace \"%s\" ", + pretty->string->str, trace_name); + + if (trace_uuid) { + fprintf(stderr, + "(UUID: %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x) ", + trace_uuid[0], + trace_uuid[1], + trace_uuid[2], + trace_uuid[3], + trace_uuid[4], + trace_uuid[5], + trace_uuid[6], + trace_uuid[7], + trace_uuid[8], + trace_uuid[9], + trace_uuid[10], + trace_uuid[11], + trace_uuid[12], + trace_uuid[13], + trace_uuid[14], + trace_uuid[15]); + } else { + fprintf(stderr, "(no UUID) "); + } + + fprintf(stderr, "within stream \"%s\" (stream class ID: %" PRId64 ", ", + stream_name, stream_class_id); + + if (stream_id >= 0) { + fprintf(stderr, "stream ID: %" PRId64, stream_id); + } else { + fprintf(stderr, "no stream ID"); + } + + fprintf(stderr, ").%s\n", bt_common_color_reset()); return ret; }