about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/params.c23
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;