X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=plugins%2Ftext%2Ftext.c;h=da659eeb741bbcf6f226f4de19f7c8db4c3e30fc;hb=6e1bc0df89a0af874e3c1f2617e576cbf5e73cf7;hp=eca7ed73cfe05792df6fe05bc09314f14fe35544;hpb=6a18b281a2bf9df3ac2a3ff08601998c52e40bcd;p=babeltrace.git diff --git a/plugins/text/text.c b/plugins/text/text.c index eca7ed73..da659eeb 100644 --- a/plugins/text/text.c +++ b/plugins/text/text.c @@ -32,11 +32,42 @@ #include #include #include +#include +#include #include #include #include #include "text.h" +#define PLUGIN_NAME "text" + +static +const char *plugin_options[] = { + "output-path", + "debug-info-dir", + "debug-info-target-prefix", + "debug-info-full-path", + "no-delta", + "clock-cycles", + "clock-seconds", + "clock-date", + "clock-gmt", + "name-default", /* show/hide */ + "name-payload", + "name-context", + "name-scope", + "name-header", + "field-default", /* show/hide */ + "field-trace", + "field-trace:hostname", + "field-trace:domain", + "field-trace:procname", + "field-trace:vpid", + "field-loglevel", + "field-emf", + "field-callsite", +}; + static const char *loglevel_str [] = { [LOGLEVEL_EMERG] = "TRACE_EMERG", @@ -60,6 +91,9 @@ static void destroy_text_data(struct text_component *text) { (void) g_string_free(text->string, TRUE); + g_free(text->options.output_path); + g_free(text->options.debug_info_dir); + g_free(text->options.debug_info_target_prefix); g_free(text); } @@ -94,7 +128,7 @@ void destroy_text(struct bt_component *component) static enum bt_component_status handle_notification(struct text_component *text, - struct bt_notification *notification) + struct bt_notification *notification) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; @@ -171,9 +205,433 @@ end: return ret; } +static +enum bt_component_status add_params_to_map(struct bt_value *plugin_opt_map) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + unsigned int i; + + for (i = 0; i < BT_ARRAY_SIZE(plugin_options); i++) { + const char *key = plugin_options[i]; + enum bt_value_status status; + + status = bt_value_map_insert(plugin_opt_map, key, bt_value_null); + switch (status) { + case BT_VALUE_STATUS_OK: + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + } +end: + return ret; +} + +static +bool check_param_exists(const char *key, struct bt_value *object, void *data) +{ + struct text_component *text = data; + struct bt_value *plugin_opt_map = text->plugin_opt_map; + + if (!bt_value_map_get(plugin_opt_map, key)) { + fprintf(text->err, + "[warning] Parameter \"%s\" unknown to \"%s\" plugin\n", + key, PLUGIN_NAME); + } + return true; +} + +static +enum bt_component_status apply_one_string(const char *key, + struct bt_value *params, + char **option) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_value *value = NULL; + enum bt_value_status status; + const char *str; + + value = bt_value_map_get(params, key); + if (!value) { + goto end; + } + if (bt_value_is_null(value)) { + goto end; + } + status = bt_value_string_get(value, &str); + switch (status) { + case BT_VALUE_STATUS_OK: + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + *option = g_strdup(str); +end: + bt_put(value); + return ret; +} + +static +enum bt_component_status apply_one_bool(const char *key, + struct bt_value *params, + bool *option, + bool *found) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_value *value = NULL; + enum bt_value_status status; + + value = bt_value_map_get(params, key); + if (!value) { + goto end; + } + status = bt_value_bool_get(value, option); + switch (status) { + case BT_VALUE_STATUS_OK: + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + if (found) { + *found = true; + } +end: + bt_put(value); + return ret; +} + +static +enum bt_component_status apply_params(struct text_component *text, + struct bt_value *params) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + enum bt_value_status status; + bool value, found; + char *str = NULL; + + text->plugin_opt_map = bt_value_map_create(); + if (!text->plugin_opt_map) { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + ret = add_params_to_map(text->plugin_opt_map); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + /* Report unknown parameters. */ + status = bt_value_map_foreach(params, check_param_exists, text); + switch (status) { + case BT_VALUE_STATUS_OK: + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + /* Known parameters. */ + ret = apply_one_string("output-path", + params, + &text->options.output_path); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + + ret = apply_one_string("debug-info-dir", + params, + &text->options.debug_info_dir); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + + ret = apply_one_string("debug-info-target-prefix", + params, + &text->options.debug_info_target_prefix); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + + value = false; /* Default. */ + ret = apply_one_bool("debug-info-full-path", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.debug_info_full_path = value; + + value = false; /* Default. */ + ret = apply_one_bool("no-delta", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.print_delta_field = !value; /* Reverse logic. */ + + value = false; /* Default. */ + ret = apply_one_bool("clock-cycles", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.print_timestamp_cycles = value; + + value = false; /* Default. */ + ret = apply_one_bool("clock-seconds", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.clock_seconds = value; + + value = false; /* Default. */ + ret = apply_one_bool("clock-date", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.clock_date = value; + + value = false; /* Default. */ + ret = apply_one_bool("clock-gmt", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.clock_gmt = value; + + /* Names. */ + ret = apply_one_string("name-default", params, &str); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (!str) { + text->options.name_default = TEXT_DEFAULT_UNSET; + } else if (!strcmp(str, "show")) { + text->options.name_default = TEXT_DEFAULT_SHOW; + } else if (!strcmp(str, "hide")) { + text->options.name_default = TEXT_DEFAULT_HIDE; + } else { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + g_free(str); + str = NULL; + + switch (text->options.name_default) { + case TEXT_DEFAULT_UNSET: + text->options.print_payload_field_names = true; + text->options.print_context_field_names = true; + text->options.print_header_field_names = false; + text->options.print_scope_field_names = false; + break; + case TEXT_DEFAULT_SHOW: + text->options.print_payload_field_names = true; + text->options.print_context_field_names = true; + text->options.print_header_field_names = true; + text->options.print_scope_field_names = true; + break; + case TEXT_DEFAULT_HIDE: + text->options.print_payload_field_names = false; + text->options.print_context_field_names = false; + text->options.print_header_field_names = false; + text->options.print_scope_field_names = false; + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + value = false; + found = false; + ret = apply_one_bool("name-payload", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_payload_field_names = value; + } + + value = false; + found = false; + ret = apply_one_bool("name-context", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_context_field_names = value; + } + + value = false; + found = false; + ret = apply_one_bool("name-header", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_header_field_names = value; + } + + value = false; + found = false; + ret = apply_one_bool("name-scope", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_scope_field_names = value; + } + + /* Fields. */ + ret = apply_one_string("field-default", params, &str); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (!str) { + text->options.field_default = TEXT_DEFAULT_UNSET; + } else if (!strcmp(str, "show")) { + text->options.field_default = TEXT_DEFAULT_SHOW; + } else if (!strcmp(str, "hide")) { + text->options.field_default = TEXT_DEFAULT_HIDE; + } else { + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + g_free(str); + str = NULL; + + switch (text->options.field_default) { + case TEXT_DEFAULT_UNSET: + text->options.print_trace_field = false; + text->options.print_trace_hostname_field = true; + text->options.print_trace_domain_field = false; + text->options.print_trace_procname_field = true; + text->options.print_trace_vpid_field = true; + text->options.print_loglevel_field = false; + text->options.print_emf_field = false; + text->options.print_emf_field = false; + text->options.print_callsite_field = false; + break; + case TEXT_DEFAULT_SHOW: + text->options.print_trace_field = true; + text->options.print_trace_hostname_field = true; + text->options.print_trace_domain_field = true; + text->options.print_trace_procname_field = true; + text->options.print_trace_vpid_field = true; + text->options.print_loglevel_field = true; + text->options.print_emf_field = true; + text->options.print_emf_field = true; + text->options.print_callsite_field = true; + break; + case TEXT_DEFAULT_HIDE: + text->options.print_trace_field = false; + text->options.print_trace_hostname_field = false; + text->options.print_trace_domain_field = false; + text->options.print_trace_procname_field = false; + text->options.print_trace_vpid_field = false; + text->options.print_loglevel_field = false; + text->options.print_emf_field = false; + text->options.print_emf_field = false; + text->options.print_callsite_field = false; + break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + value = false; + found = false; + ret = apply_one_bool("field-trace", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_trace_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-trace:hostname", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_trace_hostname_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-trace:domain", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_trace_domain_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-trace:procname", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_trace_procname_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-trace:vpid", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_trace_vpid_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-loglevel", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_loglevel_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-emf", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_emf_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-emf", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_emf_field = value; + } + + value = false; + found = false; + ret = apply_one_bool("field-callsite", params, &value, &found); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + if (found) { + text->options.print_callsite_field = value; + } +end: + bt_put(text->plugin_opt_map); + text->plugin_opt_map = NULL; + g_free(str); + return ret; +} + static enum bt_component_status text_component_init( - struct bt_component *component, struct bt_value *params) + struct bt_component *component, struct bt_value *params) { enum bt_component_status ret; struct text_component *text = create_text(); @@ -183,6 +641,14 @@ enum bt_component_status text_component_init( goto end; } + text->out = stdout; + text->err = stderr; + + ret = apply_params(text, params); + if (ret != BT_COMPONENT_STATUS_OK) { + goto error; + } + ret = bt_component_set_destroy_cb(component, destroy_text); if (ret != BT_COMPONENT_STATUS_OK) { @@ -199,9 +665,6 @@ enum bt_component_status text_component_init( if (ret != BT_COMPONENT_STATUS_OK) { goto error; } - - text->out = stdout; - text->err = stderr; end: return ret; error: @@ -216,7 +679,7 @@ BT_PLUGIN_AUTHOR("Jérémie Galarneau"); BT_PLUGIN_LICENSE("MIT"); BT_PLUGIN_COMPONENT_CLASSES_BEGIN -BT_PLUGIN_SINK_COMPONENT_CLASS_ENTRY("text", +BT_PLUGIN_SINK_COMPONENT_CLASS_ENTRY(PLUGIN_NAME, "Formats CTF-IR to text. Formerly known as ctf-text.", text_component_init) BT_PLUGIN_COMPONENT_CLASSES_END