1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-12 10:00:56 +01:00

41504: make empty strings work in case patterns with no leading parenthesis

This commit is contained in:
Peter Stephenson 2017-08-09 19:57:47 +01:00
parent 23af20d0b9
commit cfd34c75ac
4 changed files with 84 additions and 13 deletions

View file

@ -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;
@ -1194,6 +1198,7 @@ par_case(int *cmplx)
for (;;) {
char *str;
int skip_zshlex;
while (tok == SEPER)
zshlex();
@ -1201,11 +1206,17 @@ par_case(int *cmplx)
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);
@ -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++);
@ -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;