summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arguments.c95
-rw-r--r--cmd-bind-key.c20
-rw-r--r--cmd-command-prompt.c33
-rw-r--r--cmd-confirm-before.c12
-rw-r--r--cmd-display-menu.c52
-rw-r--r--cmd-display-message.c13
-rw-r--r--cmd-display-panes.c4
-rw-r--r--cmd-find-window.c2
-rw-r--r--cmd-if-shell.c21
-rw-r--r--cmd-list-keys.c17
-rw-r--r--cmd-load-buffer.c2
-rw-r--r--cmd-new-session.c26
-rw-r--r--cmd-new-window.c27
-rw-r--r--cmd-parse.y2
-rw-r--r--cmd-pipe-pane.c4
-rw-r--r--cmd-queue.c22
-rw-r--r--cmd-refresh-client.c23
-rw-r--r--cmd-rename-session.c2
-rw-r--r--cmd-rename-window.c2
-rw-r--r--cmd-resize-pane.c5
-rw-r--r--cmd-resize-window.c5
-rw-r--r--cmd-respawn-pane.c22
-rw-r--r--cmd-respawn-window.c22
-rw-r--r--cmd-run-shell.c7
-rw-r--r--cmd-save-buffer.c2
-rw-r--r--cmd-select-layout.c18
-rw-r--r--cmd-send-keys.c10
-rw-r--r--cmd-set-buffer.c6
-rw-r--r--cmd-set-environment.c19
-rw-r--r--cmd-set-option.c20
-rw-r--r--cmd-show-environment.c8
-rw-r--r--cmd-show-options.c4
-rw-r--r--cmd-source-file.c20
-rw-r--r--cmd-split-window.c31
-rw-r--r--cmd-unbind-key.c10
-rw-r--r--cmd-wait-for.c8
-rw-r--r--cmd.c11
-rw-r--r--format.c4
-rw-r--r--server-client.c2
-rw-r--r--tmux.h27
-rw-r--r--window-buffer.c4
-rw-r--r--window-client.c4
-rw-r--r--window-copy.c169
-rw-r--r--window-tree.c4
44 files changed, 431 insertions, 390 deletions
diff --git a/arguments.c b/arguments.c
index f6f6ecaf..92072ad5 100644
--- a/arguments.c
+++ b/arguments.c
@@ -28,10 +28,6 @@
* Manipulate command arguments.
*/
-struct args_value {
- char *value;
- TAILQ_ENTRY(args_value) entry;
-};
TAILQ_HEAD(args_values, args_value);
struct args_entry {
@@ -41,6 +37,12 @@ struct args_entry {
RB_ENTRY(args_entry) entry;
};
+struct args {
+ struct args_tree tree;
+ int argc;
+ char **argv;
+};
+
static struct args_entry *args_find(struct args *, u_char);
static int args_cmp(struct args_entry *, struct args_entry *);
@@ -76,7 +78,7 @@ args_create(void)
/* Parse an argv and argc into a new argument set. */
struct args *
-args_parse(const char *template, int argc, char **argv)
+args_parse(const char *template, int argc, char **argv, int lower, int upper)
{
struct args *args;
int opt;
@@ -102,6 +104,10 @@ args_parse(const char *template, int argc, char **argv)
args->argc = argc;
args->argv = cmd_copy_argv(argc, argv);
+ if ((lower != -1 && argc < lower) || (upper != -1 && argc > upper)) {
+ args_free(args);
+ return (NULL);
+ }
return (args);
}
@@ -129,11 +135,19 @@ args_free(struct args *args)
free(args);
}
+/* Convert arguments to vector. */
+void
+args_vector(struct args *args, int *argc, char ***argv)
+{
+ *argc = args->argc;
+ *argv = cmd_copy_argv(args->argc, args->argv);
+}
+
/* Add to string. */
static void printflike(3, 4)
args_print_add(char **buf, size_t *len, const char *fmt, ...)
{
- va_list ap;
+ va_list ap;
char *s;
size_t slen;
@@ -148,23 +162,6 @@ args_print_add(char **buf, size_t *len, const char *fmt, ...)
free(s);
}
-/* Add value to string. */
-static void
-args_print_add_value(char **buf, size_t *len, struct args_entry *entry,
- struct args_value *value)
-{
- char *escaped;
-
- if (**buf != '\0')
- args_print_add(buf, len, " -%c ", entry->flag);
- else
- args_print_add(buf, len, "-%c ", entry->flag);
-
- escaped = args_escape(value->value);
- args_print_add(buf, len, "%s", escaped);
- free(escaped);
-}
-
/* Add argument to string. */
static void
args_print_add_argument(char **buf, size_t *len, const char *argument)
@@ -183,7 +180,7 @@ args_print_add_argument(char **buf, size_t *len, const char *argument)
char *
args_print(struct args *args)
{
- size_t len;
+ size_t len;
char *buf;
int i;
u_int j;
@@ -206,8 +203,13 @@ args_print(struct args *args)
/* Then the flags with arguments. */
RB_FOREACH(entry, args_tree, &args->tree) {
- TAILQ_FOREACH(value, &entry->values, entry)
- args_print_add_value(&buf, &len, entry, value);
+ TAILQ_FOREACH(value, &entry->values, entry) {
+ if (*buf != '\0')
+ args_print_add(&buf, &len, " -%c", entry->flag);
+ else
+ args_print_add(&buf, &len, "-%c", entry->flag);
+ args_print_add_argument(&buf, &len, value->value);
+ }
}
/* And finally the argument vector. */
@@ -333,31 +335,38 @@ args_next(struct args_entry **entry)
return ((*entry)->flag);
}
-/* Get first value in argument. */
+/* Get argument count. */
+u_int
+args_count(struct args *args)
+{
+ return (args->argc);
+}
+
+/* Return argument as string. */
const char *
-args_first_value(struct args *args, u_char flag, struct args_value **value)
+args_string(struct args *args, u_int idx)
+{
+ if (idx >= (u_int)args->argc)
+ return (NULL);
+ return (args->argv[idx]);
+}
+
+/* Get first value in argument. */
+struct args_value *
+args_first_value(struct args *args, u_char flag)
{
struct args_entry *entry;
if ((entry = args_find(args, flag)) == NULL)
return (NULL);
-
- *value = TAILQ_FIRST(&entry->values);
- if (*value == NULL)
- return (NULL);
- return ((*value)->value);
+ return (TAILQ_FIRST(&entry->values));
}
/* Get next value in argument. */
-const char *
-args_next_value(struct args_value **value)
+struct args_value *
+args_next_value(struct args_value *value)
{
- if (*value == NULL)
- return (NULL);
- *value = TAILQ_NEXT(*value, entry);
- if (*value == NULL)
- return (NULL);
- return ((*value)->value);
+ return (TAILQ_NEXT(value, entry));
}
/* Convert an argument value to a number. */
@@ -366,7 +375,7 @@ args_strtonum(struct args *args, u_char flag, long long minval,
long long maxval, char **cause)
{
const char *errstr;
- long long ll;
+ long long ll;
struct args_entry *entry;
struct args_value *value;
@@ -408,7 +417,7 @@ args_string_percentage(const char *value, long long minval, long long maxval,
long long curval, char **cause)
{
const char *errstr;
- long long ll;
+ long long ll;
size_t valuelen = strlen(value);
char *copy;
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index b4e4167c..87dd3cf7 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -48,12 +48,13 @@ cmd_bind_key_exec(struct cmd *self, struct cmdq_item *item)
key_code key;
const char *tablename, *note = args_get(args, 'N');
struct cmd_parse_result *pr;
- char **argv = args->argv;
- int argc = args->argc, repeat;
+ char **argv;
+ int argc, repeat;
+ u_int count = args_count(args);
- key = key_string_lookup_string(argv[0]);
+ key = key_string_lookup_string(args_string(args, 0));
if (key == KEYC_NONE || key == KEYC_UNKNOWN) {
- cmdq_error(item, "unknown key: %s", argv[0]);
+ cmdq_error(item, "unknown key: %s", args_string(args, 0));
return (CMD_RETURN_ERROR);
}
@@ -65,11 +66,14 @@ cmd_bind_key_exec(struct cmd *self, struct cmdq_item *item)
tablename = "prefix";
repeat = args_has(args, 'r');
- if (argc != 1) {
- if (argc == 2)
- pr = cmd_parse_from_string(argv[1], NULL);
- else
+ if (count != 1) {
+ if (count == 2)
+ pr = cmd_parse_from_string(args_string(args, 1), NULL);
+ else {
+ args_vector(args, &argc, &argv);
pr = cmd_parse_from_arguments(argc - 1, argv + 1, NULL);
+ cmd_free_argv(argc, argv);
+ }
switch (pr->status) {
case CMD_PARSE_EMPTY:
cmdq_error(item, "empty command");
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index 4943bc15..25ec6817 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -71,9 +71,10 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item)
struct args *args = cmd_get_args(self);
struct client *tc = cmdq_get_target_client(item);
struct cmd_find_state *target = cmdq_get_target(item);
- const char *inputs, *prompts, *type;
+ const char *inputs, *prompts, *type, *s;
struct cmd_command_prompt_cdata *cdata;
- char *prompt, *ptr, *input = NULL;
+ char *prompt, *comma, *input = NULL;
+ u_int count = args_count(args);
size_t n;
int wait = !args_has(args, 'b');
@@ -94,28 +95,30 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item)
if (wait)
cdata->item = item;
- if (args->argc != 0 && args_has(args, 'F'))
- cdata->template = format_single_from_target(item, args->argv[0]);
- else if (args->argc != 0)
- cdata->template = xstrdup(args->argv[0]);
- else
+ if (count != 0) {
+ s = args_string(args, 0);
+ if (args_has(args, 'F'))
+ cdata->template = format_single_from_target(item, s);
+ else
+ cdata->template = xstrdup(s);
+ } else
cdata->template = xstrdup("%1");
if ((prompts = args_get(args, 'p')) != NULL)
cdata->prompts = xstrdup(prompts);
- else if (args->argc != 0) {
+ else if (count != 0) {
n = strcspn(cdata->template, " ,");
- xasprintf(&cdata->prompts, "(%.*s) ", (int) n, cdata->template);
+ xasprintf(&cdata->prompts, "(%.*s) ", (int)n, cdata->template);
} else
cdata->prompts = xstrdup(":");
/* Get first prompt. */
cdata->next_prompt = cdata->prompts;
- ptr = strsep(&cdata->next_prompt, ",");
+ comma = strsep(&cdata->next_prompt, ",");
if (prompts == NULL)
- prompt = xstrdup(ptr);
+ prompt = xstrdup(comma);
else
- xasprintf(&prompt, "%s ", ptr);
+ xasprintf(&prompt, "%s ", comma);
/* Get initial prompt input. */
if ((inputs = args_get(args, 'I')) != NULL) {
@@ -157,7 +160,7 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s,
int done)
{
struct cmd_command_prompt_cdata *cdata = data;
- char *new_template, *prompt, *ptr, *error;
+ char *new_template, *prompt, *comma, *error;
char *input = NULL;
struct cmdq_item *item = cdata->item;
enum cmd_parse_status status;
@@ -177,8 +180,8 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s,
* Check if there are more prompts; if so, get its respective input
* and update the prompt data.
*/
- if (done && (ptr = strsep(&cdata->next_prompt, ",")) != NULL) {
- xasprintf(&prompt, "%s ", ptr);
+ if (done && (comma = strsep(&cdata->next_prompt, ",")) != NULL) {
+ xasprintf(&prompt, "%s ", comma);
input = strsep(&cdata->next_input, ",");
status_prompt_update(c, prompt, input);
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index 51c2fe8e..9f179aaf 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -59,22 +59,22 @@ 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, *ptr;
+ char *cmd, *copy, *new_prompt, *tmp;
const char *prompt;
int wait = !args_has(args, 'b');
+ cdata = xcalloc(1, sizeof *cdata);
+ cdata->cmd = xstrdup(args_string(args, 0));
+
if ((prompt = args_get(args, 'p')) != NULL)
xasprintf(&new_prompt, "%s ", prompt);
else {
- ptr = copy = xstrdup(args->argv[0]);
- cmd = strsep(&ptr, " \t");
+ tmp = copy = xstrdup(cdata->cmd);
+ cmd = strsep(&tmp, " \t");
xasprintf(&new_prompt, "Confirm '%s'? (y/n) ", cmd);
free(copy);
}
- cdata = xcalloc(1, sizeof *cdata);
- cdata->cmd = xstrdup(args->argv[0]);
-
cmd_get_source(self, &cdata->pi.file, &cdata->pi.line);
if (wait)
cdata->pi.item = item;
diff --git a/cmd-display-menu.c b/cmd-display-menu.c
index 9e7bc3a2..49ddf13d 100644
--- a/cmd-display-menu.c
+++ b/cmd-display-menu.c
@@ -260,10 +260,10 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)
struct client *tc = cmdq_get_target_client(item);
struct menu *menu = NULL;
struct menu_item menu_item;
- const char *key;
- char *title, *name;
- int flags = 0, i;
- u_int px, py;
+ const char *key, *name;
+ char *title;
+ int flags = 0;
+ u_int px, py, i, count = args_count(args);
if (tc->overlay_draw != NULL)
return (CMD_RETURN_NORMAL);
@@ -274,24 +274,24 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)
title = xstrdup("");
menu = menu_create(title);
- for (i = 0; i != args->argc; /* nothing */) {
- name = args->argv[i++];
+ for (i = 0; i != count; /* nothing */) {
+ name = args_string(args, i++);
if (*name == '\0') {
menu_add_item(menu, NULL, item, tc, target);
continue;
}
- if (args->argc - i < 2) {
+ if (count - i < 2) {
cmdq_error(item, "not enough arguments");
free(title);
menu_free(menu);
return (CMD_RETURN_ERROR);
}
- key = args->argv[i++];
+ key = args_string(args, i++);
menu_item.name = name;
menu_item.key = key_string_lookup_string(key);
- menu_item.command = args->argv[i++];
+ menu_item.command = args_string(args, i++);
menu_add_item(menu, &menu_item, item, tc, target);
}
@@ -328,11 +328,10 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
struct session *s = target->s;
struct client *tc = cmdq_get_target_client(item);
struct tty *tty = &tc->tty;
- const char *value, *shell[] = { NULL, NULL };
- const char *shellcmd = NULL;
- char *cwd, *cause, **argv = args->argv;
- int flags = 0, argc = args->argc;
- u_int px, py, w, h;
+ const char *value, *shell, *shellcmd = NULL;
+ char *cwd, *cause, **argv = NULL;
+ int flags = 0, argc = 0;
+ u_int px, py, w, h, count = args_count(args);
if (args_has(args, 'C')) {
server_client_clear_overlay(tc);
@@ -373,18 +372,18 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
cwd = format_single_from_target(item, value);
else
cwd = xstrdup(server_client_get_cwd(tc, s));
- if (argc == 0)
+ if (count == 0)
shellcmd = options_get_string(s->options, "default-command");
- else if (argc == 1)
- shellcmd = argv[0];
- if (argc <= 1 && (shellcmd == NULL || *shellcmd == '\0')) {
+ else if (count == 1)
+ shellcmd = args_string(args, 0);
+ if (count <= 1 && (shellcmd == NULL || *shellcmd == '\0')) {
shellcmd = NULL;
- shell[0] = options_get_string(s->options, "default-shell");
- if (!checkshell(shell[0]))
- shell[0] = _PATH_BSHELL;
- argc = 1;
- argv = (char**)shell;
- }
+ shell = options_get_string(s->options, "default-shell");
+ if (!checkshell(shell))
+ shell = _PATH_BSHELL;
+ cmd_append_argv(&argc, &argv, shell);
+ } else
+ args_vector(args, &argc, &argv);
if (args_has(args, 'E') > 1)
flags |= POPUP_CLOSEEXITZERO;
@@ -393,7 +392,10 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
if (args_has(args, 'B'))
flags |= POPUP_NOBORDER;
if (popup_display(flags, item, px, py, w, h, shellcmd, argc, argv, cwd,
- tc, s, NULL, NULL) != 0)
+ tc, s, NULL, NULL) != 0) {
+ cmd_free_argv(argc, argv);
return (CMD_RETURN_NORMAL);
+ }
+ cmd_free_argv(argc, argv);
return (CMD_RETURN_WAIT);
}
diff --git a/cmd-display-message.c b/cmd-display-message.c
index 8fd6a8ff..f4d41e6c 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -68,9 +68,9 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
struct window_pane *wp = target->wp;
const char *template;
char *msg, *cause;
- int delay = -1;
+ int delay = -1, flags;
struct format_tree *ft;
- int flags;
+ u_int count = args_count(args);
if (args_has(args, 'I')) {
if (wp == NULL)
@@ -83,7 +83,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_WAIT);
}
- if (args_has(args, 'F') && args->argc != 0) {
+ if (args_has(args, 'F') && count != 0) {
cmdq_error(item, "only one of -F or argument must be given");
return (CMD_RETURN_ERROR);
}
@@ -97,9 +97,10 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
}
}
- template = args_get(args, 'F');
- if (args->argc != 0)
- template = args->argv[0];
+ if (count != 0)
+ template = args_string(args, 0);
+ else
+ template = args_get(args, 'F');
if (template == NULL)
template = DISPLAY_MESSAGE_TEMPLATE;
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index beadae53..59484872 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -276,8 +276,8 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item)
delay = options_get_number(s->options, "display-panes-time");
cdata = xmalloc(sizeof *cdata);
- if (args->argc != 0)
- cdata->command = xstrdup(args->argv[0]);
+ if (args_count(args))
+ cdata->command = xstrdup(args_string(args, 0));
else
cdata->command = xstrdup("select-pane -t '%%'");
if (args_has(args, 'b'))
diff --git a/cmd-find-window.c b/cmd-find-window.c
index 43f5f9be..691baf85 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -47,7 +47,7 @@ cmd_find_window_exec(struct cmd *self, struct cmdq_item *item)
struct args *args = cmd_get_args(self), *new_args;
struct cmd_find_state *target = cmdq_get_target(item);
struct window_pane *wp = target->wp;
- const char *s = args->argv[0], *suffix = "";
+ const char *s = args_string(args, 0), *suffix = "";
char *filter;
int C, N, T;
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index f4c81074..df06a0b6 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -65,21 +65,20 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
struct cmd_find_state *target = cmdq_get_target(item);
struct cmdq_state *state = cmdq_get_state(item);
struct cmd_if_shell_data *cdata;
- char *shellcmd, *cmd, *error;
- const char *file;
+ char *shellcmd, *error;
+ const char *cmd = NULL, *file;
struct client *tc = cmdq_get_target_client(item);
struct session *s = target->s;
struct cmd_parse_input pi;
enum cmd_parse_status status;
+ u_int count = args_count(args);
- shellcmd = format_single_from_target(item, args->argv[0]);
+ shellcmd = format_single_from_target(item, args_string(args, 0));
if (args_has(args, 'F')) {
if (*shellcmd != '0' && *shellcmd != '\0')
- cmd = args->argv[1];
- else if (args->argc == 3)
- cmd = args->argv[2];
- else
- cmd = NULL;
+ cmd = args_string(args, 1);
+ else if (count == 3)
+ cmd = args_string(args, 2);
free(shellcmd);
if (cmd == NULL)
return (CMD_RETURN_NORMAL);
@@ -101,9 +100,9 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
cdata = xcalloc(1, sizeof *cdata);
- cdata->cmd_if = xstrdup(args->argv[1]);
- if (args->argc == 3)
- cdata->cmd_else = xstrdup(args->argv[2]);
+ cdata->cmd_if = xstrdup(args_string(args, 1));
+ if (count == 3)
+ cdata->cmd_else = xstrdup(args_string(args, 2));
if (!args_has(args, 'b'))
cdata->client = cmdq_get_client(item);
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index dbb510fb..1484af6d 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -150,7 +150,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
struct args *args = cmd_get_args(self);
struct key_table *table;
struct key_binding *bd;
- const char *tablename, *r;
+ const char *tablename, *r, *keystr;
char *key, *cp, *tmp, *start, *empty;
key_code prefix, only = KEYC_UNKNOWN;
int repeat, width, tablewidth, keywidth, found = 0;
@@ -159,10 +159,10 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
if (cmd_get_entry(self) == &cmd_list_commands_entry)
return (cmd_list_keys_commands(self, item));
- if (args->argc != 0) {
- only = key_string_lookup_string(args->argv[0]);
+ if ((keystr = args_string(args, 0)) != NULL) {
+ only = key_string_lookup_string(keystr);
if (only == KEYC_UNKNOWN) {
- cmdq_error(item, "invalid key: %s", args->argv[0]);
+ cmdq_error(item, "invalid key: %s", keystr);
return (CMD_RETURN_ERROR);
}
only &= (KEYC_MASK_KEY|KEYC_MASK_MODIFIERS);
@@ -243,6 +243,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
tmpsize = 256;
tmp = xmalloc(tmpsize);
+
table = key_bindings_first_table();
while (table != NULL) {
if (tablename != NULL && strcmp(table->name, tablename) != 0) {
@@ -307,7 +308,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
out:
if (only != KEYC_UNKNOWN && !found) {
- cmdq_error(item, "unknown key: %s", args->argv[0]);
+ cmdq_error(item, "unknown key: %s", args_string(args, 0));
return (CMD_RETURN_ERROR);
}
return (CMD_RETURN_NORMAL);
@@ -320,12 +321,9 @@ cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item)
const struct cmd_entry **entryp;
const struct cmd_entry *entry;
struct format_tree *ft;
- const char *template, *s, *command = NULL;
+ const char *template, *s, *command;
char *line;
- if (args->argc != 0)
- command = args->argv[0];
-
if ((template = args_get(args, 'F')) == NULL) {
template = "#{command_list_name}"
"#{?command_list_alias, (#{command_list_alias}),} "
@@ -335,6 +333,7 @@ cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item)
ft = format_create(cmdq_get_client(item), item, FORMAT_NONE, 0);
format_defaults(ft, NULL, NULL, NULL, NULL);
+ command = args_string(args, 0);
for (entryp = cmd_table; *entryp != NULL; entryp++) {
entry = *entryp;
if (command != NULL &&
diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c
index bca9a860..318a7467 100644
--- a/cmd-load-buffer.c
+++ b/cmd-load-buffer.c
@@ -105,7 +105,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmdq_item *item)
cdata->client->references++;
}
- path = format_single_from_target(item, args->argv[0]);
+ path = format_single_from_target(item, args_string(args, 0));
file_read(cmdq_get_client(item), path, cmd_load_buffer_done, cdata);
free(path);
diff --git a/cmd-new-session.c b/cmd-new-session.c
index f3a5de26..0cc6b9da 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -75,15 +75,15 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
struct options *oo;
struct termios tio, *tiop;
struct session_group *sg = NULL;
- const char *errstr, *template, *group, *tmp, *add;
+ const char *errstr, *template, *group, *tmp;
char *cause, *cwd = NULL, *cp, *newname = NULL;
char *name, *prefix = NULL;
int detached, already_attached, is_control = 0;
- u_int sx, sy, dsx, dsy;
- struct spawn_context sc;
+ u_int sx, sy, dsx, dsy, count = args_count(args);
+ struct spawn_context sc = { 0 };
enum cmd_retval retval;
struct cmd_find_state fs;
- struct args_value *value;
+ struct args_value *av;
if (cmd_get_entry(self) == &cmd_has_session_entry) {
/*
@@ -93,7 +93,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_NORMAL);
}
- if (args_has(args, 't') && (args->argc != 0 || args_has(args, 'n'))) {
+ if (args_has(args, 't') && (count != 0 || args_has(args, 'n'))) {
cmdq_error(item, "command or window name given with target");
return (CMD_RETURN_ERROR);
}
@@ -269,23 +269,21 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
env = environ_create();
if (c != NULL && !args_has(args, 'E'))
environ_update(global_s_options, c->environ, env);
- add = args_first_value(args, 'e', &value);
- while (add != NULL) {
- environ_put(env, add, 0);
- add = args_next_value(&value);
+ av = args_first_value(args, 'e');
+ while (av != NULL) {
+ environ_put(env, av->value, 0);
+ av = args_next_value(av);
}
s = session_create(prefix, newname, cwd, env, oo, tiop);
/* Spawn the initial window. */
- memset(&sc, 0, sizeof sc);
sc.item = item;
sc.s = s;
if (!detached)
sc.tc = c;
sc.name = args_get(args, 'n');
- sc.argc = args->argc;
- sc.argv = args->argv;
+ args_vector(args, &sc.argc, &sc.argv);
sc.idx = -1;
sc.cwd = args_get(args, 'c');
@@ -358,12 +356,16 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
cmd_find_from_session(&fs, s, 0);
cmdq_insert_hook(s, item, &fs, "after-new-session");
+ if (sc.argv != NULL)
+ cmd_free_argv(sc.argc, sc.argv);
free(cwd);
free(newname);
free(prefix);
return (CMD_RETURN_NORMAL);
fail:
+ if (sc.argv != NULL)
+ cmd_free_argv(sc.argc, sc.argv);
free(cwd);
free(newname);
free(prefix);
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 712e2a79..f24de8e9 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -55,16 +55,15 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
struct client *c = cmdq_get_client(item);
struct cmd_find_state *current = cmdq_get_current(item);
struct cmd_find_state *target = cmdq_get_target(item);
- struct spawn_context sc;
+ struct spawn_context sc = { 0 };
struct client *tc = cmdq_get_target_client(item);
struct session *s = target->s;
- struct winlink *wl = target->wl;
+ struct winlink *wl = target->wl, *new_wl = NULL;
int idx = target->idx, before;
- struct winlink *new_wl = NULL;
char *ca