1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-12-17 21:31:35 +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

@ -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;
@ -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;
@ -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);

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;