Skip to content

Commit

Permalink
41504: make empty strings work in case patterns with no leading paren…
Browse files Browse the repository at this point in the history
…thesis
  • Loading branch information
Peter Stephenson committed Aug 9, 2017
1 parent 23af20d commit cfd34c7
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 13 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
@@ -1,3 +1,9 @@
2017-08-09 Peter Stephenson <p.w.stephenson@ntlworld.com>

* 41504: Src/lex.c, Src/parse.c, Test/A01grammar.ztst: make
empty strings work in case patterns with no opening
parenthesis.

2017-08-08 Peter Stephenson <p.w.stephenson@ntlworld.com>

* unposted: Config/version.mk: update to 5.4.1-dev-0.
Expand Down
6 changes: 3 additions & 3 deletions Src/lex.c
Expand Up @@ -760,7 +760,7 @@ gettok(void)
return AMPER;
case LX1_BAR:
d = hgetc();
if (d == '|')
if (d == '|' && !incasepat)
return DBAR;
else if (d == '&')
return BARAMP;
Expand Down Expand Up @@ -1058,7 +1058,7 @@ gettokstr(int c, int sub)
if (isset(SHGLOB)) {
if (sub || in_brace_param)
break;
if (incasepat && !lexbuf.len)
if (incasepat > 0 && !lexbuf.len)
return INPAR;
if (!isset(KSHGLOB) && lexbuf.len)
goto brk;
Expand Down Expand Up @@ -1859,7 +1859,7 @@ exalias(void)
Reswd rw;

hwend();
if (interact && isset(SHINSTDIN) && !strin && !incasepat &&
if (interact && isset(SHINSTDIN) && !strin && incasepat <= 0 &&
tok == STRING && !nocorrect && !(inbufflags & INP_ALIAS) &&
(isset(CORRECTALL) || (isset(CORRECT) && incmdpos)))
spckword(&tokstr, 1, incmdpos, 1);
Expand Down
48 changes: 38 additions & 10 deletions Src/parse.c
Expand Up @@ -48,7 +48,11 @@ mod_export int incond;
/**/
mod_export int inredir;

/* != 0 if we are about to read a case pattern */
/*
* 1 if we are about to read a case pattern
* -1 if we are not quite sure
* 0 otherwise
*/

/**/
int incasepat;
Expand Down Expand Up @@ -1194,18 +1198,25 @@ par_case(int *cmplx)

for (;;) {
char *str;
int skip_zshlex;

while (tok == SEPER)
zshlex();
if (tok == OUTBRACE)
break;
if (tok == INPAR)
zshlex();
if (tok != STRING)
YYERRORV(oecused);
if (!strcmp(tokstr, "esac"))
break;
str = dupstring(tokstr);
if (tok == BAR) {
str = dupstring("");
skip_zshlex = 1;
} else {
if (tok != STRING)
YYERRORV(oecused);
if (!strcmp(tokstr, "esac"))
break;
str = dupstring(tokstr);
skip_zshlex = 0;
}
type = WC_CASE_OR;
pp = ecadd(0);
palts = ecadd(0);
Expand Down Expand Up @@ -1243,10 +1254,11 @@ par_case(int *cmplx)
* this doesn't affect our ability to match a | or ) as
* these are valid on command lines.
*/
incasepat = 0;
incasepat = -1;
incmdpos = 1;
for (;;) {
if (!skip_zshlex)
zshlex();
for (;;) {
if (tok == OUTPAR) {
ecstr(str);
ecadd(ecnpats++);
Expand Down Expand Up @@ -1302,10 +1314,26 @@ par_case(int *cmplx)
}

zshlex();
if (tok != STRING)
switch (tok) {
case STRING:
/* Normal case */
str = dupstring(tokstr);
zshlex();
break;

case OUTPAR:
case BAR:
/* Empty string */
str = dupstring("");
break;

default:
/* Oops. */
YYERRORV(oecused);
str = dupstring(tokstr);
break;
}
}
incasepat = 0;
par_save_list(cmplx);
if (tok == SEMIAMP)
type = WC_CASE_AND;
Expand Down
37 changes: 37 additions & 0 deletions Test/A01grammar.ztst
Expand Up @@ -820,6 +820,43 @@
0:case keeps exit status of last command executed in compound-list
>37

case '' in
burble) print No.
;;
spurble|) print Yes!
;;
|burble) print Not quite.
;;
esac
case '' in
burble) print No.
;;
|burble) print Wow!
;;
spurble|) print Sorry.
;;
esac
case '' in
gurgle) print No.
;;
wurgle||jurgle) print Yikes!
;;
durgle|) print Hmm.
;;
|zurgle) print Hah.
;;
esac
case '' in
# Useless doubled empty string to check special case.
||jurgle) print Ok.
;;
esac
0: case with no opening parentheses and empty string
>Yes!
>Wow!
>Yikes!
>Ok.

x=1
x=2 | echo $x
echo $x
Expand Down

0 comments on commit cfd34c7

Please sign in to comment.