Revert WIP parts of previous I didn't mean to commit yet.

This commit is contained in:
nicm
2017-01-16 14:52:25 +00:00
parent 68db958477
commit ef15b4195f
6 changed files with 46 additions and 135 deletions

View File

@ -252,13 +252,16 @@ client_main(struct event_base *base, int argc, char **argv, int flags,
* flag. * flag.
*/ */
cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause); cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause);
if (cmdlist != NULL) { if (cmdlist == NULL) {
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { fprintf(stderr, "%s\n", cause);
if (cmd->entry->flags & CMD_STARTSERVER) return (1);
cmdflags |= CMD_STARTSERVER;
}
cmd_list_free(cmdlist);
} }
cmdflags &= ~CMD_STARTSERVER;
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->entry->flags & CMD_STARTSERVER)
cmdflags |= CMD_STARTSERVER;
}
cmd_list_free(cmdlist);
} }
/* Create client process structure (starts logging). */ /* Create client process structure (starts logging). */

View File

@ -54,15 +54,17 @@ cmd_string_ungetc(size_t *p)
(*p)--; (*p)--;
} }
int struct cmd_list *
cmd_string_split(const char *s, int *rargc, char ***rargv) cmd_string_parse(const char *s, const char *file, u_int line, char **cause)
{ {
size_t p = 0; size_t p = 0;
int ch, argc = 0, append = 0; int ch, i, argc = 0;
char **argv = NULL, *buf = NULL, *t; char **argv = NULL, *buf = NULL, *t;
const char *whitespace, *equals; const char *whitespace, *equals;
size_t len = 0; size_t len = 0;
struct cmd_list *cmdlist = NULL;
*cause = NULL;
for (;;) { for (;;) {
ch = cmd_string_getc(s, &p); ch = cmd_string_getc(s, &p);
switch (ch) { switch (ch) {
@ -113,67 +115,43 @@ cmd_string_split(const char *s, int *rargc, char ***rargv)
argc--; argc--;
memmove(argv, argv + 1, argc * (sizeof *argv)); memmove(argv, argv + 1, argc * (sizeof *argv));
} }
goto done; if (argc == 0)
goto out;
cmdlist = cmd_list_parse(argc, argv, file, line, cause);
goto out;
case '~': case '~':
if (buf != NULL) { if (buf == NULL) {
append = 1; t = cmd_string_expand_tilde(s, &p);
if (t == NULL)
goto error;
cmd_string_copy(&buf, t, &len);
break; break;
} }
t = cmd_string_expand_tilde(s, &p); /* FALLTHROUGH */
if (t == NULL)
goto error;
cmd_string_copy(&buf, t, &len);
break;
default: default:
append = 1;
break;
}
if (append) {
if (len >= SIZE_MAX - 2) if (len >= SIZE_MAX - 2)
goto error; goto error;
buf = xrealloc(buf, len + 1); buf = xrealloc(buf, len + 1);
buf[len++] = ch; buf[len++] = ch;
} break;
append = 0;
}
done:
*rargc = argc;
*rargv = argv;
free(buf);
return (0);
error:
if (argv != NULL)
cmd_free_argv(argc, argv);
free(buf);
return (-1);
}
struct cmd_list *
cmd_string_parse(const char *s, const char *file, u_int line, char **cause)
{
struct cmd_list *cmdlist = NULL;
int argc;
char **argv;
*cause = NULL;
if (cmd_string_split(s, &argc, &argv) != 0)
goto error;
if (argc != 0) {
cmdlist = cmd_list_parse(argc, argv, file, line, cause);
if (cmdlist == NULL) {
cmd_free_argv(argc, argv);
goto error;
} }
} }
cmd_free_argv(argc, argv);
return (cmdlist);
error: error:
xasprintf(cause, "invalid or unknown command: %s", s); xasprintf(cause, "invalid or unknown command: %s", s);
return (NULL);
out:
free(buf);
if (argv != NULL) {
for (i = 0; i < argc; i++)
free(argv[i]);
free(argv);
}
return (cmdlist);
} }
static void static void

68
cmd.c
View File

