From 5beee95d6b9ddfc7c77b8e24e4034887948016f3 Mon Sep 17 00:00:00 2001 From: tg <tg@mirbsd.org> Date: Thu, 18 Feb 2010 17:31:23 +0000 Subject: [PATCH] at least _parse_ the construct ${foo+(bar)} correctly (whether the output is correct is still up for debate) --- check.t | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- lex.c | 4 +-- sh.h | 4 +-- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/check.t b/check.t index 1598862..7ca861b 100644 --- a/check.t +++ b/check.t @@ -1,4 +1,4 @@ -# $MirOS: src/bin/mksh/check.t,v 1.360 2010/02/18 17:30:19 tg Exp $ +# $MirOS: src/bin/mksh/check.t,v 1.361 2010/02/18 17:31:22 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 $ @@ -25,7 +25,7 @@ # http://www.research.att.com/~gsf/public/ifs.sh expected-stdout: - @(#)MIRBSD KSH R39 2010/01/29 + @(#)MIRBSD KSH R39 2010/02/18 description: Check version of shell. stdin: @@ -1000,6 +1000,95 @@ expected-stdout: expected-stderr: ! XX --- +name: expand-unglob +description: + Check that ${foo+bar} constructs are parsed correctly + XXX this output differs from bash/dash/ksh93/zsh but + XXX the exact interpretation of “word” in the construct + XXX ${var+word} is still open and to be solved… +stdin: + tl_norm() { + v=$2 + (echo "$1 plus norm foo ${v+'bar'} baz") + (echo "$1 dash norm foo ${v-'bar'} baz") + (echo "$1 eqal norm foo ${v='bar'} baz") + (echo "$1 qstn norm foo ${v?'bar'} baz") 2>&- || \ + echo "$1 qstn norm -> error" + (echo "$1 PLUS norm foo ${v:+'bar'} baz") + (echo "$1 DASH norm foo ${v:-'bar'} baz") + (echo "$1 EQAL norm foo ${v:='bar'} baz") + (echo "$1 QSTN norm foo ${v:?'bar'} baz") 2>&- || \ + echo "$1 QSTN norm -> error" + } + tl_paren() { + v=$2 + (echo "$1 plus parn foo ${v+(bar)} baz") + (echo "$1 dash parn foo ${v-(bar)} baz") + (echo "$1 eqal parn foo ${v=(bar)} baz") + (echo "$1 qstn parn foo ${v?(bar)} baz") 2>&- || \ + echo "$1 qstn parn -> error" + (echo "$1 PLUS parn foo ${v:+(bar)} baz") + (echo "$1 DASH parn foo ${v:-(bar)} baz") + (echo "$1 EQAL parn foo ${v:=(bar)} baz") + (echo "$1 QSTN parn foo ${v:?(bar)} baz") 2>&- || \ + echo "$1 QSTN parn -> error" + } + tl_norm 1 + tl_norm 2 '' + tl_norm 3 x + tl_paren 4 + tl_paren 5 '' + tl_paren 6 x +expected-stdout: + 1 plus norm foo bar baz + 1 dash norm foo baz + 1 eqal norm foo baz + 1 qstn norm foo baz + 1 PLUS norm foo baz + 1 DASH norm foo bar baz + 1 EQAL norm foo bar baz + 1 QSTN norm -> error + 2 plus norm foo bar baz + 2 dash norm foo baz + 2 eqal norm foo baz + 2 qstn norm foo baz + 2 PLUS norm foo baz + 2 DASH norm foo bar baz + 2 EQAL norm foo bar baz + 2 QSTN norm -> error + 3 plus norm foo bar baz + 3 dash norm foo x baz + 3 eqal norm foo x baz + 3 qstn norm foo x baz + 3 PLUS norm foo bar baz + 3 DASH norm foo x baz + 3 EQAL norm foo x baz + 3 QSTN norm foo x baz + 4 plus parn foo (bar) baz + 4 dash parn foo baz + 4 eqal parn foo baz + 4 qstn parn foo baz + 4 PLUS parn foo baz + 4 DASH parn foo (bar) baz + 4 EQAL parn foo (bar) baz + 4 QSTN parn -> error + 5 plus parn foo (bar) baz + 5 dash parn foo baz + 5 eqal parn foo baz + 5 qstn parn foo baz + 5 PLUS parn foo baz + 5 DASH parn foo (bar) baz + 5 EQAL parn foo (bar) baz + 5 QSTN parn -> error + 6 plus parn foo (bar) baz + 6 dash parn foo x baz + 6 eqal parn foo x baz + 6 qstn parn foo x baz + 6 PLUS parn foo (bar) baz + 6 DASH parn foo x baz + 6 EQAL parn foo x baz + 6 QSTN parn foo x baz +--- name: eglob-bad-1 description: Check that globbing isn't done when glob has syntax error diff --git a/lex.c b/lex.c index f9a2567..b4278f8 100644 --- a/lex.c +++ b/lex.c @@ -22,7 +22,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.107 2010/01/29 09:34:28 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.108 2010/02/18 17:31:23 tg Exp $"); /* * states while lexing word @@ -685,7 +685,7 @@ yylex(int cf) *wp++ = CSUBST; *wp++ = /*{*/ '}'; } else - goto Sbase1; + goto Sbase2; break; case STBRACE: diff --git a/sh.h b/sh.h index cf4db80..7a7e4f0 100644 --- a/sh.h +++ b/sh.h @@ -150,9 +150,9 @@ #endif #ifdef EXTERN -__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.380 2010/01/29 09:34:30 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.381 2010/02/18 17:31:23 tg Exp $"); #endif -#define MKSH_VERSION "R39 2010/01/29" +#define MKSH_VERSION "R39 2010/02/18" #ifndef MKSH_INCLUDES_ONLY