about summary refs log tree commit diff
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.tar.xz
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