• back out the EXPRSUB change

• optimise some code
• split testcase into two, one with expected-fail
This commit is contained in:
tg 2011-03-12 23:04:48 +00:00
parent ff0a3c8a8a
commit 75db4cdb56
5 changed files with 52 additions and 55 deletions

21
check.t
View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.420 2011/03/12 20:20:14 tg Exp $ # $MirOS: src/bin/mksh/check.t,v 1.421 2011/03/12 23:04:44 tg Exp $
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $ # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $ # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $ # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
@ -6949,23 +6949,30 @@ description:
stdin: stdin:
echo $(case 1 in (1) echo yes;; (2) echo no;; esac) echo $(case 1 in (1) echo yes;; (2) echo no;; esac)
echo $(case 1 in 1) echo yes;; 2) echo no;; esac) echo $(case 1 in 1) echo yes;; 2) echo no;; esac)
echo $(($(case 1 in (1) echo 1;; (*) echo 2;; esac)+10))
echo $(($(case 1 in 1) echo 1;; *) echo 2;; esac)+20))
TEST=1234; echo ${TEST: $(case 1 in (1) echo 1;; (*) echo 2;; esac)} TEST=1234; echo ${TEST: $(case 1 in (1) echo 1;; (*) echo 2;; esac)}
TEST=5678; echo ${TEST: $(case 1 in 1) echo 1;; *) echo 2;; esac)} TEST=5678; echo ${TEST: $(case 1 in 1) echo 1;; *) echo 2;; esac)}
(( a = $(case 1 in (1) echo 1;; (*) echo 2;; esac) )); echo $a. (( a = $(case 1 in (1) echo 1;; (*) echo 2;; esac) )); echo $a.
(( a = $(case 1 in 1) echo 1;; *) echo 2;; esac) )); echo $a. (( a = $(case 1 in 1) echo 1;; *) echo 2;; esac) )); echo $a.
a=($(case 1 in (1) echo 1;; (*) echo 2;; esac)); echo ${a[0]}.
a=($(case 1 in 1) echo 1;; *) echo 2;; esac)); echo ${a[0]}.
expected-stdout: expected-stdout:
yes yes
yes yes
11
21
234 234
678 678
1. 1.
1. 1.
---
name: comsub-1b
description:
COMSUB inside SLETARRAY and SASPAREN/EXPRSUB
expected-fail: yes
stdin:
echo $(($(case 1 in (1) echo 1;; (*) echo 2;; esac)+10))
echo $(($(case 1 in 1) echo 1;; *) echo 2;; esac)+20))
a=($(case 1 in (1) echo 1;; (*) echo 2;; esac)); echo ${a[0]}.
a=($(case 1 in 1) echo 1;; *) echo 2;; esac)); echo ${a[0]}.
expected-stdout:
11
21
1. 1.
1. 1.
--- ---

21
eval.c
View File

