X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fcli%2Fbabeltrace2-cfg-cli-args.c;h=748738af3df8450b7abecd14d3a6418e394697f8;hb=ca914e549e4ff113292102d27edd6af662b860d3;hp=fa1c1f54ee3ffb908e755ac31c258fce7a6e7dd8;hpb=a26b3fc6d6f5765c0e89e975bc74466dd1219541;p=babeltrace.git diff --git a/src/cli/babeltrace2-cfg-cli-args.c b/src/cli/babeltrace2-cfg-cli-args.c index fa1c1f54..748738af 100644 --- a/src/cli/babeltrace2-cfg-cli-args.c +++ b/src/cli/babeltrace2-cfg-cli-args.c @@ -40,49 +40,13 @@ #include "babeltrace2-cfg.h" #include "babeltrace2-cfg-cli-args.h" #include "babeltrace2-cfg-cli-args-connect.h" -#include "babeltrace2-cfg-cli-params-arg.h" +#include "param-parse/param-parse.h" #include "babeltrace2-log-level.h" #include "babeltrace2-plugins.h" #include "babeltrace2-query.h" #include "autodisc/autodisc.h" #include "common/version.h" -/* INI-style parsing FSM states */ -enum ini_parsing_fsm_state { - /* Expect a map key (identifier) */ - INI_EXPECT_MAP_KEY, - - /* Expect an equal character ('=') */ - INI_EXPECT_EQUAL, - - /* Expect a value */ - INI_EXPECT_VALUE, - - /* Expect a comma character (',') */ - INI_EXPECT_COMMA, -}; - -/* INI-style parsing state variables */ -struct ini_parsing_state { - /* Lexical scanner (owned by this) */ - GScanner *scanner; - - /* Output map value object being filled (owned by this) */ - bt_value *params; - - /* Next expected FSM state */ - enum ini_parsing_fsm_state expecting; - - /* Last decoded map key (owned by this) */ - char *last_map_key; - - /* Complete INI-style string to parse (not owned by this) */ - const char *arg; - - /* Error buffer (not owned by this) */ - GString *ini_error; -}; - /* Offset option with "is set" boolean */ struct offset_opt { int64_t value; @@ -1382,6 +1346,8 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], char *plugin_name = NULL, *comp_cls_name = NULL; struct bt_argpar_parse_ret argpar_parse_ret = { 0 }; struct bt_argpar_item_non_opt *non_opt; + GString *substring = NULL; + size_t end_pos; *retcode = 0; cfg = bt_config_help_create(plugin_paths, default_log_level); @@ -1423,18 +1389,36 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], } non_opt = argpar_parse_ret.items->pdata[0]; - plugin_comp_cls_names(non_opt->arg, NULL, &plugin_name, &comp_cls_name, - &cfg->cmd_data.help.cfg_component->type); - if (plugin_name && comp_cls_name) { - /* Component class help */ + + /* Look for unescaped dots in the argument. */ + substring = bt_common_string_until(non_opt->arg, ".\\", ".", &end_pos); + if (!substring) { + BT_CLI_LOGE_APPEND_CAUSE("Could not consume argument: arg=%s", + non_opt->arg); + goto error; + } + + if (end_pos == strlen(non_opt->arg)) { + /* Didn't find an unescaped dot, treat it as a plugin name. */ + g_string_assign(cfg->cmd_data.help.cfg_component->plugin_name, + non_opt->arg); + } else { + /* + * Found an unescaped dot, treat it as a component class name. + */ + plugin_comp_cls_names(non_opt->arg, NULL, &plugin_name, &comp_cls_name, + &cfg->cmd_data.help.cfg_component->type); + if (!plugin_name || !comp_cls_name) { + BT_CLI_LOGE_APPEND_CAUSE( + "Could not parse argument as a component class name: arg=%s", + non_opt->arg); + goto error; + } + g_string_assign(cfg->cmd_data.help.cfg_component->plugin_name, plugin_name); g_string_assign(cfg->cmd_data.help.cfg_component->comp_cls_name, comp_cls_name); - } else { - /* Fall back to plugin help */ - g_string_assign(cfg->cmd_data.help.cfg_component->plugin_name, - non_opt->arg); } goto end; @@ -1447,6 +1431,10 @@ end: g_free(plugin_name); g_free(comp_cls_name); + if (substring) { + g_string_free(substring, TRUE); + } + bt_argpar_parse_ret_fini(&argpar_parse_ret); return cfg; @@ -1540,7 +1528,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], case OPT_PARAMS: { bt_value_put_ref(params); - params = cli_value_from_arg(arg, error_str); + params = bt_param_parse(arg, error_str); if (!params) { BT_CLI_LOGE_APPEND_CAUSE("Invalid format for --params option's argument:\n %s", error_str->str); @@ -1931,7 +1919,6 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], case OPT_PARAMS: { bt_value *params; - bt_value *params_to_set; if (!cur_cfg_comp) { BT_CLI_LOGE_APPEND_CAUSE("Cannot add parameters to unavailable component:\n %s", @@ -1939,15 +1926,15 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - params = cli_value_from_arg(arg, error_str); + params = bt_param_parse(arg, error_str); if (!params) { BT_CLI_LOGE_APPEND_CAUSE("Invalid format for --params option's argument:\n %s", error_str->str); goto error; } - extend_status = bt_value_map_extend( - cur_cfg_comp->params, params, ¶ms_to_set); + extend_status = bt_value_map_extend(cur_cfg_comp->params, + params); BT_VALUE_PUT_REF_AND_RESET(params); if (extend_status != BT_VALUE_MAP_EXTEND_STATUS_OK) { BT_CLI_LOGE_APPEND_CAUSE("Cannot extend current component parameters with --params option's argument:\n %s", @@ -1955,7 +1942,6 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - BT_OBJECT_MOVE_REF(cur_cfg_comp->params, params_to_set); break; } case OPT_LOG_LEVEL: @@ -1975,7 +1961,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], break; case OPT_BASE_PARAMS: { - bt_value *params = cli_value_from_arg(arg, error_str); + bt_value *params = bt_param_parse(arg, error_str); if (!params) { BT_CLI_LOGE_APPEND_CAUSE("Invalid format for --base-params option's argument:\n %s",