#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;
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);
}
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;
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;
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);
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);
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",
fprintf(fp, "\n");
fprintf(fp, "Implicit `source.ctf.fs` component options:\n");
fprintf(fp, "\n");
+ fprintf(fp, " --clock-force-correlate Force the origin of all clocks\n");
+ fprintf(fp, " to the Unix epoch\n");
fprintf(fp, " --clock-offset=SEC Set clock offset to SEC seconds\n");
fprintf(fp, " --clock-offset-ns=NS Set clock offset to NS ns\n");
fprintf(fp, "\n");
fprintf(fp, " -w, --output=PATH Write output text to PATH instead of\n");
fprintf(fp, " the standard output\n");
fprintf(fp, "\n");
- fprintf(fp, "Implicit `filter.utils.muxer` component options:\n");
- fprintf(fp, "\n");
- fprintf(fp, " --clock-force-correlate Assume that clocks are inherently\n");
- fprintf(fp, " correlated across traces\n");
- fprintf(fp, "\n");
fprintf(fp, "Implicit `filter.utils.trimmer` component options:\n");
fprintf(fp, "\n");
fprintf(fp, " -b, --begin=BEGIN Set the beginning time of the conversion\n");
const char *auto_source_discovery_restrict_plugin_name = NULL;
const char *auto_source_discovery_restrict_component_class_name = NULL;
+ bool ctf_fs_source_force_clock_class_unix_epoch_origin = false;
gchar *ctf_fs_source_clock_class_offset_arg = NULL;
gchar *ctf_fs_source_clock_class_offset_ns_arg = NULL;
*retcode = 0;
implicit_text_args.exists = true;
break;
case OPT_CLOCK_FORCE_CORRELATE:
- append_implicit_component_param(
- &implicit_muxer_args,
- "assume-absolute-clock-classes", "yes");
+ ctf_fs_source_force_clock_class_unix_epoch_origin = true;
break;
case OPT_CLOCK_GMT:
append_implicit_component_param(
}
}
+
+ /*
+ * If --clock-force-correlated was given, apply it to any src.ctf.fs
+ * component.
+ */
+ if (ctf_fs_source_force_clock_class_unix_epoch_origin) {
+ int n;
+
+ n = append_multiple_implicit_components_param(
+ discovered_source_args, "source.ctf.fs", "force-clock-class-origin-unix-epoch",
+ "yes");
+ if (n == 0) {
+ BT_CLI_LOGE_APPEND_CAUSE("--clock-force-correlate specified, but no source.ctf.fs component instantiated.");
+ goto error;
+ }
+ }
+
/* If --clock-offset was given, apply it to any src.ctf.fs component. */
if (ctf_fs_source_clock_class_offset_arg) {
int n;