values: make `bt_value_map_extend()` extend the provided base map
[babeltrace.git] / src / cli / babeltrace2-cfg-cli-args.c
index fa1c1f54ee3ffb908e755ac31c258fce7a6e7dd8..748738af3df8450b7abecd14d3a6418e394697f8 100644 (file)
 #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, &params_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",
This page took 0.028968 seconds and 4 git commands to generate.