diff options
author | nicm <nicm> | 2021-08-27 17:25:55 +0000 |
---|---|---|
committer | nicm <nicm> | 2021-08-27 17:25:55 +0000 |
commit | daec63e5e6eb3390d53f4bf7f8a327df77e46c95 (patch) | |
tree | cf78624cb0b4a80a6eeb8e29b368ea4f9beb5610 /cmd-command-prompt.c | |
parent | fd756a150b43d319d08ac4117f34edef9e0438c4 (diff) | |
download | rtmux-daec63e5e6eb3390d53f4bf7f8a327df77e46c95.tar.gz rtmux-daec63e5e6eb3390d53f4bf7f8a327df77e46c95.tar.bz2 rtmux-daec63e5e6eb3390d53f4bf7f8a327df77e46c95.zip |
Replace %% in command lists (by copying them) for template arguments ,
this means they can be used with {} as well. Also make argument
processing from an existing vector preserve commands. GitHub issue 2858.
Diffstat (limited to 'cmd-command-prompt.c')
-rw-r--r-- | cmd-command-prompt.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c index 737c44c7..820053ec 100644 --- a/cmd-command-prompt.c +++ b/cmd-command-prompt.c @@ -169,11 +169,13 @@ static int cmd_command_prompt_callback(struct client *c, void *data, const char *s, int done) { - struct cmd_command_prompt_cdata *cdata = data; - char *error; - struct cmdq_item *item = cdata->item, *new_item; - struct cmd_list *cmdlist; - struct cmd_command_prompt_prompt *prompt; + struct cmd_command_prompt_cdata *cdata = data; + char *error; + struct cmdq_item *item = cdata->item, *new_item; + struct cmd_list *cmdlist; + struct cmd_command_prompt_prompt *prompt; + int argc = 0; + char **argv = NULL; if (s == NULL) goto out; @@ -181,7 +183,6 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, if (cdata->flags & PROMPT_INCREMENTAL) goto out; - cmd_append_argv(&cdata->argc, &cdata->argv, s); if (++cdata->current != cdata->count) { prompt = &cdata->prompts[cdata->current]; status_prompt_update(c, prompt->prompt, prompt->input); @@ -189,8 +190,15 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, } } - cmdlist = args_make_commands(cdata->state, cdata->argc, cdata->argv, - &error); + argc = cdata->argc; + argv = cmd_copy_argv(cdata->argc, cdata->argv); + cmd_append_argv(&argc, &argv, s); + if (done) { + cdata->argc = argc; + cdata->argv = cmd_copy_argv(argc, argv); + } + + cmdlist = args_make_commands(cdata->state, argc, argv, &error); if (cmdlist == NULL) { cmdq_append(c, cmdq_get_error(error)); free(error); @@ -201,6 +209,7 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, new_item = cmdq_get_command(cmdlist, cmdq_get_state(item)); cmdq_insert_after(item, new_item); } + cmd_free_argv(argc, argv); if (c->prompt_inputcb != cmd_command_prompt_callback) return (1); |