about summary refs log tree commit diff
path: root/Src/subst.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2017-09-27 09:41:50 +0100
committerPeter Stephenson <pws@zsh.org>2017-09-27 09:41:50 +0100
commit6230e82d44da25773437c5438c83a5d5fe275420 (patch)
tree123f2cfd0c646b662208cd231e5431b97024feb9 /Src/subst.c
parent03af5fdbeed0930b5f1d3715ee1080fb993ed145 (diff)
downloadzsh-6230e82d44da25773437c5438c83a5d5fe275420.tar.gz
zsh-6230e82d44da25773437c5438c83a5d5fe275420.tar.xz
zsh-6230e82d44da25773437c5438c83a5d5fe275420.zip
41764 (test tweaked): allow [key]+=value when modifying arrays
Diffstat (limited to 'Src/subst.c')
-rw-r--r--Src/subst.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/Src/subst.c b/Src/subst.c
index 55b5444c6..eef0dc75b 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -53,16 +53,25 @@ keyvalpairelement(LinkList list, LinkNode node)
     if ((start = (char *)getdata(node)) &&
 	start[0] == Inbrack &&
 	(end = strchr(start+1, Outbrack)) &&
-	end[1] == Equals) {
+	/* ..]=value or ]+=Value */
+	(end[1] == Equals ||
+	 (end[1] == '+' && end[2] == Equals))) {
 	static char marker[2] = { Marker, '\0' };
+	static char marker_plus[3] = { Marker, '+', '\0' };
 	*end = '\0';
 
 	dat = start + 1;
 	singsub(&dat);
 	untokenize(dat);
-	setdata(node, marker);
-	node = insertlinknode(list, node, dat);
-	dat = end + 2;
+	if (end[1] == '+') {
+	    setdata(node, marker_plus);
+	    node = insertlinknode(list, node, dat);
+	    dat = end + 3;
+	} else {
+	    setdata(node, marker);
+	    node = insertlinknode(list, node, dat);
+	    dat = end + 2;
+	}
 	singsub(&dat);
 	untokenize(dat);
 	return insertlinknode(list, node, dat);