=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-parse.y,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** src/usr.bin/tmux/cmd-parse.y 2019/06/01 06:20:22 1.12 --- src/usr.bin/tmux/cmd-parse.y 2019/06/02 07:10:15 1.13 *************** *** 1,4 **** ! /* $OpenBSD: cmd-parse.y,v 1.12 2019/06/01 06:20:22 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-parse.y,v 1.13 2019/06/02 07:10:15 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott *************** *** 65,71 **** u_int escapes; char *error; ! struct cmd_parse_commands commands; struct cmd_parse_scope *scope; TAILQ_HEAD(, cmd_parse_scope) stack; --- 65,71 ---- u_int escapes; char *error; ! struct cmd_parse_commands *commands; struct cmd_parse_scope *scope; TAILQ_HEAD(, cmd_parse_scope) stack; *************** *** 74,79 **** --- 74,80 ---- static char *cmd_parse_get_error(const char *, u_int, const char *); static void cmd_parse_free_command(struct cmd_parse_command *); + static struct cmd_parse_commands *cmd_parse_new_commands(void); static void cmd_parse_free_commands(struct cmd_parse_commands *); %} *************** *** 88,96 **** int flag; struct { int flag; ! struct cmd_parse_commands commands; } elif; ! struct cmd_parse_commands commands; struct cmd_parse_command *command; } --- 89,97 ---- int flag; struct { int flag; ! struct cmd_parse_commands *commands; } elif; ! struct cmd_parse_commands *commands; struct cmd_parse_command *command; } *************** *** 115,159 **** { struct cmd_parse_state *ps = &parse_state; ! TAILQ_CONCAT(&ps->commands, &$1, entry); } statements : statement '\n' { ! TAILQ_INIT(&$$); ! TAILQ_CONCAT(&$$, &$1, entry); } | statements statement '\n' { ! TAILQ_INIT(&$$); ! TAILQ_CONCAT(&$$, &$1, entry); ! TAILQ_CONCAT(&$$, &$2, entry); } - statement : condition { struct cmd_parse_state *ps = &parse_state; - TAILQ_INIT(&$$); if (ps->scope == NULL || ps->scope->flag) ! TAILQ_CONCAT(&$$, &$1, entry); ! else ! cmd_parse_free_commands(&$1); } | assignment { ! TAILQ_INIT(&$$); } | commands { struct cmd_parse_state *ps = &parse_state; - TAILQ_INIT(&$$); if (ps->scope == NULL || ps->scope->flag) ! TAILQ_CONCAT(&$$, &$1, entry); ! else ! cmd_parse_free_commands(&$1); } expanded : FORMAT --- 116,161 ---- { struct cmd_parse_state *ps = &parse_state; ! ps->commands = $1; } statements : statement '\n' { ! $$ = $1; } | statements statement '\n' { ! $$ = $1; ! TAILQ_CONCAT($$, $2, entry); ! free($2); } statement : condition { struct cmd_parse_state *ps = &parse_state; if (ps->scope == NULL || ps->scope->flag) ! $$ = $1; ! else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($1); ! } } | assignment { ! $$ = xmalloc (sizeof *$$); ! TAILQ_INIT($$); } | commands { struct cmd_parse_state *ps = &parse_state; if (ps->scope == NULL || ps->scope->flag) ! $$ = $1; ! else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($1); ! } } expanded : FORMAT *************** *** 243,359 **** condition : if_open '\n' statements if_close { - TAILQ_INIT(&$$); if ($1) ! TAILQ_CONCAT(&$$, &$3, entry); ! else ! cmd_parse_free_commands(&$3); } | if_open '\n' statements if_else '\n' statements if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$3, entry); ! cmd_parse_free_commands(&$6); } else { ! TAILQ_CONCAT(&$$, &$6, entry); ! cmd_parse_free_commands(&$3); } } | if_open '\n' statements elif if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$3, entry); ! cmd_parse_free_commands(&$4.commands); } else if ($4.flag) { ! TAILQ_CONCAT(&$$, &$4.commands, entry); ! cmd_parse_free_commands(&$3); } else { ! cmd_parse_free_commands(&$3); ! cmd_parse_free_commands(&$4.commands); } } | if_open '\n' statements elif if_else '\n' statements if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$3, entry); ! cmd_parse_free_commands(&$4.commands); ! cmd_parse_free_commands(&$7); } else if ($4.flag) { ! TAILQ_CONCAT(&$$, &$4.commands, entry); ! cmd_parse_free_commands(&$3); ! cmd_parse_free_commands(&$7); } else { ! TAILQ_CONCAT(&$$, &$7, entry); ! cmd_parse_free_commands(&$3); ! cmd_parse_free_commands(&$4.commands); } } elif : if_elif '\n' statements { ! TAILQ_INIT(&$$.commands); ! if ($1) ! TAILQ_CONCAT(&$$.commands, &$3, entry); ! else ! cmd_parse_free_commands(&$3); ! $$.flag = $1; } | if_elif '\n' statements elif { - TAILQ_INIT(&$$.commands); if ($1) { $$.flag = 1; ! TAILQ_CONCAT(&$$.commands, &$3, entry); ! cmd_parse_free_commands(&$4.commands); } else { ! $$.flag = $4.flag; ! TAILQ_CONCAT(&$$.commands, &$4.commands, entry); ! cmd_parse_free_commands(&$3); } } - commands : command { struct cmd_parse_state *ps = &parse_state; ! TAILQ_INIT(&$$); if (ps->scope == NULL || ps->scope->flag) ! TAILQ_INSERT_TAIL(&$$, $1, entry); else cmd_parse_free_command($1); } | commands ';' { ! TAILQ_INIT(&$$); ! TAILQ_CONCAT(&$$, &$1, entry); } | commands ';' condition1 { ! TAILQ_INIT(&$$); ! TAILQ_CONCAT(&$$, &$1, entry); ! TAILQ_CONCAT(&$$, &$3, entry); } | commands ';' command { struct cmd_parse_state *ps = &parse_state; - TAILQ_INIT(&$$); if (ps->scope == NULL || ps->scope->flag) { ! TAILQ_CONCAT(&$$, &$1, entry); ! TAILQ_INSERT_TAIL(&$$, $3, entry); } else { ! cmd_parse_free_commands(&$1); cmd_parse_free_command($3); } } | condition1 { ! TAILQ_INIT(&$$); ! TAILQ_CONCAT(&$$, &$1, entry); } command : assignment TOKEN --- 245,363 ---- condition : if_open '\n' statements if_close { if ($1) ! $$ = $3; ! else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($3); ! } } | if_open '\n' statements if_else '\n' statements if_close { if ($1) { ! $$ = $3; ! cmd_parse_free_commands($6); } else { ! $$ = $6; ! cmd_parse_free_commands($3); } } | if_open '\n' statements elif if_close { if ($1) { ! $$ = $3; ! cmd_parse_free_commands($4.commands); } else if ($4.flag) { ! $$ = $4.commands; ! cmd_parse_free_commands($3); } else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($3); ! cmd_parse_free_commands($4.commands); } } | if_open '\n' statements elif if_else '\n' statements if_close { if ($1) { ! $$ = $3; ! cmd_parse_free_commands($4.commands); ! cmd_parse_free_commands($7); } else if ($4.flag) { ! $$ = $4.commands; ! cmd_parse_free_commands($3); ! cmd_parse_free_commands($7); } else { ! $$ = $7; ! cmd_parse_free_commands($3); ! cmd_parse_free_commands($4.commands); } } elif : if_elif '\n' statements { ! if ($1) { ! $$.flag = 1; ! $$.commands = $3; ! } else { ! $$.flag = 0; ! $$.commands = cmd_parse_new_commands(); ! cmd_parse_free_commands($3); ! } } | if_elif '\n' statements elif { if ($1) { $$.flag = 1; ! $$.commands = $3; ! cmd_parse_free_commands($4.commands); ! } else if ($4.flag) { ! $$.flag = 1; ! $$.commands = $4.commands; ! cmd_parse_free_commands($3); } else { ! $$.flag = 0; ! $$.commands = cmd_parse_new_commands(); ! cmd_parse_free_commands($3); ! cmd_parse_free_commands($4.commands); } } commands : command { struct cmd_parse_state *ps = &parse_state; ! $$ = cmd_parse_new_commands(); if (ps->scope == NULL || ps->scope->flag) ! TAILQ_INSERT_TAIL($$, $1, entry); else cmd_parse_free_command($1); } | commands ';' { ! $$ = $1; } | commands ';' condition1 { ! $$ = $1; ! TAILQ_CONCAT($$, $3, entry); ! free($3); } | commands ';' command { struct cmd_parse_state *ps = &parse_state; if (ps->scope == NULL || ps->scope->flag) { ! $$ = $1; ! TAILQ_INSERT_TAIL($$, $3, entry); } else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($1); cmd_parse_free_command($3); } } | condition1 { ! $$ = $1; } command : assignment TOKEN *************** *** 379,454 **** condition1 : if_open commands if_close { - TAILQ_INIT(&$$); if ($1) ! TAILQ_CONCAT(&$$, &$2, entry); ! else ! cmd_parse_free_commands(&$2); } | if_open commands if_else commands if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$2, entry); ! cmd_parse_free_commands(&$4); } else { ! TAILQ_CONCAT(&$$, &$4, entry); ! cmd_parse_free_commands(&$2); } } | if_open commands elif1 if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$2, entry); ! cmd_parse_free_commands(&$3.commands); } else if ($3.flag) { ! TAILQ_CONCAT(&$$, &$3.commands, entry); ! cmd_parse_free_commands(&$2); } else { ! cmd_parse_free_commands(&$2); ! cmd_parse_free_commands(&$3.commands); } } | if_open commands elif1 if_else commands if_close { - TAILQ_INIT(&$$); if ($1) { ! TAILQ_CONCAT(&$$, &$2, entry); ! cmd_parse_free_commands(&$3.commands); ! cmd_parse_free_commands(&$5); } else if ($3.flag) { ! TAILQ_CONCAT(&$$, &$3.commands, entry); ! cmd_parse_free_commands(&$2); ! cmd_parse_free_commands(&$5); } else { ! TAILQ_CONCAT(&$$, &$5, entry); ! cmd_parse_free_commands(&$2); ! cmd_parse_free_commands(&$3.commands); } - } elif1 : if_elif commands { ! TAILQ_INIT(&$$.commands); ! if ($1) ! TAILQ_CONCAT(&$$.commands, &$2, entry); ! else ! cmd_parse_free_commands(&$2); ! $$.flag = $1; } | if_elif commands elif1 { - TAILQ_INIT(&$$.commands); if ($1) { $$.flag = 1; ! TAILQ_CONCAT(&$$.commands, &$2, entry); ! cmd_parse_free_commands(&$3.commands); } else { ! $$.flag = $3.flag; ! TAILQ_CONCAT(&$$.commands, &$3.commands, entry); ! cmd_parse_free_commands(&$2); } } --- 383,462 ---- condition1 : if_open commands if_close { if ($1) ! $$ = $2; ! else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($2); ! } } | if_open commands if_else commands if_close { if ($1) { ! $$ = $2; ! cmd_parse_free_commands($4); } else { ! $$ = $4; ! cmd_parse_free_commands($2); } } | if_open commands elif1 if_close { if ($1) { ! $$ = $2; ! cmd_parse_free_commands($3.commands); } else if ($3.flag) { ! $$ = $3.commands; ! cmd_parse_free_commands($2); } else { ! $$ = cmd_parse_new_commands(); ! cmd_parse_free_commands($2); ! cmd_parse_free_commands($3.commands); } } | if_open commands elif1 if_else commands if_close { if ($1) { ! $$ = $2; ! cmd_parse_free_commands($3.commands); ! cmd_parse_free_commands($5); } else if ($3.flag) { ! $$ = $3.commands; ! cmd_parse_free_commands($2); ! cmd_parse_free_commands($5); } else { ! $$ = $5; ! cmd_parse_free_commands($2); ! cmd_parse_free_commands($3.commands); } } elif1 : if_elif commands { ! if ($1) { ! $$.flag = 1; ! $$.commands = $2; ! } else { ! $$.flag = 0; ! $$.commands = cmd_parse_new_commands(); ! cmd_parse_free_commands($2); ! } } | if_elif commands elif1 { if ($1) { $$.flag = 1; ! $$.commands = $2; ! cmd_parse_free_commands($3.commands); ! } else if ($3.flag) { ! $$.flag = 1; ! $$.commands = $3.commands; ! cmd_parse_free_commands($2); } else { ! $$.flag = 0; ! $$.commands = cmd_parse_new_commands(); ! cmd_parse_free_commands($2); ! cmd_parse_free_commands($3.commands); } } *************** *** 497,502 **** --- 505,520 ---- free(cmd); } + static struct cmd_parse_commands * + cmd_parse_new_commands(void) + { + struct cmd_parse_commands *cmds; + + cmds = xmalloc(sizeof *cmds); + TAILQ_INIT (cmds); + return (cmds); + } + static void cmd_parse_free_commands(struct cmd_parse_commands *cmds) { *************** *** 506,522 **** TAILQ_REMOVE(cmds, cmd, entry); cmd_parse_free_command(cmd); } } static struct cmd_parse_commands * cmd_parse_run_parser(char **cause) { ! struct cmd_parse_state *ps = &parse_state; ! struct cmd_parse_commands *cmds; ! struct cmd_parse_scope *scope, *scope1; ! int retval; ! TAILQ_INIT(&ps->commands); TAILQ_INIT(&ps->stack); retval = yyparse(); --- 524,540 ---- TAILQ_REMOVE(cmds, cmd, entry); cmd_parse_free_command(cmd); } + free(cmds); } static struct cmd_parse_commands * cmd_parse_run_parser(char **cause) { ! struct cmd_parse_state *ps = &parse_state; ! struct cmd_parse_scope *scope, *scope1; ! int retval; ! ps->commands = NULL; TAILQ_INIT(&ps->stack); retval = yyparse(); *************** *** 529,538 **** return (NULL); } ! cmds = xmalloc(sizeof *cmds); ! TAILQ_INIT(cmds); ! TAILQ_CONCAT(cmds, &ps->commands, entry); ! return (cmds); } static struct cmd_parse_commands * --- 547,555 ---- return (NULL); } ! if (ps->commands == NULL) ! return (cmd_parse_new_commands()); ! return (ps->commands); } static struct cmd_parse_commands * *************** *** 574,580 **** /* Check for an empty list. */ if (TAILQ_EMPTY(cmds)) { ! free(cmds); pr.status = CMD_PARSE_EMPTY; return (&pr); } --- 591,597 ---- /* Check for an empty list. */ if (TAILQ_EMPTY(cmds)) { ! cmd_parse_free_commands(cmds); pr.status = CMD_PARSE_EMPTY; return (&pr); } *************** *** 668,674 **** out: cmd_parse_free_commands(cmds); - free(cmds); return (&pr); } --- 685,690 ---- *************** *** 747,754 **** } cmd_log_argv(argc, argv, "%s", __func__); ! cmds = xmalloc(sizeof *cmds); ! TAILQ_INIT(cmds); copy = cmd_copy_argv(argc, argv); last = 0; --- 763,769 ---- } cmd_log_argv(argc, argv, "%s", __func__); ! cmds = cmd_parse_new_commands(); copy = cmd_copy_argv(argc, argv); last = 0; *************** *** 801,806 **** --- 816,823 ---- TAILQ_INSERT_TAIL(cmds, cmd, entry); } } + + cmd_free_argv(argc, copy); return (cmd_parse_build_commands(cmds, pi)); }