@ -308,74 +308,21 @@ cmd_stringify_argv(int argc, char **argv)
return (buf); return (buf);
} }
static int
cmd_try_alias(int *argc, char ***argv)
{
struct options_entry *o;
int old_argc = *argc, new_argc;
char **old_argv = *argv, **new_argv;
u_int size, idx;
int i;
size_t wanted;
const char *s, *cp = NULL;
o = options_get_only(global_options, "command-alias");
if (o == NULL || options_array_size(o, &size) == -1 || size == 0)
return (-1);
wanted = strlen(old_argv[0]);
for (idx = 0; idx < size; idx++) {
s = options_array_get(o, idx);
if (s == NULL)
continue;
cp = strchr(s, '=');
if (cp == NULL || (size_t)(cp - s) != wanted)
continue;
if (strncmp(old_argv[0], s, wanted) == 0)
break;
}
if (idx == size)
return (-1);
if (cmd_string_split(cp + 1, &new_argc, &new_argv) != 0)
return (-1);
*argc = new_argc + old_argc - 1;
*argv = xcalloc((*argc) + 1, sizeof **argv);
for (i = 0; i < new_argc; i++)
(*argv)[i] = xstrdup(new_argv[i]);
for (i = 1; i < old_argc; i++)
(*argv)[new_argc + i - 1] = xstrdup(old_argv[i]);
log_debug("alias: %s=%s", old_argv[0], cp + 1);
for (i = 0; i < *argc; i++)
log_debug("alias: argv[%d] = %s", i, (*argv)[i]);
cmd_free_argv(new_argc, new_argv);
return (0);
}
struct cmd * struct cmd *
cmd_parse(int argc, char **argv, const char *file, u_int line, char **cause) cmd_parse(int argc, char **argv, const char *file, u_int line, char **cause)
{ {
const char *name;
const struct cmd_entry **entryp, *entry; const struct cmd_entry **entryp, *entry;
struct cmd *cmd; struct cmd *cmd;
struct args *args; struct args *args;
char s[BUFSIZ]; char s[BUFSIZ];
int ambiguous, allocated = 0; int ambiguous = 0;
*cause = NULL; *cause = NULL;
if (argc == 0) { if (argc == 0) {
xasprintf(cause, "no command"); xasprintf(cause, "no command");
return (NULL); return (NULL);
} }
name = argv[0];
retry:
ambiguous = 0;
entry = NULL; entry = NULL;
for (entryp = cmd_table; *entryp != NULL; entryp++) { for (entryp = cmd_table; *entryp != NULL; entryp++) {
if ((*entryp)->alias != NULL && if ((*entryp)->alias != NULL &&
@ -395,17 +342,10 @@ retry:
if (strcmp(entry->name, argv[0]) == 0) if (strcmp(entry->name, argv[0]) == 0)
break; break;
} }
if ((ambiguous || entry == NULL) &&
server_proc != NULL &&
!allocated &&
cmd_try_alias(&argc, &argv) == 0) {
allocated = 1;
goto retry;
}
if (ambiguous) if (ambiguous)
goto ambiguous; goto ambiguous;
if (entry == NULL) { if (entry == NULL) {
xasprintf(cause, "unknown command: %s", name); xasprintf(cause, "unknown command: %s", argv[0]);
return (NULL); return (NULL);
} }
@ -425,8 +365,6 @@ retry:
cmd->file = xstrdup(file); cmd->file = xstrdup(file);
cmd->line = line; cmd->line = line;
if (allocated)
cmd_free_argv(argc, argv);
return (cmd); return (cmd);
ambiguous: ambiguous:
@ -440,7 +378,7 @@ ambiguous:
break; break;
} }
s[strlen(s) - 2] = '\0'; s[strlen(s) - 2] = '\0';
xasprintf(cause, "ambiguous command: %s, could be: %s", name, s); xasprintf(cause, "ambiguous command: %s, could be: %s", argv[0], s);
return (NULL); return (NULL);
usage: usage:

View File

@ -383,7 +383,7 @@ key_bindings_init(void)
for (i = 0; i < nitems(defaults); i++) { for (i = 0; i < nitems(defaults); i++) {
cmdlist = cmd_string_parse(defaults[i], "<default>", i, &cause); cmdlist = cmd_string_parse(defaults[i], "<default>", i, &cause);
if (cmdlist == NULL) if (cmdlist == NULL)
fatalx("bad default key: %s", defaults[i]); fatalx("bad default key");
cmdq_append(NULL, cmdq_get_command(cmdlist, NULL, NULL, 0)); cmdq_append(NULL, cmdq_get_command(cmdlist, NULL, NULL, 0));
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
} }

View File

@ -65,13 +65,6 @@ const struct options_table_entry options_table[] = {
.default_num = 20 .default_num = 20
}, },
{ .name = "command-alias",
.type = OPTIONS_TABLE_ARRAY,
.scope = OPTIONS_TABLE_SERVER,
.default_str = "split-pane=split-window,"
"splitp=split-window"
},
{ .name = "default-terminal", { .name = "default-terminal",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.scope = OPTIONS_TABLE_SERVER, .scope = OPTIONS_TABLE_SERVER,

1
tmux.h
View File

@ -1823,7 +1823,6 @@ void printflike(2, 3) cmdq_print(struct cmdq_item *, const char *, ...);
void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...); void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...);
/* cmd-string.c */ /* cmd-string.c */
int cmd_string_split(const char *, int *, char ***);
struct cmd_list *cmd_string_parse(const char *, const char *, u_int, char **); struct cmd_list *cmd_string_parse(const char *, const char *, u_int, char **);
/* cmd-wait-for.c */ /* cmd-wait-for.c */