followup fix for 1004D90467358D6B13C regarding escaped substitutions

found in, out of all things, Debian/m68k, by Wouter Verhelst (Yoe)
fix hacked at DebConf 11, Бања Лука, Република Српска, Босна и Херцеговина
This commit is contained in:
tg
2011-07-26 16:57:28 +00:00
parent a7566387cf
commit 80223417d7
3 changed files with 29 additions and 22 deletions

13
check.t
View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.478 2011/07/20 23:47:26 tg Exp $ # $MirOS: src/bin/mksh/check.t,v 1.479 2011/07/26 16:57:25 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 $
@ -25,7 +25,7 @@
# http://www.research.att.com/~gsf/public/ifs.sh # http://www.research.att.com/~gsf/public/ifs.sh
expected-stdout: expected-stdout:
@(#)MIRBSD KSH R40 2011/07/20 @(#)MIRBSD KSH R40 2011/07/26
description: description:
Check version of shell. Check version of shell.
stdin: stdin:
@ -1603,16 +1603,17 @@ stdin:
set +o sh set +o sh
x=foobar x=foobar
y=foobaz y=foobaz
echo "<${x%bar|baz},${y%bar|baz}>" z=fooba\?
echo "<${x%bar|baz},${y%bar|baz},${z%\?}>"
echo "<${x%ba(r|z)},${y%ba(r|z)}>" echo "<${x%ba(r|z)},${y%ba(r|z)}>"
set -o sh set -o sh
echo "<${x%bar|baz},${y%bar|baz}>" echo "<${x%bar|baz},${y%bar|baz},${z%\?}>"
z='foo(bar' z='foo(bar'
echo "<${z%(*}>" echo "<${z%(*}>"
expected-stdout: expected-stdout:
<foo,foo,fooba>
<foo,foo> <foo,foo>
<foo,foo> <foobar,foobaz,fooba>
<foobar,foobaz>
<foo> <foo>
--- ---
name: eglob-substrpl-1 name: eglob-substrpl-1

32
lex.c
View File

@ -22,7 +22,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.153 2011/06/04 16:11:18 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/lex.c,v 1.154 2011/07/26 16:57:27 tg Exp $");
/* /*
* states while lexing word * states while lexing word
@ -40,9 +40,10 @@ __RCSID("$MirOS: src/bin/mksh/lex.c,v 1.153 2011/06/04 16:11:18 tg Exp $");
#define SHEREDELIM 10 /* parsing <<,<<- delimiter */ #define SHEREDELIM 10 /* parsing <<,<<- delimiter */
#define SHEREDQUOTE 11 /* parsing " in <<,<<- delimiter */ #define SHEREDQUOTE 11 /* parsing " in <<,<<- delimiter */
#define SPATTERN 12 /* parsing *(...|...) pattern (*+?@!) */ #define SPATTERN 12 /* parsing *(...|...) pattern (*+?@!) */
#define STBRACE 13 /* parsing ${...[#%]...} */ #define SADELIM 13 /* like SBASE, looking for delimiter */
#define SADELIM 14 /* like SBASE, looking for delimiter */ #define SHERESTRING 14 /* parsing <<< string */
#define SHERESTRING 15 /* parsing <<< string */ #define STBRACEKORN 15 /* parsing ${...[#%]...} !FSH */
#define STBRACEBOURNE 16 /* parsing ${...[#%]...} FSH */
#define SINVALID 255 /* invalid state */ #define SINVALID 255 /* invalid state */
struct sretrace_info { struct sretrace_info {
@ -456,9 +457,12 @@ yylex(int cf)
* If this is a trim operation, * If this is a trim operation,
* treat (,|,) specially in STBRACE. * treat (,|,) specially in STBRACE.
*/ */
if (!Flag(FSH) && ctype(c, C_SUBOP2)) { if (ctype(c, C_SUBOP2)) {
ungetsc(c); ungetsc(c);
PUSH_STATE(STBRACE); if (Flag(FSH))
PUSH_STATE(STBRACEBOURNE);
else
PUSH_STATE(STBRACEKORN);
} else { } else {
ungetsc(c); ungetsc(c);
if (state == SDQUOTE) if (state == SDQUOTE)
@ -687,19 +691,21 @@ yylex(int cf)
*wp++ = /*{*/ '}'; *wp++ = /*{*/ '}';
break; break;
case STBRACE:
/* Same as SBASE, except (,|,) treated specially */ /* Same as SBASE, except (,|,) treated specially */
if (c == /*{*/ '}') { case STBRACEKORN:
POP_STATE(); if (c == '|')
*wp++ = CSUBST;
*wp++ = /*{*/ '}';
} else if (c == '|') {
*wp++ = SPAT; *wp++ = SPAT;
} else if (c == '(') { else if (c == '(') {
*wp++ = OPAT; *wp++ = OPAT;
/* simile for @ */ /* simile for @ */
*wp++ = ' '; *wp++ = ' ';
PUSH_STATE(SPATTERN); PUSH_STATE(SPATTERN);
} else /* FALLTHROUGH */
case STBRACEBOURNE:
if (c == /*{*/ '}') {
POP_STATE();
*wp++ = CSUBST;
*wp++ = /*{*/ '}';
} else } else
goto Sbase1; goto Sbase1;
break; break;

4
sh.h
View File

@ -151,9 +151,9 @@
#endif #endif
#ifdef EXTERN #ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.489 2011/07/20 23:47:29 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.490 2011/07/26 16:57:28 tg Exp $");
#endif #endif
#define MKSH_VERSION "R40 2011/07/20" #define MKSH_VERSION "R40 2011/07/26"
#ifndef MKSH_INCLUDES_ONLY #ifndef MKSH_INCLUDES_ONLY