diff options
author | nicm <nicm> | 2021-08-23 12:33:55 +0000 |
---|---|---|
committer | nicm <nicm> | 2021-08-23 12:33:55 +0000 |
commit | 210e71edf36198e3f22525e7f548a71a5681d25c (patch) | |
tree | 26ab4eab3dcd9bc89970b9c193085e44a3b10a4c /cmd-confirm-before.c | |
parent | 03b83a5a34a4257be9029e1f5195dcddcd531caa (diff) | |
download | rtmux-210e71edf36198e3f22525e7f548a71a5681d25c.tar.gz rtmux-210e71edf36198e3f22525e7f548a71a5681d25c.tar.bz2 rtmux-210e71edf36198e3f22525e7f548a71a5681d25c.zip |
Move command argument parsing common functions and don't bother to parse
again if given a command rather than a string.
Diffstat (limited to 'cmd-confirm-before.c')
-rw-r--r-- | cmd-confirm-before.c | 49 |
1 files changed, 19 insertions, 30 deletions
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index 580c379a..4fe43302 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -47,9 +47,8 @@ const struct cmd_entry cmd_confirm_before_entry = { }; struct cmd_confirm_before_data { - char *cmd; struct cmdq_item *item; - struct cmd_parse_input pi; + struct cmd_list *cmdlist; }; static enum cmd_retval @@ -59,31 +58,25 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) struct cmd_confirm_before_data *cdata; struct client *tc = cmdq_get_target_client(item); struct cmd_find_state *target = cmdq_get_target(item); - char *cmd, *copy, *new_prompt, *tmp; - const char *prompt; + char *new_prompt; + const char *prompt, *cmd; int wait = !args_has(args, 'b'); cdata = xcalloc(1, sizeof *cdata); - cdata->cmd = xstrdup(args_string(args, 0)); + cdata->cmdlist = args_make_commands_now(self, item, 0); + if (cdata->cmdlist == NULL) + return (CMD_RETURN_ERROR); + + if (wait) + cdata->item = item; if ((prompt = args_get(args, 'p')) != NULL) xasprintf(&new_prompt, "%s ", prompt); else { - tmp = copy = xstrdup(cdata->cmd); - cmd = strsep(&tmp, " \t"); + cmd = cmd_get_entry(cmd_list_first(cdata->cmdlist))->name; xasprintf(&new_prompt, "Confirm '%s'? (y/n) ", cmd); - free(copy); } - cmd_get_source(self, &cdata->pi.file, &cdata->pi.line); - if (wait) - cdata->pi.item = item; - cdata->pi.c = tc; - cmd_find_copy_state(&cdata->pi.fs, target); - - if (wait) - cdata->item = item; - status_prompt_set(tc, target, new_prompt, NULL, cmd_confirm_before_callback, cmd_confirm_before_free, cdata, PROMPT_SINGLE, PROMPT_TYPE_COMMAND); @@ -99,10 +92,7 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, __unused int done) { struct cmd_confirm_before_data *cdata = data; - const char *cmd = cdata->cmd; - char *error; - struct cmdq_item *item = cdata->item; - enum cmd_parse_status status; + struct cmdq_item *item = cdata->item, *new_item; int retcode = 1; if (c->flags & CLIENT_DEAD) @@ -114,14 +104,13 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, goto out; retcode = 0; - if (item != NULL) { - status = cmd_parse_and_insert(cmd, &cdata->pi, item, - cmdq_get_state(item), &error); - } else - status = cmd_parse_and_append(cmd, &cdata->pi, c, NULL, &error); - if (status == CMD_PARSE_ERROR) { - cmdq_append(c, cmdq_get_error(error)); - free(error); + if (item == NULL) { + new_item = cmdq_get_command(cdata->cmdlist, NULL); + cmdq_append(c, new_item); + } else { + new_item = cmdq_get_command(cdata->cmdlist, + cmdq_get_state(item)); + cmdq_insert_after(item, new_item); } out: @@ -139,6 +128,6 @@ cmd_confirm_before_free(void *data) { struct cmd_confirm_before_data *cdata = data; - free(cdata->cmd); + cmd_list_free(cdata->cmdlist); free(cdata); } |