From 0504dafa6e20491565ee774c33a5f7bca5dd62fa Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Thu, 31 Dec 2015 12:41:50 -0800 Subject: 37468: allow line breaks in more places in [[ ... ]] --- Src/parse.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'Src/parse.c') diff --git a/Src/parse.c b/Src/parse.c index 83ba396b0..6949b1349 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -2348,7 +2348,9 @@ par_cond_2(void) * We fall through here on any non-numeric infix operator * or any other time there are at least two arguments. */ - } + } else + while (tok == SEPER) + condlex(); if (tok == BANG) { /* * In "test" compatibility mode, "! -a ..." and "! -o ..." @@ -2385,7 +2387,7 @@ par_cond_2(void) /* Check first argument for [[ STRING ]] re-interpretation */ if (s1 /* tok != DOUTBRACK && tok != DAMPER && tok != DBAR */ && tok != LEXERR && (!dble || n_testargs)) { - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); return par_cond_double(dupstring("-n"), s1); } else YYERROR(ecused); @@ -2398,14 +2400,16 @@ par_cond_2(void) * checked it does have a string representation). */ tok = STRING; - } + } else + while (tok == SEPER && condlex != testlex) + condlex(); if (tok == INANG || tok == OUTANG) { enum lextok xtok = tok; - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); if (tok != STRING) YYERROR(ecused); s3 = tokstr; - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); ecadd(WCB_COND((xtok == INANG ? COND_STRLT : COND_STRGTR), 0)); ecstr(s1); ecstr(s3); @@ -2428,11 +2432,11 @@ par_cond_2(void) if (!n_testargs) dble = (s2 && *s2 == '-' && !s2[2]); incond++; /* parentheses do globbing */ - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); incond--; /* parentheses do grouping */ if (tok == STRING && !dble) { s3 = tokstr; - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); if (tok == STRING) { LinkList l = newlinklist(); @@ -2441,7 +2445,7 @@ par_cond_2(void) while (tok == STRING) { addlinknode(l, tokstr); - condlex(); + do condlex(); while (tok == SEPER && condlex != testlex); } return par_cond_multi(s1, l); } else -- cgit v1.2.3 From 62706b1abc6842cd63ad66ae7142bb16e26c4bcc Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Thu, 31 Dec 2015 14:16:56 -0800 Subject: 37469: do NOT allow semicolons in place of line breaks in conditionals --- ChangeLog | 3 +++ Src/parse.c | 30 ++++++++++++++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'Src/parse.c') diff --git a/ChangeLog b/ChangeLog index 3d52ac0be..53274e37e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-12-31 Barton E. Schaefer + * 37469: Src/parse.c: do NOT allow semicolons in place of line breaks + in conditionals + * unposted: Src/builtin.c: enable WARN_CREATE_GLOBAL for print -v * 37468: Src/parse.c: allow line breaks in more places in [[ ... ]] diff --git a/Src/parse.c b/Src/parse.c index 6949b1349..4829e3a6d 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -2252,6 +2252,8 @@ void (*condlex) _((void)) = zshlex; * cond : cond_1 { SEPER } [ DBAR { SEPER } cond ] */ +#define COND_SEP() (tok == SEPER && condlex != testlex && *zshlextext != ';') + /**/ static int par_cond(void) @@ -2259,11 +2261,11 @@ par_cond(void) int p = ecused, r; r = par_cond_1(); - while (tok == SEPER) + while (COND_SEP()) condlex(); if (tok == DBAR) { condlex(); - while (tok == SEPER) + while (COND_SEP()) condlex(); ecispace(p, 1); par_cond(); @@ -2284,11 +2286,11 @@ par_cond_1(void) int r, p = ecused; r = par_cond_2(); - while (tok == SEPER) + while (COND_SEP()) condlex(); if (tok == DAMPER) { condlex(); - while (tok == SEPER) + while (COND_SEP()) condlex(); ecispace(p, 1); par_cond_1(); @@ -2349,7 +2351,7 @@ par_cond_2(void) * or any other time there are at least two arguments. */ } else - while (tok == SEPER) + while (COND_SEP()) condlex(); if (tok == BANG) { /* @@ -2368,10 +2370,10 @@ par_cond_2(void) int r; condlex(); - while (tok == SEPER) + while (COND_SEP()) condlex(); r = par_cond(); - while (tok == SEPER) + while (COND_SEP()) condlex(); if (tok != OUTPAR) YYERROR(ecused); @@ -2387,7 +2389,7 @@ par_cond_2(void) /* Check first argument for [[ STRING ]] re-interpretation */ if (s1 /* tok != DOUTBRACK && tok != DAMPER && tok != DBAR */ && tok != LEXERR && (!dble || n_testargs)) { - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); return par_cond_double(dupstring("-n"), s1); } else YYERROR(ecused); @@ -2401,15 +2403,15 @@ par_cond_2(void) */ tok = STRING; } else - while (tok == SEPER && condlex != testlex) + while (COND_SEP()) condlex(); if (tok == INANG || tok == OUTANG) { enum lextok xtok = tok; - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); if (tok != STRING) YYERROR(ecused); s3 = tokstr; - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); ecadd(WCB_COND((xtok == INANG ? COND_STRLT : COND_STRGTR), 0)); ecstr(s1); ecstr(s3); @@ -2432,11 +2434,11 @@ par_cond_2(void) if (!n_testargs) dble = (s2 && *s2 == '-' && !s2[2]); incond++; /* parentheses do globbing */ - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); incond--; /* parentheses do grouping */ if (tok == STRING && !dble) { s3 = tokstr; - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); if (tok == STRING) { LinkList l = newlinklist(); @@ -2445,7 +2447,7 @@ par_cond_2(void) while (tok == STRING) { addlinknode(l, tokstr); - do condlex(); while (tok == SEPER && condlex != testlex); + do condlex(); while (COND_SEP()); } return par_cond_multi(s1, l); } else -- cgit v1.2.3