• 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: 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 $
@ -6949,23 +6949,30 @@ description:
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 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=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[0]}.
a=($(case 1 in 1) echo 1;; *) echo 2;; esac)); echo ${a[0]}.
expected-stdout:
yes
yes
11
21
234
678
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.
---

21
eval.c
View File

@ -22,7 +22,7 @@
#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
@ -291,19 +291,15 @@ expand(const char *cp, /* input word */
newlines = 0;
}
continue;
case EXPRSUB: {
char *xp;
xp = wdstrip(sp, true, false);
sp = wdscan(sp, EOS);
case EXPRSUB:
word = IFS_WORD;
tilde_ok = 0;
if (f & DONTRUNCOMMAND) {
c = strlen(xp);
*dp++ = '$'; *dp++ = '('; *dp++ = '(';
XcheckN(ds, dp, c + 2);
memcpy(dp, xp, c);
dp += c;
while (*sp != '\0') {
Xcheck(ds, dp);
*dp++ = *sp++;
}
*dp++ = ')'; *dp++ = ')';
} else {
struct tbl v;
@ -313,16 +309,15 @@ expand(const char *cp, /* input word */
/* not default */
v.type = 10;
v.name[0] = '\0';
v_evaluate(&v, substitute(xp, 0),
v_evaluate(&v, substitute(sp, 0),
KSH_UNWIND_ERROR, true);
sp = strnul(sp) + 1;
for (p = str_val(&v); *p; ) {
Xcheck(ds, dp);
*dp++ = *p++;
}
}
afree(xp, ATEMP);
continue;
}
case OSUBST: {
/* ${{#}var{:}[=+-?#%]word} */
/*-

39
lex.c
View File

@ -22,7 +22,7 @@
#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
@ -246,7 +246,6 @@ yylex(int cf)
}
/* FALLTHROUGH */
case SBASE:
// subst_base:
if (c == '[' && (cf & (VARASN|ARRAYVAR))) {
/* temporary */
*wp = EOS;
@ -588,10 +587,12 @@ yylex(int cf)
else if (c == ')') {
statep->nparen--;
if (statep->nparen == 1) {
/* end of EXPRSUB */
*wp++ = EOS;
/* EOS == '\0', coincidentally */
if ((c2 = getsc()) == /*(*/')') {
POP_STATE();
/* end of EXPRSUB */
break;
} else {
Source *s;
@ -619,9 +620,8 @@ yylex(int cf)
}
}
}
*wp++ = CHAR;
*wp++ = c;
break;
*wp++ = c;
break;
case SQBRACE:
if (c == '\\') {
@ -682,6 +682,9 @@ yylex(int cf)
POP_STATE();
} else if (c == '\\') {
switch (c = getsc()) {
case 0:
/* trailing \ is lost */
break;
case '\\':
case '$': case '`':
*wp++ = c;
@ -693,11 +696,8 @@ yylex(int cf)
}
/* FALLTHROUGH */
default:
if (c) {
/* trailing \ is lost */
*wp++ = '\\';
*wp++ = c;
}
*wp++ = '\\';
*wp++ = c;
break;
}
} else
@ -755,8 +755,6 @@ yylex(int cf)
goto Done;
}
}
//else if (c == '$')
// goto subst_dollar;
*wp++ = CHAR;
*wp++ = c;
break;
@ -856,15 +854,16 @@ yylex(int cf)
} else {
if (c == '\\') {
switch (c = getsc()) {
case '\\': case '"':
case '$': case '`':
case 0:
/* trailing \ is lost */
case '\\':
case '"':
case '$':
case '`':
break;
default:
if (c) {
/* trailing \ lost */
*wp++ = CHAR;
*wp++ = '\\';
}
*wp++ = CHAR;
*wp++ = '\\';
break;
}
}

4
sh.h
View File

@ -154,7 +154,7 @@
#endif
#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
#define MKSH_VERSION "R39 2011/03/08"
@ -1149,7 +1149,7 @@ struct op {
#define CHAR 1 /* unquoted character */
#define QCHAR 2 /* quoted character */
#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 CQUOTE 6 /* closing " or ' */
#define OSUBST 7 /* opening ${ subst (followed by { or X) */

22
tree.c
View File

@ -22,7 +22,7 @@
#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
@ -302,8 +302,8 @@ tputS(const char *wp, struct shf *shf)
break;
case EXPRSUB:
shf_puts("$((", shf);
tputS(wp, shf);
wp = wdscan(wp, EOS);
while ((c = *wp++) != 0)
shf_putc(c, shf);
shf_puts("))", shf);
break;
case OQUOTE:
@ -527,10 +527,8 @@ wdscan(const char *wp, int c)
case QCHAR:
wp++;
break;
case EXPRSUB:
wp = wdscan(wp, EOS);
break;
case COMSUB:
case EXPRSUB:
while (*wp++ != 0)
;
break;
@ -618,8 +616,8 @@ wdstrip_internal(struct shf *shf, const char *wp, bool keepq, bool make_magic)
break;
case EXPRSUB:
shf_puts("$((", shf);
wdstrip_internal(shf, wp, keepq, make_magic);
wp = wdscan(wp, EOS);
while (*wp != 0)
shf_putchar(*wp++, shf);
shf_puts("))", shf);
break;
case OQUOTE:
@ -824,17 +822,15 @@ dumpwdvar(struct shf *shf, const char *wp)
goto closeandout;
case COMSUB:
shf_puts("COMSUB<", shf);
dumpsub:
while ((c = *wp++) != 0)
dumpchar(shf, c);
closeandout:
shf_putc('>', shf);
break;
case EXPRSUB:
shf_puts("EXPRSUB[", shf);
dumpwdvar(shf, wp);
wp = wdscan(wp, EOS);
shf_puts("]EXPRSUB", shf);
break;
shf_puts("EXPRSUB<", shf);
goto dumpsub;
case OQUOTE:
shf_fprintf(shf, "OQUOTE{%d", ++quotelevel);
break;