about summary refs log tree commit diff
path: root/Src/builtin.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2012-07-15 18:06:40 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2012-07-15 18:06:40 +0000
commit129ebac4b02c370869b423aff566d5386bf165d8 (patch)
tree685eee834fd5c650094ff8e5f8e2bcac41d6c170 /Src/builtin.c
parentb2722856e2cbc8bde176f1e5883a331a5d666cfd (diff)
downloadzsh-129ebac4b02c370869b423aff566d5386bf165d8.tar.gz
zsh-129ebac4b02c370869b423aff566d5386bf165d8.tar.xz
zsh-129ebac4b02c370869b423aff566d5386bf165d8.zip
Bart: 30560: unset ordinary array element by setting to null
Diffstat (limited to 'Src/builtin.c')
-rw-r--r--Src/builtin.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 070cbba9b..b5a98cbd2 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3055,6 +3055,34 @@ bin_unset(char *name, char **argv, Options ops, int func)
 		    *sse = ']';
 		}
 		paramtab = tht;
+	    } else if (PM_TYPE(pm->node.flags) == PM_SCALAR ||
+		       PM_TYPE(pm->node.flags) == PM_ARRAY) {
+		struct value vbuf;
+		vbuf.isarr = (PM_TYPE(pm->node.flags) == PM_ARRAY ?
+			      SCANPM_ARRONLY : 0);
+		vbuf.pm = pm;
+		vbuf.flags = 0;
+		vbuf.start = 0;
+		vbuf.end = -1;
+		vbuf.arr = 0;
+		*ss = '[';
+		if (getindex(&ss, &vbuf, SCANPM_ASSIGNING) == 0 &&
+		    vbuf.pm && !(vbuf.pm->node.flags & PM_UNSET)) {
+		    if (PM_TYPE(pm->node.flags) == PM_SCALAR) {
+			setstrvalue(&vbuf, ztrdup(""));
+		    } else {
+			/* start is after the element for reverse index */
+			int start = vbuf.start - !!(vbuf.flags & VALFLAG_INV);
+			if (start < arrlen(vbuf.pm->u.arr)) {
+			    char *arr[2];
+			    arr[0] = "";
+			    arr[1] = 0;
+			    setarrvalue(&vbuf, zarrdup(arr));
+			}
+		    }
+		}
+		returnval = errflag;
+		errflag = 0;
 	    } else {
 		zerrnam(name, "%s: invalid element for unset", s);
 		returnval = 1;