diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2007-01-19 21:36:00 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2007-01-19 21:36:00 +0000 |
commit | de272e0309bc1739f13cc8271a2f94bcde7ba23c (patch) | |
tree | d094cb847e41520af34ef250e4c82eea66f52016 /Src/parse.c | |
parent | a5729be83502b3d2ba93e38a485393c9af13a935 (diff) | |
download | zsh-de272e0309bc1739f13cc8271a2f94bcde7ba23c.tar.gz zsh-de272e0309bc1739f13cc8271a2f94bcde7ba23c.tar.xz zsh-de272e0309bc1739f13cc8271a2f94bcde7ba23c.zip |
23115: ";|" at end of case clause causes later patterns to be tested
Diffstat (limited to 'Src/parse.c')
-rw-r--r-- | Src/parse.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/Src/parse.c b/Src/parse.c index a25eb3efa..afaa0d944 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -169,9 +169,9 @@ struct heredocs *hdocs; * * WC_CASE * - first CASE is always of type HEAD, data contains offset to esac - * - after that CASEs of type OR (;;) and AND (;&), data is offset to - * next case - * - each OR/AND case is followed by pattern, pattern-number, list + * - after that CASEs of type OR (;;), AND (;&) and TESTAND (;|), + * data is offset to next case + * - each OR/AND/TESTAND case is followed by pattern, pattern-number, list * * WC_IF * - first IF is of type HEAD, data contains offset to fi @@ -1014,7 +1014,7 @@ par_for(int *complex) /* * case : CASE STRING { SEPER } ( "in" | INBRACE ) { { SEPER } STRING { BAR STRING } OUTPAR - list [ DSEMI | SEMIAMP ] } + list [ DSEMI | SEMIAMP | SEMIBAR ] } { SEPER } ( "esac" | OUTBRACE ) */ @@ -1141,10 +1141,12 @@ par_case(int *complex) n++; if (tok == SEMIAMP) type = WC_CASE_AND; + else if (tok == SEMIBAR) + type = WC_CASE_TESTAND; ecbuf[pp] = WCB_CASE(type, ecused - 1 - pp); if ((tok == ESAC && !brflag) || (tok == OUTBRACE && brflag)) break; - if (tok != DSEMI && tok != SEMIAMP) + if (tok != DSEMI && tok != SEMIAMP && tok != SEMIBAR) YYERRORV(oecused); incasepat = 1; incmdpos = 0; |