summaryrefslogtreecommitdiff
path: root/Src/subst.c
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 /Src/subst.c
parent6d9135befe12593ebc756cc7608d241cb892d096 (diff)
downloadzsh-c7a2d2225e41e38f54ace2809fd61d3867fdd43b.tar.gz
zsh-c7a2d2225e41e38f54ace2809fd61d3867fdd43b.zip
18565: bug when ${(u)...} reduced array to length 1
Diffstat (limited to 'Src/subst.c')
-rw-r--r--Src/subst.c27
1 files changed, 17 insertions, 10 deletions
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);