• back out the EXPRSUB change
• optimise some code • split testcase into two, one with expected-fail
This commit is contained in:
parent
ff0a3c8a8a
commit
75db4cdb56
21
check.t
21
check.t
@ -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
21
eval.c
@ -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
27
lex.c
@ -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
4
sh.h
@ -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
22
tree.c
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user