From 5280f7427ab8be3f2c229ce001e987d8a292e1ea Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Fri, 26 May 2017 16:14:49 -0400 Subject: [PATCH] text.pretty: create an event string instead of using fprintf()/fputs() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Because the component calls library functions which can log between its calls to fprintf() or fputs(), the output when logging is enabled is the output of the component interlaced with library logging statements. Instead of printing directly to the file stream, append to a component GString and fwrite() this content at the end. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- plugins/text/pretty/pretty.c | 14 +- plugins/text/pretty/pretty.h | 1 + plugins/text/pretty/print.c | 291 +++++++++++++++++++---------------- 3 files changed, 172 insertions(+), 134 deletions(-) diff --git a/plugins/text/pretty/pretty.c b/plugins/text/pretty/pretty.c index d7346de1..9c994095 100644 --- a/plugins/text/pretty/pretty.c +++ b/plugins/text/pretty/pretty.c @@ -80,7 +80,15 @@ static void destroy_pretty_data(struct pretty_component *pretty) { bt_put(pretty->input_iterator); - (void) g_string_free(pretty->string, TRUE); + + if (pretty->string) { + (void) g_string_free(pretty->string, TRUE); + } + + if (pretty->tmp_string) { + (void) g_string_free(pretty->tmp_string, TRUE); + } + if (pretty->out != stdout) { int ret; @@ -106,6 +114,10 @@ struct pretty_component *create_pretty(void) if (!pretty->string) { goto error; } + pretty->tmp_string = g_string_new(""); + if (!pretty->tmp_string) { + goto error; + } end: return pretty; diff --git a/plugins/text/pretty/pretty.h b/plugins/text/pretty/pretty.h index 749befc6..f51ee652 100644 --- a/plugins/text/pretty/pretty.h +++ b/plugins/text/pretty/pretty.h @@ -82,6 +82,7 @@ struct pretty_component { int depth; /* nesting, used for tabulation alignment. */ bool start_line; GString *string; + GString *tmp_string; struct bt_value *plugin_opt_map; /* Temporary parameter map. */ bool use_colors; bool error; diff --git a/plugins/text/pretty/print.c b/plugins/text/pretty/print.c index 3615cfd0..6cba7ce0 100644 --- a/plugins/text/pretty/print.c +++ b/plugins/text/pretty/print.c @@ -46,15 +46,15 @@ #define NSEC_PER_SEC 1000000000LL -#define COLOR_NAME BT_COMMON_COLOR_BOLD +#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_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 +#define COLOR_TIMESTAMP BT_COMMON_COLOR_BOLD BT_COMMON_COLOR_FG_YELLOW static inline const char *rem_(const char *str) @@ -79,9 +79,10 @@ 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,10 +90,10 @@ 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); } } @@ -107,17 +108,19 @@ void print_timestamp_cycles(struct pretty_component *pretty, 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(clock_value, &cycles); bt_put(clock_value); 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; @@ -139,24 +142,26 @@ void print_timestamp_wall(struct pretty_component *pretty, 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); 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; @@ -188,6 +193,7 @@ void print_timestamp_wall(struct pretty_component *pretty, time_t time_s = (time_t) ts_sec_abs; if (is_negative) { + // TODO: log instead fprintf(stderr, "[warning] Fallback to [sec.ns] to print negative time value. Use --clock-seconds.\n"); goto seconds; } @@ -197,6 +203,7 @@ void print_timestamp_wall(struct pretty_component *pretty, res = localtime_r(&time_s, &tm); if (!res) { + // TODO: log instead fprintf(stderr, "[warning] Unable to get localtime.\n"); goto seconds; } @@ -205,6 +212,7 @@ void print_timestamp_wall(struct pretty_component *pretty, res = gmtime_r(&time_s, &tm); if (!res) { + // TODO: log instead fprintf(stderr, "[warning] Unable to get gmtime.\n"); goto seconds; } @@ -217,19 +225,23 @@ void print_timestamp_wall(struct pretty_component *pretty, res = strftime(timestr, sizeof(timestr), "%F ", &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; } @@ -246,7 +258,6 @@ enum bt_component_status print_event_timestamp(struct pretty_component *pretty, 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; stream = bt_ctf_event_get_stream(event); if (!stream) { @@ -281,10 +292,10 @@ 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); @@ -292,24 +303,26 @@ enum bt_component_status print_event_timestamp(struct pretty_component *pretty, print_timestamp_wall(pretty, clock_class, event); } 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,14 +331,15 @@ 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; @@ -376,14 +390,16 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, name = bt_ctf_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, " "); } } } @@ -396,14 +412,14 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, 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; @@ -418,16 +434,16 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, 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; @@ -442,16 +458,16 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, 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; @@ -466,16 +482,16 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, 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; @@ -492,19 +508,19 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, bool has_str = false; 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); + g_string_append(pretty->string, ":"); } if (loglevel_str) { const char *str; if (bt_value_string_get(loglevel_str, &str) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s", str); + g_string_append(pretty->string, str); has_str = true; } } @@ -513,7 +529,7 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, if (bt_value_integer_get(loglevel_value, &value) == BT_VALUE_STATUS_OK) { - fprintf(pretty->out, "%s(%" PRId64 ")", + g_string_append_printf(pretty->string, "%s(%" PRId64 ")", has_str ? " " : "", value); } } @@ -529,19 +545,19 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, "model.emf.uri"); 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); + g_string_append(pretty->string, str); } } bt_put(uri_str); @@ -549,26 +565,26 @@ enum bt_component_status print_event_header(struct pretty_component *pretty, } } 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_ctf_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); @@ -618,7 +634,7 @@ enum bt_component_status print_integer(struct pretty_component *pretty, switch (encoding) { case BT_CTF_STRING_ENCODING_UTF8: case BT_CTF_STRING_ENCODING_ASCII: - g_string_append_c(pretty->string, (int) v.u); + g_string_append_c(pretty->tmp_string, (int) v.u); goto end; case BT_CTF_STRING_ENCODING_NONE: case BT_CTF_STRING_ENCODING_UNKNOWN: @@ -629,7 +645,7 @@ 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; } @@ -644,10 +660,10 @@ enum bt_component_status print_integer(struct pretty_component *pretty, 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; @@ -672,14 +688,14 @@ enum bt_component_status print_integer(struct pretty_component *pretty, } } - fprintf(pretty->out, "0%" PRIo64, v.u); + g_string_append_printf(pretty->string, "0%" PRIo64, v.u); break; } case BT_CTF_INTEGER_BASE_DECIMAL: 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: @@ -698,7 +714,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,7 +723,7 @@ 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,65 +734,67 @@ 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 @@ -836,7 +854,7 @@ enum bt_component_status print_enum(struct pretty_component *pretty, ret = BT_COMPONENT_STATUS_ERROR; goto end; } - fprintf(pretty->out, "( "); + g_string_append(pretty->string, "( "); for (;;) { const char *mapping_name; @@ -846,13 +864,13 @@ enum bt_component_status print_enum(struct pretty_component *pretty, 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) { break; @@ -860,19 +878,19 @@ enum bt_component_status print_enum(struct pretty_component *pretty, } if (!nr_mappings) { if (pretty->use_colors) { - fputs(COLOR_UNKNOWN, pretty->out); + g_string_append(pretty->string, COLOR_UNKNOWN); } - fprintf(pretty->out, ""); + g_string_append(pretty->string, ""); if (pretty->use_colors) { - fputs(COLOR_RST, pretty->out); + g_string_append(pretty->string, COLOR_RST); } } - fprintf(pretty->out, " : container = "); + g_string_append(pretty->string, " : container = "); ret = print_integer(pretty, container_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); @@ -930,9 +948,9 @@ 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)); @@ -964,7 +982,7 @@ enum bt_component_status print_struct(struct pretty_component *pretty, 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,7 +994,7 @@ 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; @@ -992,12 +1010,12 @@ enum bt_component_status print_array_field(struct pretty_component *pretty, 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); @@ -1062,9 +1080,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,14 +1096,14 @@ 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); @@ -1103,12 +1121,12 @@ enum bt_component_status print_sequence_field(struct pretty_component *pretty, 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); @@ -1180,9 +1198,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,14 +1215,14 @@ 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); @@ -1225,7 +1243,7 @@ enum bt_component_status print_variant(struct pretty_component *pretty, ret = BT_COMPONENT_STATUS_ERROR; goto end; } - fprintf(pretty->out, "{ "); + g_string_append(pretty->string, "{ "); pretty->depth++; if (print_names) { int iter_ret; @@ -1264,7 +1282,7 @@ 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; @@ -1289,11 +1307,11 @@ enum bt_component_status print_field(struct pretty_component *pretty, 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; } @@ -1301,11 +1319,11 @@ enum bt_component_status print_field(struct pretty_component *pretty, return print_enum(pretty, field); case CTF_TYPE_STRING: 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)); 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: @@ -1318,6 +1336,7 @@ enum bt_component_status print_field(struct pretty_component *pretty, case CTF_TYPE_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; } @@ -1341,7 +1360,7 @@ enum bt_component_status print_stream_packet_context(struct pretty_component *pr 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) { @@ -1369,7 +1388,7 @@ enum bt_component_status print_event_header_raw(struct pretty_component *pretty, 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) { @@ -1394,7 +1413,7 @@ enum bt_component_status print_stream_event_context(struct pretty_component *pre 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) { @@ -1419,7 +1438,7 @@ enum bt_component_status print_event_context(struct pretty_component *pretty, 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) { @@ -1444,7 +1463,7 @@ enum bt_component_status print_event_payload(struct pretty_component *pretty, 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) { @@ -1470,6 +1489,7 @@ enum bt_component_status pretty_print_event(struct pretty_component *pretty, assert(event); 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,7 +1522,12 @@ 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 (fwrite(pretty->string->str, pretty->string->len, 1, pretty->out) != 1) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + end: bt_put(event); bt_put(cc_prio_map); -- 2.34.1