summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2003-05-21 16:20:54 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2003-05-21 16:20:54 +0000
commitc7a2d2225e41e38f54ace2809fd61d3867fdd43b (patch)
treed4b27fc1e5b51773c0062c60b76eb88e07fe4085
parent6d9135befe12593ebc756cc7608d241cb892d096 (diff)
downloadzsh-c7a2d2225e41e38f54ace2809fd61d3867fdd43b.tar.gz
zsh-c7a2d2225e41e38f54ace2809fd61d3867fdd43b.zip
18565: bug when ${(u)...} reduced array to length 1
-rw-r--r--ChangeLog6
-rw-r--r--Src/subst.c27
-rw-r--r--Test/D04parameter.ztst10
3 files changed, 33 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 28305e91d..43b251742 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-05-21 Peter Stephenson <pws@csr.com>
+
+ * 18565: Src/subst.c, Test/D04parameter.ztst: when ${(u)...}
+ reduced an array from more than one element to example one
+ stuff happened.
+
2003-05-19 Peter Stephenson <pws@csr.com>
* 18548: Src/Zle/zle_main.c: memory leak when vared'ing arrays
diff --git a/Src/subst.c b/Src/subst.c
index dc5044959..89ecbab7a 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -1951,25 +1951,32 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
int i;
LinkNode on = n;
- if (!aval[0] && !plan9) {
+ if (unique) {
+ if(!copied)
+ aval = arrdup(aval);
+
+ i = arrlen(aval);
+ if (i > 1)
+ zhuniqarray(aval);
+ }
+ if ((!aval[0] || !aval[1]) && !plan9) {
+ int vallen;
if (aptr > (char *) getdata(n) &&
aptr[-1] == Dnull && *fstr == Dnull)
*--aptr = '\0', fstr++;
- y = (char *) hcalloc((aptr - ostr) + strlen(fstr) + 1);
+ vallen = aval[0] ? strlen(aval[0]) : 0;
+ y = (char *) hcalloc((aptr - ostr) + vallen + strlen(fstr) + 1);
strcpy(y, ostr);
*str = y + (aptr - ostr);
+ if (vallen)
+ {
+ strcpy(*str, aval[0]);
+ *str += vallen;
+ }
strcpy(*str, fstr);
setdata(n, y);
return n;
}
- if (unique) {
- if(!copied)
- aval = arrdup(aval);
-
- i = arrlen(aval);
- if (i > 1)
- zhuniqarray(aval);
- }
if (sortit) {
if (!copied)
aval = arrdup(aval);
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index 3327caf9d..5700a0722 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -589,3 +589,13 @@
0:Parameters associated with (#m) flag
>MATCH 16 20 MATCH
>5
+
+ print -l JAMES${(u)${=:-$(echo yes yes)}}JOYCE
+ print -l JAMES${(u)${=:-$(echo yes yes she said yes i will yes)}}JOYCE
+0:Bug with (u) flag reducing arrays to one element
+>JAMESyesJOYCE
+>JAMESyes
+>she
+>said
+>i
+>willJOYCE