about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-07-25 09:26:51 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-07-25 09:26:51 +0000
commit4fab17e62aaa2c0628721df45609e9ba6b17a6bc (patch)
treec809a2b17ed4df33907402bf029f3ee37c93d540
parent9084df4dc365412c6c44b0c12f53405859adcbf7 (diff)
downloadzsh-4fab17e62aaa2c0628721df45609e9ba6b17a6bc.tar.gz
zsh-4fab17e62aaa2c0628721df45609e9ba6b17a6bc.tar.xz
zsh-4fab17e62aaa2c0628721df45609e9ba6b17a6bc.zip
23696: x=x; x[-10]=y did bad things
-rw-r--r--ChangeLog6
-rw-r--r--Src/params.c5
-rw-r--r--Test/D04parameter.ztst17
3 files changed, 27 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5b3b3224d..b47e6643f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-07-25  Peter Stephenson  <pws@csr.com>
+
+	* 23696: Src/params.c, Test/D04parameter.ztst: assignment
+	to negative subscripts in scalars before the start was broken.
+	Now adds at start.
+
 2007-07-24  Peter Stephenson  <pws@csr.com>
 
 	* 23694: Src/cond.c: change of infix condition features to C:
diff --git a/Src/params.c b/Src/params.c
index 46da87580..a962f850c 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2076,8 +2076,11 @@ setstrvalue(Value v, char *val)
 	    }
 	    if (v->start > zlen)
 		v->start = zlen;
-	    if (v->end < 0)
+	    if (v->end < 0) {
 		v->end += zlen + 1;
+		if (v->end < 0)
+		    v->end = 0;
+	    }
 	    else if (v->end > zlen)
 		v->end = zlen;
 	    x = (char *) zalloc(v->start + strlen(val) + zlen - v->end + 1);
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index 6df466ed0..7f229e9a6 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -920,3 +920,20 @@
 0:Numeric sorting
 >a6 a17 a117 b6 b17 b117
 >b117 b17 b6 a117 a17 a6
+
+  x=sprodj
+  x[-10]=scrumf
+  print $x
+0:Out of range negative scalar subscripts
+>scrumfsprodj
+
+  a=(some sunny day)
+  a[-10]=(we\'ll meet again)
+  print -l $a
+0:Out of range negative array subscripts
+>we'll
+>meet
+>again
+>some
+>sunny
+>day