summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2010-12-21 16:54:30 +0000
committerBart Schaefer <barts@users.sourceforge.net>2010-12-21 16:54:30 +0000
commitbc1a12f91e83488c8e46789bdaedf28090829a3a (patch)
tree85fa80981b280027a94b36d8f8afece1d81e7dd8
parentd3ec328926fd85ec846c47aa996bbee1d3e24f06 (diff)
downloadzsh-bc1a12f91e83488c8e46789bdaedf28090829a3a.tar.gz
zsh-bc1a12f91e83488c8e46789bdaedf28090829a3a.zip
users/15662: array slice assignment with one index positive and one negative.
-rw-r--r--ChangeLog9
-rw-r--r--Src/params.c4
-rw-r--r--Test/A06assign.ztst24
3 files changed, 33 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e4b442dfb..3ec753da9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-12-21 Barton E. Schaefer <schaefer@zsh.org>
+
+ * users/15662: Src/params.c: fix array slice assignment with one
+ index positive and one negative.
+
+ * unposted: Test/A06assign.ztst: tests for users/15662.
+
2010-12-21 Peter Stephenson <pws@csr.com>
* users/15663: Test/A06Assign.ztst: some (incomplete) array
@@ -14024,5 +14031,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5165 $
+* $Revision: 1.5166 $
*****************************************************
diff --git a/Src/params.c b/Src/params.c
index 92e0e5368..3eb83eab2 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2442,8 +2442,6 @@ setarrvalue(Value v, char **val)
v->start--;
v->end--;
}
- if (v->end < v->start)
- v->end = v->start;
q = old = v->pm->gsu.a->getfn(v->pm);
n = arrlen(old);
if (v->start < 0) {
@@ -2456,6 +2454,8 @@ setarrvalue(Value v, char **val)
if (v->end < 0)
v->end = 0;
}
+ if (v->end < v->start)
+ v->end = v->start;
ll = v->start + arrlen(val);
if (v->end <= n)
diff --git a/Test/A06assign.ztst b/Test/A06assign.ztst
index 46b38359a..84500f605 100644
--- a/Test/A06assign.ztst
+++ b/Test/A06assign.ztst
@@ -104,7 +104,29 @@
0:Replacement off start doesn't leave gaps. Hope this is right.
>43 1 2 3 4 5
-# TODO: mixed indices [-num,num] and [num,-num]
+ array=(1 2 3 4 5)
+ array[1,-1]=(42 43)
+ print $array
+ array[-3,3]=(1 2 3 4 5)
+ print $array
+0:Replacement of entire array, mixed indices
+>42 43
+>1 2 3 4 5
+
+ array=(1 2 3 4 5)
+ array[-7,7]=(42 43)
+ print $array
+0:Replacement of more than entire array, mixed indices
+>42 43
+
+ array=(1 2 3 4 5)
+ array[3,-2]=(42 43 44)
+ print $array
+ array[-3,5]=(100 99)
+ print $array
+0:Replacement of slice in middle, mixed indices
+>1 2 42 43 44 5
+>1 2 42 100 99 5
# tests of var+=scalar