summaryrefslogtreecommitdiffstats
path: root/cmd-confirm-before.c
diff options
context:
space:
mode:
authornicm <nicm>2021-08-23 12:33:55 +0000
committernicm <nicm>2021-08-23 12:33:55 +0000
commit210e71edf36198e3f22525e7f548a71a5681d25c (patch)
tree26ab4eab3dcd9bc89970b9c193085e44a3b10a4c /cmd-confirm-before.c
parent03b83a5a34a4257be9029e1f5195dcddcd531caa (diff)
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.c49
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);
}