diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/params.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/Src/params.c b/Src/params.c index 4600284f0..ee1527153 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2547,7 +2547,9 @@ setarrvalue(Value v, char **val) arrhashsetfn(v->pm, val, 1); } 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); @@ -2561,31 +2563,32 @@ setarrvalue(Value v, char **val) 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; |