text.pretty: create an event string instead of using fprintf()/fputs()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Fri, 26 May 2017 20:14:49 +0000 (16:14 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 9 Jun 2017 20:58:11 +0000 (16:58 -0400)
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 <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
plugins/text/pretty/pretty.c
plugins/text/pretty/pretty.h
plugins/text/pretty/print.c

index d7346de1ed92bd202dbd37a34c9ffa8ee39d3e0c..9c994095871e556d149edf0fef49bdbe50482b00 100644 (file)
@@ -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;
 
index 749befc680dd51d61c794a4deff36a1576de9f8c..f51ee6528206b06473a0eb47b59ec988e8b60539 100644 (file)
@@ -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;
index 3615cfd07ecf1597a5c406f6b66f66fd467ca885..6cba7ce0997b116fea208f337cc140c50af7e01e 100644 (file)
 
 #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, "<unknown>");
+               g_string_append(pretty->string, "<unknown>");
                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);
This page took 0.063597 seconds and 4 git commands to generate.