Fix parsing of aliases again (GitHub issue 2842), also make argument

parsing a bit simpler and fix the names of some client flags.
This commit is contained in:
nicm 2021-09-09 06:57:48 +00:00
parent 329c2c2a91
commit 5a4b2fd68c
3 changed files with 26 additions and 29 deletions

View File

@ -742,15 +742,14 @@ cmd_parse_log_commands(struct cmd_parse_commands *cmds, const char *prefix)
static int static int
cmd_parse_expand_alias(struct cmd_parse_command *cmd, cmd_parse_expand_alias(struct cmd_parse_command *cmd,
struct cmd_parse_input *pi, struct cmd_parse_result *pr, struct cmd_parse_input *pi, struct cmd_parse_result *pr)
struct cmd_list **cmdlist)
{ {
struct cmd_parse_argument *arg, *arg1, *first, *after; struct cmd_parse_argument *arg, *arg1, *first;
struct cmd_parse_commands *cmds; struct cmd_parse_commands *cmds;
struct cmd_parse_command *last; struct cmd_parse_command *last;
char *alias, *name, *cause; char *alias, *name, *cause;
*cmdlist = NULL; memset(pr, 0, sizeof *pr);
first = TAILQ_FIRST(&cmd->arguments); first = TAILQ_FIRST(&cmd->arguments);
if (first == NULL || first->type != CMD_PARSE_STRING) { if (first == NULL || first->type != CMD_PARSE_STRING) {
@ -775,43 +774,38 @@ cmd_parse_expand_alias(struct cmd_parse_command *cmd,
last = TAILQ_LAST(cmds, cmd_parse_commands); last = TAILQ_LAST(cmds, cmd_parse_commands);
if (last == NULL) { if (last == NULL) {
*cmdlist = cmd_list_new(); pr->status = CMD_PARSE_SUCCESS;
pr->cmdlist = cmd_list_new();
return (1); return (1);
} }
TAILQ_REMOVE(&cmd->arguments, first, entry); TAILQ_REMOVE(&cmd->arguments, first, entry);
cmd_parse_free_argument(first); cmd_parse_free_argument(first);
after = TAILQ_FIRST(&last->arguments);
TAILQ_FOREACH_SAFE(arg, &cmd->arguments, entry, arg1) { TAILQ_FOREACH_SAFE(arg, &cmd->arguments, entry, arg1) {
TAILQ_REMOVE(&cmd->arguments, arg, entry); TAILQ_REMOVE(&cmd->arguments, arg, entry);
if (after == NULL)
TAILQ_INSERT_TAIL(&last->arguments, arg, entry); TAILQ_INSERT_TAIL(&last->arguments, arg, entry);
else
TAILQ_INSERT_AFTER(&last->arguments, after, arg, entry);
after = arg;
} }
cmd_parse_log_commands(cmds, __func__); cmd_parse_log_commands(cmds, __func__);
cmd_parse_build_commands(cmds, pi, pr); cmd_parse_build_commands(cmds, pi, pr);
if (pr->status != CMD_PARSE_SUCCESS)
*cmdlist = pr->cmdlist;
return (1); return (1);
} }
static struct cmd_list * static void
cmd_parse_build_command(struct cmd_parse_command *cmd, cmd_parse_build_command(struct cmd_parse_command *cmd,
struct cmd_parse_input *pi, struct cmd_parse_result *pr) struct cmd_parse_input *pi, struct cmd_parse_result *pr)
{ {
struct cmd_parse_argument *arg; struct cmd_parse_argument *arg;
struct cmd_list *cmdlist = NULL;
struct cmd *add; struct cmd *add;
char *cause; char *cause;
struct args_value *values = NULL; struct args_value *values = NULL;
u_int count = 0, idx; u_int count = 0, idx;
if (cmd_parse_expand_alias(cmd, pi, pr, &cmdlist)) memset(pr, 0, sizeof *pr);
return (cmdlist);
if (cmd_parse_expand_alias(cmd, pi, pr))
return;
TAILQ_FOREACH(arg, &cmd->arguments, entry) { TAILQ_FOREACH(arg, &cmd->arguments, entry) {
values = xrecallocarray(values, count, count + 1, values = xrecallocarray(values, count, count + 1,
@ -844,14 +838,14 @@ cmd_parse_build_command(struct cmd_parse_command *cmd,
free(cause); free(cause);
goto out; goto out;
} }
cmdlist = cmd_list_new(); pr->status = CMD_PARSE_SUCCESS;
cmd_list_append(cmdlist, add); pr->cmdlist = cmd_list_new();
cmd_list_append(pr->cmdlist, add);
out: out:
for (idx = 0; idx < count; idx++) for (idx = 0; idx < count; idx++)
args_free_value(&values[idx]); args_free_value(&values[idx]);
free(values); free(values);
return (cmdlist);
} }
static void static void
@ -860,9 +854,11 @@ cmd_parse_build_commands(struct cmd_parse_commands *cmds,
{ {
struct cmd_parse_command *cmd; struct cmd_parse_command *cmd;
u_int line = UINT_MAX; u_int line = UINT_MAX;
struct cmd_list *current = NULL, *result, *add; struct cmd_list *current = NULL, *result;
char *s; char *s;
memset(pr, 0, sizeof *pr);
/* Check for an empty list. */ /* Check for an empty list. */
if (TAILQ_EMPTY(cmds)) { if (TAILQ_EMPTY(cmds)) {
pr->status = CMD_PARSE_SUCCESS; pr->status = CMD_PARSE_SUCCESS;
@ -891,14 +887,14 @@ cmd_parse_build_commands(struct cmd_parse_commands *cmds,
current = cmd_list_new(); current = cmd_list_new();
line = pi->line = cmd->line; line = pi->line = cmd->line;
add = cmd_parse_build_command(cmd, pi, pr); cmd_parse_build_command(cmd, pi, pr);
if (add == NULL) { if (pr->status != CMD_PARSE_SUCCESS) {
cmd_list_free(result); cmd_list_free(result);
cmd_list_free(current); cmd_list_free(current);
return; return;
} }
cmd_list_append_all(current, add); cmd_list_append_all(current, pr->cmdlist);
cmd_list_free(add); cmd_list_free(pr->cmdlist);
} }
if (current != NULL) { if (current != NULL) {
cmd_parse_print_commands(pi, current); cmd_parse_print_commands(pi, current);
@ -1061,6 +1057,7 @@ cmd_parse_from_arguments(struct args_value *values, u_int count,
memset(&input, 0, sizeof input); memset(&input, 0, sizeof input);
pi = &input; pi = &input;
} }
memset(&pr, 0, sizeof pr);
cmds = cmd_parse_new_commands(); cmds = cmd_parse_new_commands();

2
menu.c
View File

@ -381,7 +381,7 @@ menu_prepare(struct menu *menu, int flags, struct cmdq_item *item, u_int px,
cmd_find_copy_state(&md->fs, fs); cmd_find_copy_state(&md->fs, fs);
screen_init(&md->s, menu->width + 4, menu->count + 2, 0); screen_init(&md->s, menu->width + 4, menu->count + 2, 0);
if (~md->flags & MENU_NOMOUSE) if (~md->flags & MENU_NOMOUSE)
md->s.mode |= MODE_MOUSE_ALL; md->s.mode |= MODE_MOUSE_BUTTON;
md->s.mode &= ~MODE_CURSOR; md->s.mode &= ~MODE_CURSOR;
md->px = px; md->px = px;

View File

@ -677,9 +677,9 @@ screen_mode_to_string(int mode)
if (mode & MODE_WRAP) if (mode & MODE_WRAP)
strlcat(tmp, "WRAP,", sizeof tmp); strlcat(tmp, "WRAP,", sizeof tmp);
if (mode & MODE_MOUSE_STANDARD) if (mode & MODE_MOUSE_STANDARD)
strlcat(tmp, "STANDARD,", sizeof tmp); strlcat(tmp, "MOUSE_STANDARD,", sizeof tmp);
if (mode & MODE_MOUSE_BUTTON) if (mode & MODE_MOUSE_BUTTON)
strlcat(tmp, "BUTTON,", sizeof tmp); strlcat(tmp, "MOUSE_BUTTON,", sizeof tmp);
if (mode & MODE_BLINKING) if (mode & MODE_BLINKING)
strlcat(tmp, "BLINKING,", sizeof tmp); strlcat(tmp, "BLINKING,", sizeof tmp);
if (mode & MODE_MOUSE_UTF8) if (mode & MODE_MOUSE_UTF8)
@ -691,7 +691,7 @@ screen_mode_to_string(int mode)
if (mode & MODE_FOCUSON) if (mode & MODE_FOCUSON)
strlcat(tmp, "FOCUSON,", sizeof tmp); strlcat(tmp, "FOCUSON,", sizeof tmp);
if (mode & MODE_MOUSE_ALL) if (mode & MODE_MOUSE_ALL)
strlcat(tmp, "ALL,", sizeof tmp); strlcat(tmp, "MOUSE_ALL,", sizeof tmp);
if (mode & MODE_ORIGIN) if (mode & MODE_ORIGIN)
strlcat(tmp, "ORIGIN,", sizeof tmp); strlcat(tmp, "ORIGIN,", sizeof tmp);
if (mode & MODE_CRLF) if (mode & MODE_CRLF)