Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATHC] Fix handling of reversed slices in assignstrvalue
- X-seq: zsh-workers 54342
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATHC] Fix handling of reversed slices in assignstrvalue
- Date: Sun, 12 Apr 2026 16:31:47 +0200
- Arc-authentication-results: i=1; mx.google.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=I0vPFRA05abUqnuHKgceG63+npI0WZmGlN3hZuL+7xQ=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=EWFhwgs5dasNWG2qVX24IboD1juonPdFqT5hkfHbJMvAzlwLD6YqaylpkceULBNJNU Uta2xFaz6KeqvMh9dKfn2DVuLHYV6z/Y8cEXKi6IJsG0jTjy9Cm6AvtDmwQazep4VPhP 3xAfWNvsej+9/FZvsdEee2mZwh8D8YzRY8fWpaPRcujiy0O5oK5juk2G0hMq2aoJmX19 Q1LBHN/Y4jxQl1SZSeRstRpDHDkfHUYkICRWilTpv6sUYPNohhZCVuZu3gT/29GLL3AJ in5KtkJlL4MfsMW0/otMg+ZH9d8BfhjN4Waajnbk7ZmMwshc6i9mc/02iaTQKjXvj1rj JDQQ==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1776004319; cv=none; d=google.com; s=arc-20240605; b=A8ZfZN5e3xa5nrcvFZbsQG/oAaBJJgFP8xwnY3N+4dQqVOCA+GE+G87hffbrNjnoz4 5G3zwKK3gcQnwNuFjQpQxZHDKcN8YdVI7OGsqS4cQH/zx8+o6LJs1CIj2OHBtlSGLLDR SrIM9tG+D2E5GYikSx13GVuLSi6KFPMGCvXHySU4Ft0HC61BOPC5LQWuH7n9cQ0yyyl8 jiO9LSneyhniQRvO7Kocbsj/XSEW/6kOntbIjKPa/9BEQHui6F8jrR1aEay1kgqo63O3 qv77KLw4ct7Y2y3pGA8JM9IpRyNb52i2NVQFWKdRGM1vEpfcWb8OPPNXckBgzmcD+u4s 1NUw==
- Archived-at: <https://zsh.org/workers/54342>
- List-id: <zsh-workers.zsh.org>
Reversed slices (with end index < start index) are handled correctly in array assignments but not in string assignments:
a=(1 2 3 4 5 6 7 8); a[7,2]=(X Y Z); echo a=$a
s=12345678 ; s[7,2]=XYZ ; echo s=$s
Actual output:
a=1 2 3 4 5 6 X Y Z 7 8
s=123456XYZ345678
Expected output:
a=1 2 3 4 5 6 X Y Z 7 8
s=123456XYZ78
The following patch fixes this.
Philippe
diff --git a/Src/params.c b/Src/params.c
index 461e02acf..4498a57c5 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2747,8 +2747,6 @@ assignstrvalue(Value v, char *val, int flags)
v->end += zlen;
if (v->end < 0) {
v->end = 0;
- } else if (v->end >= zlen) {
- v->end = zlen;
} else {
#ifdef MULTIBYTE_SUPPORT
if (isset(MULTIBYTE)) {
@@ -2761,6 +2759,8 @@ assignstrvalue(Value v, char *val, int flags)
#endif
}
}
+ if (v->end < v->start)
+ v->end = v->start;
else if (v->end > zlen)
v->end = zlen;
diff --git a/Test/A06assign.ztst b/Test/A06assign.ztst
index 9f779b9a8..af6f889cb 100644
--- a/Test/A06assign.ztst
+++ b/Test/A06assign.ztst
@@ -133,6 +133,12 @@
>1 2 42 43 44 5
>1 2 42 100 99 5
+ array=(1 2 3 4 5)
+ array[4,2]=(42 43 44)
+ print $array
+0:Replacement of slice with end index preceding start index
+>1 2 3 42 43 44 4 5
+
# (subsection: append to array)
array=( )
@@ -708,6 +714,12 @@
0:overwrite [-2,-1] characters in short string
>ax
+ a="abcdefgh"
+ a[6,3]="xyz"
+ print $a
+0:overwrite [6,3] characters in short string
+>abcdexyzfgh
+
a="a"
a[-1]="xx"
print $a
Messages sorted by:
Reverse Date,
Date,
Thread,
Author