Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Oct 2010 22:34:49 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214492 - in head: bin/sh tools/regression/bin/sh/expansion
Message-ID:  <201010282234.o9SMYn6f036403@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Thu Oct 28 22:34:49 2010
New Revision: 214492
URL: http://svn.freebsd.org/changeset/base/214492

Log:
  sh: Only accept a '}' inside ${v+-=?...} if double-quote state matches.
  If double-quote state does not match, treat the '}' literally.
  
  This ensures double-quote state remains the same before and after a
  ${v+-=?...} which helps with expand.c.
  
  It makes things like
    ${foo+"\${bar}"}
  which I have seen in the wild work as expected.
  
  Exp-run done by:	pav (with some other sh(1) changes)

Added:
  head/tools/regression/bin/sh/expansion/plus-minus5.0   (contents, props changed)
Modified:
  head/bin/sh/parser.c

Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c	Thu Oct 28 22:28:45 2010	(r214491)
+++ head/bin/sh/parser.c	Thu Oct 28 22:34:49 2010	(r214492)
@@ -1233,12 +1233,12 @@ readtoken1(int firstc, char const *initi
 				break;
 			case CENDVAR:	/* '}' */
 				if (level > 0 &&
-				    (state[level].category == TSTATE_VAR_OLD ||
+				    ((state[level].category == TSTATE_VAR_OLD &&
+				      state[level].syntax ==
+				      state[level - 1].syntax) ||
 				    (state[level].category == TSTATE_VAR_NEW &&
 				     state[level].syntax == BASESYNTAX))) {
-					if (state[level].category == TSTATE_VAR_OLD)
-						state[level - 1].syntax = state[level].syntax;
-					else
+					if (state[level].category == TSTATE_VAR_NEW)
 						newvarnest--;
 					level--;
 					USTPUTC(CTLENDVAR, out);

Added: head/tools/regression/bin/sh/expansion/plus-minus5.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/expansion/plus-minus5.0	Thu Oct 28 22:34:49 2010	(r214492)
@@ -0,0 +1,31 @@
+# $FreeBSD$
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+	code="$1"
+	expected="$2"
+	oIFS="$IFS"
+	eval "$code"
+	IFS='|'
+	result="$#|$*"
+	IFS="$oIFS"
+	if [ "x$result" = "x$expected" ]; then
+		ok=x$ok
+	else
+		failures=x$failures
+		echo "For $code, expected $expected actual $result"
+	fi
+}
+
+testcase 'set -- ${e:-"{x}"}'			'1|{x}'
+testcase 'set -- "${e:-"{x}"}"'			'1|{x}'
+testcase 'set -- ${h+"{x}"}'			'1|{x}'
+testcase 'set -- "${h+"{x}"}"'			'1|{x}'
+testcase 'set -- ${h:-"{x}"}'			'1|##'
+testcase 'set -- "${h:-"{x}"}"'			'1|##'
+
+test "x$failures" = x



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010282234.o9SMYn6f036403>