=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-parse.y,v retrieving revision 1.46 retrieving revision 1.47 diff -c -r1.46 -r1.47 *** src/usr.bin/tmux/cmd-parse.y 2021/08/27 17:25:55 1.46 --- src/usr.bin/tmux/cmd-parse.y 2021/09/09 06:57:48 1.47 *************** *** 1,4 **** ! /* $OpenBSD: cmd-parse.y,v 1.46 2021/08/27 17:25:55 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-parse.y,v 1.47 2021/09/09 06:57:48 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott *************** *** 742,756 **** static int cmd_parse_expand_alias(struct cmd_parse_command *cmd, ! 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_commands *cmds; struct cmd_parse_command *last; char *alias, *name, *cause; ! *cmdlist = NULL; first = TAILQ_FIRST(&cmd->arguments); if (first == NULL || first->type != CMD_PARSE_STRING) { --- 742,755 ---- static int cmd_parse_expand_alias(struct cmd_parse_command *cmd, ! struct cmd_parse_input *pi, struct cmd_parse_result *pr) { ! struct cmd_parse_argument *arg, *arg1, *first; struct cmd_parse_commands *cmds; struct cmd_parse_command *last; char *alias, *name, *cause; ! memset(pr, 0, sizeof *pr); first = TAILQ_FIRST(&cmd->arguments); if (first == NULL || first->type != CMD_PARSE_STRING) { *************** *** 775,818 **** last = TAILQ_LAST(cmds, cmd_parse_commands); if (last == NULL) { ! *cmdlist = cmd_list_new(); return (1); } TAILQ_REMOVE(&cmd->arguments, first, entry); cmd_parse_free_argument(first); - after = TAILQ_FIRST(&last->arguments); TAILQ_FOREACH_SAFE(arg, &cmd->arguments, entry, arg1) { TAILQ_REMOVE(&cmd->arguments, arg, entry); ! if (after == NULL) ! 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_build_commands(cmds, pi, pr); - if (pr->status != CMD_PARSE_SUCCESS) - *cmdlist = pr->cmdlist; return (1); } ! static struct cmd_list * cmd_parse_build_command(struct cmd_parse_command *cmd, struct cmd_parse_input *pi, struct cmd_parse_result *pr) { struct cmd_parse_argument *arg; - struct cmd_list *cmdlist = NULL; struct cmd *add; char *cause; struct args_value *values = NULL; u_int count = 0, idx; ! if (cmd_parse_expand_alias(cmd, pi, pr, &cmdlist)) ! return (cmdlist); TAILQ_FOREACH(arg, &cmd->arguments, entry) { values = xrecallocarray(values, count, count + 1, sizeof *values); --- 774,812 ---- last = TAILQ_LAST(cmds, cmd_parse_commands); if (last == NULL) { ! pr->status = CMD_PARSE_SUCCESS; ! pr->cmdlist = cmd_list_new(); return (1); } TAILQ_REMOVE(&cmd->arguments, first, entry); cmd_parse_free_argument(first); TAILQ_FOREACH_SAFE(arg, &cmd->arguments, entry, arg1) { TAILQ_REMOVE(&cmd->arguments, arg, entry); ! TAILQ_INSERT_TAIL(&last->arguments, arg, entry); } cmd_parse_log_commands(cmds, __func__); cmd_parse_build_commands(cmds, pi, pr); return (1); } ! static void cmd_parse_build_command(struct cmd_parse_command *cmd, struct cmd_parse_input *pi, struct cmd_parse_result *pr) { struct cmd_parse_argument *arg; struct cmd *add; char *cause; struct args_value *values = NULL; u_int count = 0, idx; ! memset(pr, 0, sizeof *pr); + if (cmd_parse_expand_alias(cmd, pi, pr)) + return; + TAILQ_FOREACH(arg, &cmd->arguments, entry) { values = xrecallocarray(values, count, count + 1, sizeof *values); *************** *** 844,857 **** free(cause); goto out; } ! cmdlist = cmd_list_new(); ! cmd_list_append(cmdlist, add); out: for (idx = 0; idx < count; idx++) args_free_value(&values[idx]); free(values); - return (cmdlist); } static void --- 838,851 ---- free(cause); goto out; } ! pr->status = CMD_PARSE_SUCCESS; ! pr->cmdlist = cmd_list_new(); ! cmd_list_append(pr->cmdlist, add); out: for (idx = 0; idx < count; idx++) args_free_value(&values[idx]); free(values); } static void *************** *** 860,868 **** { struct cmd_parse_command *cmd; u_int line = UINT_MAX; ! struct cmd_list *current = NULL, *result, *add; char *s; /* Check for an empty list. */ if (TAILQ_EMPTY(cmds)) { pr->status = CMD_PARSE_SUCCESS; --- 854,864 ---- { struct cmd_parse_command *cmd; u_int line = UINT_MAX; ! struct cmd_list *current = NULL, *result; char *s; + memset(pr, 0, sizeof *pr); + /* Check for an empty list. */ if (TAILQ_EMPTY(cmds)) { pr->status = CMD_PARSE_SUCCESS; *************** *** 891,904 **** current = cmd_list_new(); line = pi->line = cmd->line; ! add = cmd_parse_build_command(cmd, pi, pr); ! if (add == NULL) { cmd_list_free(result); cmd_list_free(current); return; } ! cmd_list_append_all(current, add); ! cmd_list_free(add); } if (current != NULL) { cmd_parse_print_commands(pi, current); --- 887,900 ---- current = cmd_list_new(); line = pi->line = cmd->line; ! cmd_parse_build_command(cmd, pi, pr); ! if (pr->status != CMD_PARSE_SUCCESS) { cmd_list_free(result); cmd_list_free(current); return; } ! cmd_list_append_all(current, pr->cmdlist); ! cmd_list_free(pr->cmdlist); } if (current != NULL) { cmd_parse_print_commands(pi, current); *************** *** 1061,1066 **** --- 1057,1063 ---- memset(&input, 0, sizeof input); pi = &input; } + memset(&pr, 0, sizeof pr); cmds = cmd_parse_new_commands();