diff options
author | Axel Beckert <abe@deuxchevaux.org> | 2015-12-03 00:18:56 +0100 |
---|---|---|
committer | Axel Beckert <abe@deuxchevaux.org> | 2015-12-03 00:18:56 +0100 |
commit | 2a9cd3d2341a123b611d697ecf014aadabbc4a51 (patch) | |
tree | bb2c3c27ca095a3456bacc1b03e309d750c777d2 /Src/params.c | |
parent | 3afa736d69960022967090aa25915fc18da01ead (diff) | |
parent | c86c20ae577312b01a2a1c13c312b4b5b21fe990 (diff) | |
download | zsh-2a9cd3d2341a123b611d697ecf014aadabbc4a51.tar.gz zsh-2a9cd3d2341a123b611d697ecf014aadabbc4a51.zip |
Merge tag 'zsh-5.2' into debian
Release 5.2 of zsh.
Diffstat (limited to 'Src/params.c')
-rw-r--r-- | Src/params.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/Src/params.c b/Src/params.c index 4600284f0..d8bf83d0e 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2537,6 +2537,7 @@ setarrvalue(Value v, char **val) freearray(val); return; } + if (v->start == 0 && v->end == -1) { if (PM_TYPE(v->pm->node.flags) == PM_HASHED) arrhashsetfn(v->pm, val, 0); @@ -2545,47 +2546,49 @@ setarrvalue(Value v, char **val) } else if (v->start == -1 && v->end == 0 && PM_TYPE(v->pm->node.flags) == PM_HASHED) { arrhashsetfn(v->pm, val, 1); + } else if ((PM_TYPE(v->pm->node.flags) == PM_HASHED)) { + freearray(val); + zerr("%s: attempt to set slice of associative array", + v->pm->node.nam); + return; } else { char **old, **new, **p, **q, **r; - int n, ll, i; + int pre_assignment_length; + int post_assignment_length; + int i; - if ((PM_TYPE(v->pm->node.flags) == PM_HASHED)) { - freearray(val); - zerr("%s: attempt to set slice of associative array", - v->pm->node.nam); - return; - } if ((v->flags & VALFLAG_INV) && unset(KSHARRAYS)) { if (v->start > 0) v->start--; v->end--; } q = old = v->pm->gsu.a->getfn(v->pm); - n = arrlen(old); + pre_assignment_length = arrlen(old); if (v->start < 0) { - v->start += n; + v->start += pre_assignment_length; if (v->start < 0) v->start = 0; } if (v->end < 0) { - v->end += n + 1; + v->end += pre_assignment_length + 1; 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) - ll += n - v->end + 1; + post_assignment_length = v->start + arrlen(val); + if (v->end <= pre_assignment_length) + post_assignment_length += pre_assignment_length - v->end + 1; - p = new = (char **) zshcalloc(sizeof(char *) * (ll + 1)); + p = new = (char **) zshcalloc(sizeof(char *) + * (post_assignment_length + 1)); for (i = 0; i < v->start; i++) - *p++ = i < n ? ztrdup(*q++) : ztrdup(""); + *p++ = i < pre_assignment_length ? ztrdup(*q++) : ztrdup(""); for (r = val; *r;) *p++ = ztrdup(*r++); - if (v->end < n) + if (v->end < pre_assignment_length) for (q = old + v->end; *q;) *p++ = ztrdup(*q++); *p = NULL; |