even more test cases for comsub (2 breaking, but one of them fixed already)

This commit is contained in:
tg
2011-03-12 20:20:17 +00:00
parent 97e1987dbf
commit fb1392fb6b
3 changed files with 28 additions and 8 deletions

18
check.t
View File

@@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.419 2011/03/12 01:04:39 tg Exp $ # $MirOS: src/bin/mksh/check.t,v 1.420 2011/03/12 20:20:14 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,9 +6949,25 @@ 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=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: expected-stdout:
yes yes
yes yes
11
21
234
678
1.
1.
1.
1.
--- ---
name: comsub-2 name: comsub-2
description: description:

11
lex.c
View File

@@ -1,4 +1,3 @@
/* $OpenBSD: lex.c,v 1.44 2008/07/03 17:52:08 otto Exp $ */ /* $OpenBSD: lex.c,v 1.44 2008/07/03 17:52:08 otto Exp $ */
/*- /*-
@@ -23,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.129 2011/03/07 20:32:49 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/lex.c,v 1.130 2011/03/12 20:20:16 tg Exp $");
/* /*
* states while lexing word * states while lexing word
@@ -100,7 +99,7 @@ static int dopprompt(const char *, int, bool);
static int backslash_skip; static int backslash_skip;
static int ignore_backslash_newline; static int ignore_backslash_newline;
static int comsub_nesting_level; short comsub_nesting_level = 0;
/* optimised getsc_bn() */ /* optimised getsc_bn() */
#define _getsc() (*source->str != '\0' && *source->str != '\\' \ #define _getsc() (*source->str != '\0' && *source->str != '\\' \
@@ -360,9 +359,7 @@ yylex(int cf)
} else { } else {
ungetsc(c); ungetsc(c);
subst_command: subst_command:
++comsub_nesting_level;
sp = yyrecursive(); sp = yyrecursive();
--comsub_nesting_level;
c2 = strlen(sp) + 1; c2 = strlen(sp) + 1;
XcheckN(ws, wp, c2); XcheckN(ws, wp, c2);
*wp++ = COMSUB; *wp++ = COMSUB;
@@ -751,11 +748,13 @@ yylex(int cf)
case SLETARRAY: case SLETARRAY:
if (c == '('/*)*/) if (c == '('/*)*/)
++statep->nparen; ++statep->nparen;
else if (c == /*(*/')') else if (c == /*(*/')') {
if (statep->nparen-- == 0) { if (statep->nparen-- == 0) {
c = 0; c = 0;
goto Done; goto Done;
} }
} else if (c == '$')
goto subst_dollar;
*wp++ = CHAR; *wp++ = CHAR;
*wp++ = c; *wp++ = c;
break; break;

7
syn.c
View File

@@ -22,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/syn.c,v 1.54 2011/03/06 01:25:35 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/syn.c,v 1.55 2011/03/12 20:20:17 tg Exp $");
struct nesting_state { struct nesting_state {
int start_token; /* token than began nesting (eg, FOR) */ int start_token; /* token than began nesting (eg, FOR) */
@@ -1093,6 +1093,10 @@ yyrecursive(void)
char *cp; char *cp;
bool old_reject; bool old_reject;
int old_symbol; int old_symbol;
extern short comsub_nesting_level;
/* tell the lexer to accept a closing parenthesis as EOD */
++comsub_nesting_level;
/* push reject state, parse recursively, pop reject state */ /* push reject state, parse recursively, pop reject state */
old_reject = reject; old_reject = reject;
@@ -1107,5 +1111,6 @@ yyrecursive(void)
cp = snptreef(NULL, 0, "%T", t->left); cp = snptreef(NULL, 0, "%T", t->left);
tfree(t, ATEMP); tfree(t, ATEMP);
--comsub_nesting_level;
return (cp); return (cp);
} }