string-format: introduce function to format component class name
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 21 Nov 2019 21:58:12 +0000 (16:58 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 5 Dec 2019 19:29:13 +0000 (19:29 +0000)
The CLI has a function to print a component class name nicely,
print_plugin_comp_cls_opt.  The same functionality will be needed by
the Python bindings, move the function to a new convenience library.
Modify the function to return a string instead of printing directly to a
stream.  Update users accordingly.

Change-Id: I83fb61107ce93497ed34ebc383cbd3185c19752c
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/2432
Tested-by: jenkins <jenkins@lttng.org>
configure.ac
src/Makefile.am
src/cli/Makefile.am
src/cli/babeltrace2.c
src/string-format/Makefile.am [new file with mode: 0644]
src/string-format/format-plugin-comp-cls-name.c [new file with mode: 0644]
src/string-format/format-plugin-comp-cls-name.h [new file with mode: 0644]

index c7899e461ae3f20028697cbc0ae57abec07e1c11..3c2955bf764036e207262f2c5e853cde41769e54 100644 (file)
@@ -780,6 +780,7 @@ AC_CONFIG_FILES([
        src/py-common/Makefile
        src/python-plugin-provider/Makefile
        src/param-parse/Makefile
+       src/string-format/Makefile
        tests/bitfield/Makefile
        tests/ctf-writer/Makefile
        tests/argpar/Makefile
index 4323bfc3a96cacf92b16b6f6038dd27384a89937..2b7be0cb5fb6aa70e647303532e659be31c99ff9 100644 (file)
@@ -9,6 +9,7 @@ SUBDIRS = \
        logging \
        ctf-writer \
        lib \
+       string-format \
        python-plugin-provider \
        plugins \
        param-parse \
index cda8977f046b9e7b4bdedb2b604c682bb3a05fe9..fe4a8e2649da569104ecde95e66cb865c993a64a 100644 (file)
@@ -55,6 +55,7 @@ babeltrace2_bin_LDADD = \
        $(top_builddir)/src/argpar/libbabeltrace2-argpar.la \
        $(top_builddir)/src/autodisc/libbabeltrace2-autodisc.la \
        $(top_builddir)/src/param-parse/libbabeltrace2-param-parse.la \
+       $(top_builddir)/src/string-format/libbabeltrace2-string-format.la \
        $(top_builddir)/src/lib/libbabeltrace2.la \
        $(top_builddir)/src/compat/libcompat.la \
        $(top_builddir)/src/common/libbabeltrace2-common.la \
index 0339426dc4e7c8f33f037679ead7eb2cc6520ba8..f5164ccb88ce9cbcbb0e75a6b11b06be99255ade 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <babeltrace2/babeltrace.h>
 #include "common/common.h"
+#include "string-format/format-plugin-comp-cls-name.h"
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
@@ -230,68 +231,6 @@ void print_indent(FILE *fp, size_t indent)
        }
 }
 
-static
-const char *component_type_str(bt_component_class_type type)
-{
-       switch (type) {
-       case BT_COMPONENT_CLASS_TYPE_SOURCE:
-               return "source";
-       case BT_COMPONENT_CLASS_TYPE_SINK:
-               return "sink";
-       case BT_COMPONENT_CLASS_TYPE_FILTER:
-               return "filter";
-       default:
-               return "(unknown)";
-       }
-}
-
-static
-void print_plugin_comp_cls_opt(FILE *fh, const char *plugin_name,
-               const char *comp_cls_name, bt_component_class_type type)
-{
-       GString *shell_plugin_name = NULL;
-       GString *shell_comp_cls_name = NULL;
-
-       if (plugin_name) {
-               shell_plugin_name = bt_common_shell_quote(plugin_name, false);
-               if (!shell_plugin_name) {
-                       goto end;
-               }
-       }
-
-       shell_comp_cls_name = bt_common_shell_quote(comp_cls_name, false);
-       if (!shell_comp_cls_name) {
-               goto end;
-       }
-
-       fprintf(fh, "'%s%s%s%s",
-               bt_common_color_bold(),
-               bt_common_color_fg_bright_cyan(),
-               component_type_str(type),
-               bt_common_color_fg_default());
-
-       if (shell_plugin_name) {
-               fprintf(fh, ".%s%s%s",
-                       bt_common_color_fg_blue(),
-                       shell_plugin_name->str,
-                       bt_common_color_fg_default());
-       }
-
-       fprintf(fh, ".%s%s%s'",
-               bt_common_color_fg_yellow(),
-               shell_comp_cls_name->str,
-               bt_common_color_reset());
-
-end:
-       if (shell_plugin_name) {
-               g_string_free(shell_plugin_name, TRUE);
-       }
-
-       if (shell_comp_cls_name) {
-               g_string_free(shell_comp_cls_name, TRUE);
-       }
-}
-
 static
 void print_value(FILE *, const bt_value *, size_t);
 
@@ -502,11 +441,16 @@ void print_value(FILE *fp, const bt_value *value, size_t indent)
 static
 void print_bt_config_component(struct bt_config_component *bt_config_component)
 {
-       fprintf(stderr, "    ");
-       print_plugin_comp_cls_opt(stderr, bt_config_component->plugin_name->str,
+       gchar *comp_cls_str;
+
+       comp_cls_str = format_plugin_comp_cls_opt(
+               bt_config_component->plugin_name->str,
                bt_config_component->comp_cls_name->str,
-               bt_config_component->type);
-       fprintf(stderr, ":\n");
+               bt_config_component->type,
+               BT_COMMON_COLOR_WHEN_AUTO);
+       BT_ASSERT(comp_cls_str);
+
+       fprintf(stderr, "    %s:\n", comp_cls_str);
 
        if (bt_config_component->instance_name->len > 0) {
                fprintf(stderr, "      Name: %s\n",
@@ -515,6 +459,8 @@ void print_bt_config_component(struct bt_config_component *bt_config_component)
 
        fprintf(stderr, "      Parameters:\n");
        print_value(stderr, bt_config_component->params, 8);
+
+       g_free(comp_cls_str);
 }
 
 static
@@ -754,9 +700,13 @@ void print_component_class_help(const char *plugin_name,
                bt_component_class_get_help(comp_cls);
        bt_component_class_type type =
                bt_component_class_get_type(comp_cls);
+       gchar *comp_cls_str;
 
-       print_plugin_comp_cls_opt(stdout, plugin_name, comp_class_name, type);
-       printf("\n");
+       comp_cls_str = format_plugin_comp_cls_opt(plugin_name, comp_class_name,
+               type, BT_COMMON_COLOR_WHEN_AUTO);
+       BT_ASSERT(comp_cls_str);
+
+       printf("%s\n", comp_cls_str);
        printf("  %sDescription%s: %s\n", bt_common_color_bold(),
                bt_common_color_reset(),
                comp_class_description ? comp_class_description : "(None)");
@@ -764,6 +714,8 @@ void print_component_class_help(const char *plugin_name,
        if (comp_class_help) {
                printf("\n%s\n", comp_class_help);
        }
+
+       g_free(comp_cls_str);
 }
 
 static
@@ -843,6 +795,7 @@ void cmd_list_plugins_print_component_classes(const bt_plugin *plugin,
                spec_comp_cls_borrow_comp_cls_func_t spec_comp_cls_borrow_comp_cls_func)
 {
        uint64_t i;
+       gchar *comp_cls_str = NULL;
 
        if (count == 0) {
                printf("  %s%s component classes%s: (none)\n",
@@ -868,10 +821,11 @@ void cmd_list_plugins_print_component_classes(const bt_plugin *plugin,
                bt_component_class_type type =
                        bt_component_class_get_type(comp_class);
 
-               printf("    ");
-               print_plugin_comp_cls_opt(stdout,
-                       bt_plugin_get_name(plugin), comp_class_name,
-                       type);
+               g_free(comp_cls_str);
+               comp_cls_str = format_plugin_comp_cls_opt(
+                       bt_plugin_get_name(plugin), comp_class_name, type,
+                       BT_COMMON_COLOR_WHEN_AUTO);
+               printf("    %s", comp_cls_str);
 
                if (comp_class_description) {
                        printf(": %s", comp_class_description);
@@ -881,7 +835,7 @@ void cmd_list_plugins_print_component_classes(const bt_plugin *plugin,
        }
 
 end:
-       return;
+       g_free(comp_cls_str);
 }
 
 static
@@ -2640,6 +2594,7 @@ void print_error_causes(void)
        int64_t i;
        GString *folded = NULL;
        unsigned int columns;
+       gchar *comp_cls_str = NULL;
 
        if (!error || bt_error_get_cause_count(error) == 0) {
                fprintf(stderr, "%s%sUnknown command-line error.%s\n",
@@ -2683,33 +2638,45 @@ void print_error_causes(void)
                                bt_common_color_reset());
                        break;
                case BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT:
-                       fprintf(stderr, "%s%s%s: ",
-                               bt_common_color_bold(),
-                               bt_error_cause_component_actor_get_component_name(cause),
-                               bt_common_color_reset());
-                       print_plugin_comp_cls_opt(stderr,
+                       comp_cls_str = format_plugin_comp_cls_opt(
                                bt_error_cause_component_actor_get_plugin_name(cause),
                                bt_error_cause_component_actor_get_component_class_name(cause),
-                               bt_error_cause_component_actor_get_component_class_type(cause));
+                               bt_error_cause_component_actor_get_component_class_type(cause),
+                               BT_COMMON_COLOR_WHEN_AUTO);
+                       BT_ASSERT(comp_cls_str);
+
+                       fprintf(stderr, "%s%s%s: %s",
+                               bt_common_color_bold(),
+                               bt_error_cause_component_actor_get_component_name(cause),
+                               bt_common_color_reset(),
+                               comp_cls_str);
                        break;
                case BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS:
-                       print_plugin_comp_cls_opt(stderr,
+                       comp_cls_str = format_plugin_comp_cls_opt(
                                bt_error_cause_component_class_actor_get_plugin_name(cause),
                                bt_error_cause_component_class_actor_get_component_class_name(cause),
-                               bt_error_cause_component_class_actor_get_component_class_type(cause));
+                               bt_error_cause_component_class_actor_get_component_class_type(cause),
+                               BT_COMMON_COLOR_WHEN_AUTO);
+                       BT_ASSERT(comp_cls_str);
+
+                       fputs(comp_cls_str, stderr);
                        break;
                case BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR:
-                       fprintf(stderr, "%s%s%s (%s%s%s): ",
+                       comp_cls_str = format_plugin_comp_cls_opt(
+                               bt_error_cause_message_iterator_actor_get_plugin_name(cause),
+                               bt_error_cause_message_iterator_actor_get_component_class_name(cause),
+                               bt_error_cause_message_iterator_actor_get_component_class_type(cause)
+                               ,BT_COMMON_COLOR_WHEN_AUTO);
+                       BT_ASSERT(comp_cls_str);
+
+                       fprintf(stderr, "%s%s%s (%s%s%s): %s",
                                bt_common_color_bold(),
                                bt_error_cause_message_iterator_actor_get_component_name(cause),
                                bt_common_color_reset(),
                                bt_common_color_bold(),
                                bt_error_cause_message_iterator_actor_get_component_output_port_name(cause),
-                               bt_common_color_reset());
-                       print_plugin_comp_cls_opt(stderr,
-                               bt_error_cause_message_iterator_actor_get_plugin_name(cause),
-                               bt_error_cause_message_iterator_actor_get_component_class_name(cause),
-                               bt_error_cause_message_iterator_actor_get_component_class_type(cause));
+                               bt_common_color_reset(),
+                               comp_cls_str);
                        break;
                default:
                        bt_common_abort();
@@ -2746,6 +2713,8 @@ end:
        if (error) {
                bt_error_release(error);
        }
+
+       g_free(comp_cls_str);
 }
 
 int main(int argc, const char **argv)
diff --git a/src/string-format/Makefile.am b/src/string-format/Makefile.am
new file mode 100644 (file)
index 0000000..9041cf8
--- /dev/null
@@ -0,0 +1,5 @@
+noinst_LTLIBRARIES = libbabeltrace2-string-format.la
+
+libbabeltrace2_string_format_la_SOURCES = \
+       format-plugin-comp-cls-name.c \
+       format-plugin-comp-cls-name.h
diff --git a/src/string-format/format-plugin-comp-cls-name.c b/src/string-format/format-plugin-comp-cls-name.c
new file mode 100644 (file)
index 0000000..c6b87b2
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright EfficiOS, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#define BT_LOG_OUTPUT_LEVEL log_level
+#define BT_LOG_TAG "COMMON/FORMAT-PLUGIN-COMP-CLS-NAME"
+#include <logging/log.h>
+
+#include "format-plugin-comp-cls-name.h"
+
+#include <common/common.h>
+
+
+static
+const char *component_type_str(bt_component_class_type type)
+{
+       switch (type) {
+       case BT_COMPONENT_CLASS_TYPE_SOURCE:
+               return "source";
+       case BT_COMPONENT_CLASS_TYPE_SINK:
+               return "sink";
+       case BT_COMPONENT_CLASS_TYPE_FILTER:
+               return "filter";
+       default:
+               return "(unknown)";
+       }
+}
+
+gchar *format_plugin_comp_cls_opt(const char *plugin_name,
+               const char *comp_cls_name, bt_component_class_type type,
+               enum bt_common_color_when use_colors)
+{
+       GString *str;
+       GString *shell_plugin_name = NULL;
+       GString *shell_comp_cls_name = NULL;
+       gchar *ret;
+       struct bt_common_color_codes codes;
+
+       str = g_string_new(NULL);
+       if (!str) {
+               goto end;
+       }
+
+       if (plugin_name) {
+               shell_plugin_name = bt_common_shell_quote(plugin_name, false);
+               if (!shell_plugin_name) {
+                       goto end;
+               }
+       }
+
+       shell_comp_cls_name = bt_common_shell_quote(comp_cls_name, false);
+       if (!shell_comp_cls_name) {
+               goto end;
+       }
+
+       bt_common_color_get_codes(&codes, use_colors);
+
+       g_string_append_printf(str, "'%s%s%s%s",
+               codes.bold,
+               codes.fg_bright_cyan,
+               component_type_str(type),
+               codes.fg_default);
+
+       if (shell_plugin_name) {
+               g_string_append_printf(str, ".%s%s%s",
+                       codes.fg_blue,
+                       shell_plugin_name->str,
+                       codes.fg_default);
+       }
+
+       g_string_append_printf(str, ".%s%s%s'",
+               codes.fg_yellow,
+               shell_comp_cls_name->str,
+               codes.reset);
+
+end:
+       if (shell_plugin_name) {
+               g_string_free(shell_plugin_name, TRUE);
+       }
+
+       if (shell_comp_cls_name) {
+               g_string_free(shell_comp_cls_name, TRUE);
+       }
+
+       if (str) {
+               ret = g_string_free(str, FALSE);
+       } else {
+               ret = NULL;
+       }
+
+       return ret;
+}
diff --git a/src/string-format/format-plugin-comp-cls-name.h b/src/string-format/format-plugin-comp-cls-name.h
new file mode 100644 (file)
index 0000000..54f7b24
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef _BABELTRACE_STRING_FORMAT_FORMAT_PLUGIN_COMP_CLS_NAME_H
+#define _BABELTRACE_STRING_FORMAT_FORMAT_PLUGIN_COMP_CLS_NAME_H
+
+/*
+ * Copyright EfficiOS, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <babeltrace2/babeltrace.h>
+#include <common/common.h>
+#include <common/macros.h>
+#include <glib.h>
+
+BT_HIDDEN
+gchar *format_plugin_comp_cls_opt(const char *plugin_name,
+               const char *comp_cls_name, bt_component_class_type type,
+               enum bt_common_color_when use_colors);
+
+#endif /* _BABELTRACE_STRING_FORMAT_FORMAT_PLUGIN_COMP_CLS_NAME_H */
This page took 0.031881 seconds and 4 git commands to generate.