From 75db4cdb56506f02c76dfd03af187a23db29a51c Mon Sep 17 00:00:00 2001 From: tg Date: Sat, 12 Mar 2011 23:04:48 +0000 Subject: [PATCH] =?UTF-8?q?=E2=80=A2=20back=20out=20the=20EXPRSUB=20change?= =?UTF-8?q?=20=E2=80=A2=20optimise=20some=20code=20=E2=80=A2=20split=20tes?= =?UTF-8?q?tcase=20into=20two,=20one=20with=20expected-fail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check.t | 21 ++++++++++++++------- eval.c | 21 ++++++++------------- lex.c | 39 +++++++++++++++++++-------------------- sh.h | 4 ++-- tree.c | 22 +++++++++------------- 5 files changed, 52 insertions(+), 55 deletions(-) diff --git a/check.t b/check.t index 962977f..ff45a63 100644 --- a/check.t +++ b/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: 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. --- diff --git a/eval.c b/eval.c index 3236966..3f25d0c 100644 --- a/eval.c +++ b/eval.c @@ -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} */ /*- diff --git a/lex.c b/lex.c index b5557dd..381432c 100644 --- a/lex.c +++ b/lex.c @@ -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; } } diff --git a/sh.h b/sh.h index 4a61989..eb829ba 100644 --- a/sh.h +++ b/sh.h @@ -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) */ diff --git a/tree.c b/tree.c index e3f9205..0ec5f59 100644 --- a/tree.c +++ b/tree.c @@ -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;