@ -22,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.96 2011/03/12 21:41:13 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/eval.c,v 1.97 2011/03/12 23:04:45 tg Exp $");
/* /*
* string expansion * string expansion
@ -291,19 +291,15 @@ expand(const char *cp, /* input word */
newlines = 0; newlines = 0;
} }
continue; continue;
case EXPRSUB: { case EXPRSUB:
char *xp;
xp = wdstrip(sp, true, false);
sp = wdscan(sp, EOS);
word = IFS_WORD; word = IFS_WORD;
tilde_ok = 0; tilde_ok = 0;
if (f & DONTRUNCOMMAND) { if (f & DONTRUNCOMMAND) {
c = strlen(xp);
*dp++ = '$'; *dp++ = '('; *dp++ = '('; *dp++ = '$'; *dp++ = '('; *dp++ = '(';
XcheckN(ds, dp, c + 2); while (*sp != '\0') {
memcpy(dp, xp, c); Xcheck(ds, dp);
dp += c; *dp++ = *sp++;
}
*dp++ = ')'; *dp++ = ')'; *dp++ = ')'; *dp++ = ')';
} else { } else {
struct tbl v; struct tbl v;
@ -313,16 +309,15 @@ expand(const char *cp, /* input word */
/* not default */ /* not default */
v.type = 10; v.type = 10;
v.name[0] = '\0'; v.name[0] = '\0';
v_evaluate(&v, substitute(xp, 0), v_evaluate(&v, substitute(sp, 0),
KSH_UNWIND_ERROR, true); KSH_UNWIND_ERROR, true);
sp = strnul(sp) + 1;
for (p = str_val(&v); *p; ) { for (p = str_val(&v); *p; ) {
Xcheck(ds, dp); Xcheck(ds, dp);
*dp++ = *p++; *dp++ = *p++;
} }
} }
afree(xp, ATEMP);
continue; continue;
}
case OSUBST: { case OSUBST: {
/* ${{#}var{:}[=+-?#%]word} */ /* ${{#}var{:}[=+-?#%]word} */
/*- /*-

27
lex.c
View File

@ -22,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.133 2011/03/12 22:44:28 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/lex.c,v 1.134 2011/03/12 23:04:46 tg Exp $");
/* /*
* states while lexing word * states while lexing word
@ -246,7 +246,6 @@ yylex(int cf)
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
case SBASE: case SBASE:
// subst_base:
if (c == '[' && (cf & (VARASN|ARRAYVAR))) { if (c == '[' && (cf & (VARASN|ARRAYVAR))) {
/* temporary */ /* temporary */
*wp = EOS; *wp = EOS;
@ -588,10 +587,12 @@ yylex(int cf)
else if (c == ')') { else if (c == ')') {
statep->nparen--; statep->nparen--;
if (statep->nparen == 1) { if (statep->nparen == 1) {
/* end of EXPRSUB */
*wp++ = EOS; *wp++ = EOS;
/* EOS == '\0', coincidentally */
if ((c2 = getsc()) == /*(*/')') { if ((c2 = getsc()) == /*(*/')') {
POP_STATE(); POP_STATE();
/* end of EXPRSUB */
break; break;
} else { } else {
Source *s; Source *s;
@ -619,7 +620,6 @@ yylex(int cf)
} }
} }
} }
*wp++ = CHAR;
*wp++ = c; *wp++ = c;
break; break;
@ -682,6 +682,9 @@ yylex(int cf)
POP_STATE(); POP_STATE();
} else if (c == '\\') { } else if (c == '\\') {
switch (c = getsc()) { switch (c = getsc()) {
case 0:
/* trailing \ is lost */
break;
case '\\': case '\\':
case '$': case '`': case '$': case '`':
*wp++ = c; *wp++ = c;
@ -693,11 +696,8 @@ yylex(int cf)
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
if (c) {
/* trailing \ is lost */
*wp++ = '\\'; *wp++ = '\\';
*wp++ = c; *wp++ = c;
}
break; break;
} }
} else } else
@ -755,8 +755,6 @@ yylex(int cf)
goto Done; goto Done;
} }
} }
//else if (c == '$')
// goto subst_dollar;
*wp++ = CHAR; *wp++ = CHAR;
*wp++ = c; *wp++ = c;
break; break;
@ -856,15 +854,16 @@ yylex(int cf)
} else { } else {
if (c == '\\') { if (c == '\\') {
switch (c = getsc()) { switch (c = getsc()) {
case '\\': case '"': case 0:
case '$': case '`': /* trailing \ is lost */
case '\\':
case '"':
case '$':
case '`':
break; break;
default: default:
if (c) {
/* trailing \ lost */
*wp++ = CHAR; *wp++ = CHAR;
*wp++ = '\\'; *wp++ = '\\';
}
break; break;
} }
} }

4
sh.h
View File

@ -154,7 +154,7 @@
#endif #endif
#ifdef EXTERN #ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.442 2011/03/12 21:41:14 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.443 2011/03/12 23:04:47 tg Exp $");
#endif #endif
#define MKSH_VERSION "R39 2011/03/08" #define MKSH_VERSION "R39 2011/03/08"
@ -1149,7 +1149,7 @@ struct op {
#define CHAR 1 /* unquoted character */ #define CHAR 1 /* unquoted character */
#define QCHAR 2 /* quoted character */ #define QCHAR 2 /* quoted character */
#define COMSUB 3 /* $() substitution (0 terminated) */ #define COMSUB 3 /* $() substitution (0 terminated) */
#define EXPRSUB 4 /* $(()) substitution (EOS terminated wdstring) */ #define EXPRSUB 4 /* $(()) substitution (0 terminated) */
#define OQUOTE 5 /* opening " or ' */ #define OQUOTE 5 /* opening " or ' */
#define CQUOTE 6 /* closing " or ' */ #define CQUOTE 6 /* closing " or ' */
#define OSUBST 7 /* opening ${ subst (followed by { or X) */ #define OSUBST 7 /* opening ${ subst (followed by { or X) */

22
tree.c
View File

@ -22,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/tree.c,v 1.38 2011/03/12 21:41:15 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/tree.c,v 1.39 2011/03/12 23:04:48 tg Exp $");
#define INDENT 8 #define INDENT 8
@ -302,8 +302,8 @@ tputS(const char *wp, struct shf *shf)
break; break;
case EXPRSUB: case EXPRSUB:
shf_puts("$((", shf); shf_puts("$((", shf);
tputS(wp, shf); while ((c = *wp++) != 0)
wp = wdscan(wp, EOS); shf_putc(c, shf);
shf_puts("))", shf); shf_puts("))", shf);
break; break;
case OQUOTE: case OQUOTE:
@ -527,10 +527,8 @@ wdscan(const char *wp, int c)
case QCHAR: case QCHAR:
wp++; wp++;
break; break;
case EXPRSUB:
wp = wdscan(wp, EOS);
break;
case COMSUB: case COMSUB:
case EXPRSUB:
while (*wp++ != 0) while (*wp++ != 0)
; ;
break; break;
@ -618,8 +616,8 @@ wdstrip_internal(struct shf *shf, const char *wp, bool keepq, bool make_magic)
break; break;
case EXPRSUB: case EXPRSUB:
shf_puts("$((", shf); shf_puts("$((", shf);
wdstrip_internal(shf, wp, keepq, make_magic); while (*wp != 0)
wp = wdscan(wp, EOS); shf_putchar(*wp++, shf);
shf_puts("))", shf); shf_puts("))", shf);
break; break;
case OQUOTE: case OQUOTE:
@ -824,17 +822,15 @@ dumpwdvar(struct shf *shf, const char *wp)
goto closeandout; goto closeandout;
case COMSUB: case COMSUB:
shf_puts("COMSUB<", shf); shf_puts("COMSUB<", shf);
dumpsub:
while ((c = *wp++) != 0) while ((c = *wp++) != 0)
dumpchar(shf, c); dumpchar(shf, c);
closeandout: closeandout:
shf_putc('>', shf); shf_putc('>', shf);
break; break;
case EXPRSUB: case EXPRSUB:
shf_puts("EXPRSUB[", shf); shf_puts("EXPRSUB<", shf);
dumpwdvar(shf, wp); goto dumpsub;
wp = wdscan(wp, EOS);
shf_puts("]EXPRSUB", shf);
break;
case OQUOTE: case OQUOTE:
shf_fprintf(shf, "OQUOTE{%d", ++quotelevel); shf_fprintf(shf, "OQUOTE{%d", ++quotelevel);
break; break;