summaryrefslogtreecommitdiffstats
path: root/cmd-parse.y
diff options
context:
space:
mode:
authornicm <nicm>2021-08-21 18:39:07 +0000
committernicm <nicm>2021-08-21 18:39:07 +0000
commit326d2ef234cd8838700e914a0d780f46be50904c (patch)
tree2b273d79f78895153aed0fa9a2f47cc4e1f9f08a /cmd-parse.y
parent63b6eec27889e4c38b4a051a1bb3463f153cc2c8 (diff)
Pass typed arguments out of the parser into the arguments list and let
it convert them into strings.
Diffstat (limited to 'cmd-parse.y')
-rw-r--r--cmd-parse.y29
1 files changed, 19 insertions, 10 deletions
diff --git a/cmd-parse.y b/cmd-parse.y
index 6be5d8a0..57d0e84e 100644
--- a/cmd-parse.y
+++ b/cmd-parse.y
@@ -794,39 +794,48 @@ cmd_parse_build_command(struct cmd_parse_command *cmd,
struct cmd_parse_input *pi, struct cmd_parse_result *pr)
{
struct cmd_parse_argument *arg;
- struct cmd_list *cmdlist;
+ struct cmd_list *cmdlist = NULL;
struct cmd *add;
- char *s, **argv = NULL, *cause;
- int argc = 0;
+ char *cause;
+ struct args_value *values = NULL;
+ u_int count = 0, idx;
if (cmd_parse_expand_alias(cmd, pi, pr, &cmdlist))
return (cmdlist);
TAILQ_FOREACH(arg, &cmd->arguments, entry) {
+ values = xreallocarray(values, count + 1, sizeof *values);
switch (arg->type) {
case CMD_PARSE_STRING:
- cmd_append_argv(&argc, &argv, arg->string);
+ values[count].type = ARGS_STRING;
+ values[count].string = xstrdup(arg->string);
break;
case CMD_PARSE_COMMANDS:
cmd_parse_build_commands(arg->commands, pi, pr);
if (pr->status != CMD_PARSE_SUCCESS)
- return (NULL);
- s = cmd_list_print(pr->cmdlist, 0);
- cmd_append_argv(&argc, &argv, s);
- free(s);
+ goto out;
+ values[count].type = ARGS_COMMANDS;
+ values[count].cmdlist = pr->cmdlist;
+ values[count].cmdlist->references++;
break;
}
+ count++;
}
- add = cmd_parse(argc, argv, pi->file, pi->line, &cause);
+ add = cmd_parse(values, count, pi->file, pi->line, &cause);
if (add == NULL) {
pr->status = CMD_PARSE_ERROR;
pr->error = cmd_parse_get_error(pi->file, pi->line, cause);
free(cause);
- return (NULL);
+ goto out;
}
cmdlist = cmd_list_new();
cmd_list_append(cmdlist, add);
+
+out:
+ for (idx = 0; idx < count; idx++)
+ args_free_value(&values[idx]);
+ free(values);
return (cmdlist);
}