about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-05-15 10:19:53 +0100
committerPeter Stephenson <pws@zsh.org>2015-05-15 10:19:53 +0100
commit0da0a0b9c735c5bf0702a0f034976c01ae50fa66 (patch)
treec1e88de241382f2c7010b43fbf15e1fdf3948ae4
parent59a874f94eea24f3697356d536541aa80b7068bf (diff)
downloadzsh-0da0a0b9c735c5bf0702a0f034976c01ae50fa66.tar.gz
zsh-0da0a0b9c735c5bf0702a0f034976c01ae50fa66.tar.xz
zsh-0da0a0b9c735c5bf0702a0f034976c01ae50fa66.zip
35153: nested math substitution
-rw-r--r--ChangeLog2
-rw-r--r--Src/subst.c13
-rw-r--r--Test/C01arith.ztst8
3 files changed, 21 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 48eda44cd..8e2df6414 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2015-05-15  Peter Stephenson  <p.stephenson@samsung.com>
 
+	* 35153: Src/subst.c, Test/C01arith.ztst: nested math substitution.
+
 	* 35151: Src/subst.c: improved check for both b and q flags.
 
 	* 35131: Src/pattern.c: "[]" in a pattern is treated as an empty
diff --git a/Src/subst.c b/Src/subst.c
index 5a12e127f..d4a04b8e5 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -259,10 +259,19 @@ stringsubst(LinkList list, LinkNode node, int pf_flags, int asssub)
 #endif
 		str--;
 	    } else if (c == Inparmath) {
-		/* Math substitution of the form $((...)) */
+		/*
+		 * Math substitution of the form $((...)).
+		 * These can be nested, for goodness sake...
+		 */
+		int mathpar = 1;
 		str[-1] = '\0';
-		while (*str != Outparmath && *str)
+		while (mathpar && *str) {
 		    str++;
+		    if (*str == Outparmath)
+			mathpar--;
+		    else if (*str == Inparmath)
+			mathpar++;
+		}
 		if (*str != Outparmath) {
 		    zerr("failed to find end of math substitution");
 		    return NULL;
diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst
index e2dfe56fc..d284e0869 100644
--- a/Test/C01arith.ztst
+++ b/Test/C01arith.ztst
@@ -387,3 +387,11 @@
   print $((`:`))
 0:Null string in arithmetic evaluation after command substitution
 >0
+
+  print $(( 1 + $(( 2 + 3 )) ))
+  print $(($((3+4))))
+  print $((1*$((2*$((3))*4))*5))
+0:Nested math substitutions.  Yes, I know, very useful.
+>6
+>7
+>120