mirror of
https://github.com/tmux/tmux.git
synced 2025-09-03 22:43:58 +00:00
Revert WIP parts of previous I didn't mean to commit yet.
This commit is contained in:
15
client.c
15
client.c
@ -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). */
|
||||||
|
88
cmd-string.c
88
cmd-string.c
@ -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
68
cmd.c
@ -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:
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
1
tmux.h
@ -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 */
|
||||||
|
Reference in New Issue
Block a user