From bed8ebb93ce37f7be10e7968a5f03810de9aa1e2 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 21 Nov 2019 16:58:12 -0500 Subject: [PATCH] string-format: introduce function to format component class name 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 Reviewed-on: https://review.lttng.org/c/babeltrace/+/2432 Tested-by: jenkins --- configure.ac | 1 + src/Makefile.am | 1 + src/cli/Makefile.am | 1 + src/cli/babeltrace2.c | 143 +++++++----------- src/string-format/Makefile.am | 5 + .../format-plugin-comp-cls-name.c | 110 ++++++++++++++ .../format-plugin-comp-cls-name.h | 36 +++++ 7 files changed, 210 insertions(+), 87 deletions(-) create mode 100644 src/string-format/Makefile.am create mode 100644 src/string-format/format-plugin-comp-cls-name.c create mode 100644 src/string-format/format-plugin-comp-cls-name.h diff --git a/configure.ac b/configure.ac index c7899e46..3c2955bf 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/Makefile.am b/src/Makefile.am index 4323bfc3..2b7be0cb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,6 +9,7 @@ SUBDIRS = \ logging \ ctf-writer \ lib \ + string-format \ python-plugin-provider \ plugins \ param-parse \ diff --git a/src/cli/Makefile.am b/src/cli/Makefile.am index cda8977f..fe4a8e26 100644 --- a/src/cli/Makefile.am +++ b/src/cli/Makefile.am @@ -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 \ diff --git a/src/cli/babeltrace2.c b/src/cli/babeltrace2.c index 0339426d..f5164ccb 100644 --- a/src/cli/babeltrace2.c +++ b/src/cli/babeltrace2.c @@ -27,6 +27,7 @@ #include #include "common/common.h" +#include "string-format/format-plugin-comp-cls-name.h" #include #include #include @@ -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 index 00000000..9041cf88 --- /dev/null +++ b/src/string-format/Makefile.am @@ -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 index 00000000..c6b87b23 --- /dev/null +++ b/src/string-format/format-plugin-comp-cls-name.c @@ -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 + +#include "format-plugin-comp-cls-name.h" + +#include + + +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 index 00000000..54f7b248 --- /dev/null +++ b/src/string-format/format-plugin-comp-cls-name.h @@ -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 +#include +#include +#include + +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 */ -- 2.34.1