about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2015-12-13 14:45:22 +0000
committerMikael Magnusson <mikachu@gmail.com>2016-05-08 21:57:05 +0200
commit0a88c244ed49aa67543e3fc9b9a5b213e229472d (patch)
treee0b0642e18e5b0c7ab0f7254591cf794bf048f3b
parenta5cff664765fa9abaccd15e42e39438ccce18404 (diff)
downloadzsh-0a88c244ed49aa67543e3fc9b9a5b213e229472d.tar.gz
zsh-0a88c244ed49aa67543e3fc9b9a5b213e229472d.tar.xz
zsh-0a88c244ed49aa67543e3fc9b9a5b213e229472d.zip
Uncontroversial
Changes from Mikael's bcf975a2ea3ebc6ba1ed8150b376bef45e527cda:

- paramsubst: Change setting of 'ziplen'
-rw-r--r--Src/Modules/zutil.c10
-rw-r--r--Src/Zle/compcore.c2
-rw-r--r--Src/Zle/computil.c14
-rw-r--r--Src/Zle/zle_main.c5
-rw-r--r--Src/Zle/zle_refresh.c2
-rw-r--r--Src/builtin.c15
-rw-r--r--Src/glob.c2
-rw-r--r--Src/params.c8
-rw-r--r--Src/prompt.c2
-rw-r--r--Src/subst.c13
-rw-r--r--Src/utils.c6
-rw-r--r--Src/zsh.h1
12 files changed, 45 insertions, 35 deletions
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 477575ccd..90d8faf2e 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -42,11 +42,11 @@ savematch(MatchData *m)
     char **a;
 
     queue_signals();
-    a = getaparam("match");
+    a = getaparam("match", NULL);
     m->match = a ? zarrdup(a) : NULL;
-    a = getaparam("mbegin");
+    a = getaparam("mbegin", NULL);
     m->mbegin = a ? zarrdup(a) : NULL;
-    a = getaparam("mend");
+    a = getaparam("mend", NULL);
     m->mend = a ? zarrdup(a) : NULL;
     unqueue_signals();
 }
@@ -402,7 +402,7 @@ evalstyle(Stypat p)
     errflag = ef | (errflag & ERRFLAG_INT);
 
     queue_signals();
-    if ((ret = getaparam("reply")))
+    if ((ret = getaparam("reply", NULL)))
 	ret = arrdup(ret);
     else if ((str = getsparam("reply"))) {
 	ret = (char **) hcalloc(2 * sizeof(char *));
@@ -1329,7 +1329,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
 		int len;
 
 		queue_signals();
-		mend = getaparam("mend");
+		mend = getaparam("mend", NULL);
 		len = atoi(mend[0]);
 		unqueue_signals();
 
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index ae7068fc9..0c32be14b 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -1952,7 +1952,7 @@ get_user_var(char *nam)
 	char **arr = NULL, *val;
 
 	queue_signals();
-	if ((arr = getaparam(nam)) || (arr = gethparam(nam)))
+	if ((arr = getaparam(nam, NULL)) || (arr = gethparam(nam)))
 	    arr = (incompfunc ? arrdup(arr) : arr);
 	else if ((val = getsparam(nam))) {
 	    arr = (char **) zhalloc(2*sizeof(char *));
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index e8f0a6fe7..184b263ee 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -870,7 +870,7 @@ bin_compdescribe(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
         } else {
             char **opts;
 
-            if (!(opts = getaparam(args[4]))) {
+            if (!(opts = getaparam(args[4], NULL))) {
 		zwarnnam(nam, "unknown parameter: %s", args[4]);
 		return 1;
             }
@@ -4838,16 +4838,16 @@ bin_compfiles(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
 		return 1;
 	    }
 	    queue_signals();
-	    if (!(tmp = getaparam(args[1]))) {
+	    if (!(tmp = getaparam(args[1], NULL))) {
 		zwarnnam(nam, "unknown parameter: %s", args[1]);
 		return 0;
 	    }
 	    for (l = newlinklist(); *tmp; tmp++)
 		addlinknode(l, *tmp);
 	    set_list_array(args[1], cf_pats((args[0][1] == 'P'), !!args[0][2],
-					    l, getaparam(args[2]), args[3],
+					    l, getaparam(args[2], NULL), args[3],
 					    args[4], args[5],
-					    getaparam(args[6]), args + 7));
+					    getaparam(args[6], NULL), args + 7));
 	    unqueue_signals();
 	    return 0;
 	}
@@ -4868,12 +4868,12 @@ bin_compfiles(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
 		return 1;
 	    }
 	    queue_signals();
-	    tmp = getaparam(args[2]);
+	    tmp = getaparam(args[2], NULL);
 	    l = newlinklist();
 	    if (tmp)
 		for (; *tmp; tmp++)
 		    addlinknode(l, *tmp);
-	    if (!(tmp = getaparam(args[1]))) {
+	    if (!(tmp = getaparam(args[1], NULL))) {
 		unqueue_signals();
 		zwarnnam(nam, "unknown parameter: %s", args[1]);
 		return 0;
@@ -4898,7 +4898,7 @@ bin_compfiles(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
 		return 1;
 	    }
 	    queue_signals();
-	    if (!(tmp = getaparam(args[1]))) {
+	    if (!(tmp = getaparam(args[1], NULL))) {
 		unqueue_signals();
 		zwarnnam(nam, "unknown parameter: %s", args[1]);
 		return 0;
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 472e326d1..9bea76e9b 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1170,6 +1170,7 @@ char *
 zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
 {
     char *s, **bracket;
+    int bracket_len;
     int old_errno = errno;
     int tmout = getiparam("TMOUT");
 
@@ -1299,7 +1300,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
 
     zlecallhook(init, NULL);
 
-    if ((bracket = getaparam("zle_bracketed_paste")) && arrlen(bracket) == 2)
+    if ((bracket = getaparam("zle_bracketed_paste", &bracket_len)) && bracket_len == 2)
 	fputs(*bracket, shout);
 
     zrefresh();
@@ -1311,7 +1312,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
 		  "ZLE_VARED_ABORTED" :
 		  "ZLE_LINE_ABORTED", zlegetline(NULL, NULL));
 
-    if ((bracket = getaparam("zle_bracketed_paste")) && arrlen(bracket) == 2)
+    if ((bracket = getaparam("zle_bracketed_paste", &bracket_len)) && bracket_len == 2)
 	fputs(bracket[1], shout);
 
     if (done && !exit_pending && !errflag)
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index aca676a1c..13ab144ed 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -313,7 +313,7 @@ static const REFRESH_ELEMENT zr_start_ellipsis[] = {
 static void
 zle_set_highlight(void)
 {
-    char **atrs = getaparam("zle_highlight");
+    char **atrs = getaparam("zle_highlight", NULL);
     int special_atr_on_set = 0;
     int region_atr_on_set = 0;
     int isearch_atr_on_set = 0;
diff --git a/Src/builtin.c b/Src/builtin.c
index 6f07fc678..6bd9c2729 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -672,11 +672,9 @@ bin_set(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
     if (array) {
 	/* create an array with the specified elements */
 	char **a = NULL, **y;
-	int len = arrlen(args);
-
-	if (array < 0 && (a = getaparam(arrayname))) {
-	    int al = arrlen(a);
+	int len = arrlen(args), al;
 
+	if (array < 0 && (a = getaparam(arrayname, &al))) {
 	    if (al > len)
 		len = al;
 	}
@@ -5012,7 +5010,7 @@ bin_shift(char *name, char **argv, Options ops, UNUSED(int func))
 
     /* optional argument can be either numeric or an array */
     queue_signals();
-    if (*argv && !getaparam(*argv))
+    if (*argv && !getaparam(*argv, NULL))
         num = mathevali(*argv++);
 
     if (num < 0) {
@@ -5022,9 +5020,10 @@ bin_shift(char *name, char **argv, Options ops, UNUSED(int func))
     }
 
     if (*argv) {
+	int len = 0;
         for (; *argv; argv++)
-            if ((s = getaparam(*argv))) {
-                if (num > arrlen(s)) {
+            if ((s = getaparam(*argv, &len))) {
+                if (num > len) {
 		    zwarnnam(name, "shift count must be <= $#");
 		    ret++;
 		    continue;
@@ -5032,7 +5031,7 @@ bin_shift(char *name, char **argv, Options ops, UNUSED(int func))
 		if (OPT_ISSET(ops,'p')) {
 		    char **s2, **src, **dst;
 		    int count;
-		    l = arrlen(s);
+		    l = len;
 		    src = s;
 		    dst = s2 = (char **)zalloc((l - num + 1) * sizeof(char *));
 		    for (count = l - num; count; count--)
diff --git a/Src/glob.c b/Src/glob.c
index 2051016ec..c15bcd195 100644
--- a/Src/glob.c
+++ b/Src/glob.c
@@ -3824,7 +3824,7 @@ qualsheval(char *name, UNUSED(struct stat *buf), UNUSED(off_t days), char *str)
 	errflag = ef | (errflag & ERRFLAG_INT);
 	lastval = lv;
 
-	if (!(inserts = getaparam("reply")) &&
+	if (!(inserts = getaparam("reply", NULL)) &&
 	    !(inserts = gethparam("reply"))) {
 	    char *tmp;
 
diff --git a/Src/params.c b/Src/params.c
index c6172e018..fef95fe7f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2658,14 +2658,20 @@ getsparam_u(char *s)
 
 /**/
 mod_export char **
-getaparam(char *s)
+getaparam(char *s, int *len)
 {
     struct value vbuf;
     Value v;
 
     if (!idigit(*s) && (v = getvalue(&vbuf, &s, 0)) &&
 	PM_TYPE(v->pm->node.flags) == PM_ARRAY)
+    {
+	if (len)
+	    *len = v->pm->length;
+	    //*len = arrlen(v->pm->gsu.a->getfn(v->pm));
+	//fprintf(stderr, "%i %i\n", v->pm->length, arrlen(v->pm->gsu.a->getfn(v->pm)));
 	return v->pm->gsu.a->getfn(v->pm);
+    }
     return NULL;
 }
 
diff --git a/Src/prompt.c b/Src/prompt.c
index 831c4f948..e811f8e42 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -1882,7 +1882,7 @@ allocate_colour_buffer(void)
     if (colseq_buf_allocs++)
 	return;
 
-    atrs = getaparam("zle_highlight");
+    atrs = getaparam("zle_highlight", NULL);
     if (atrs) {
 	for (; *atrs; atrs++) {
 	    if (strpfx("fg_start_code:", *atrs)) {
diff --git a/Src/subst.c b/Src/subst.c
index f2d0f6553..8644ea0d6 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -3041,18 +3041,20 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
 	    val = dupstring("");
 	} else {
 	    char *sval;
-	    zip = getaparam(s);
+	    int ziplen;
+	    zip = getaparam(s, &ziplen);
 	    if (!zip) {
 		sval = getsparam(s);
 		if (sval)
 		    zip = hmkarray(sval);
+		ziplen = 1;
+		ziplen = !!sval;
 	    }
 	    if (!isarr) aval = mkarray(val);
 	    if (zip) {
 		char **out;
-		int alen, ziplen, outlen, i = 0;
+		int alen, outlen, i = 0;
 		alen = arrlen(aval);
-		ziplen = arrlen(zip);
 		outlen = shortest ^ (alen > ziplen) ? alen : ziplen;
 		if (!shortest && (alen == 0 || ziplen == 0)) {
 		    if (ziplen)
@@ -3083,6 +3085,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
     } else if (inbrace && (*s == '|' || *s == Bar ||
 			   *s == '*' || *s == Star)) {
 	int intersect = (*s == '*' || *s == Star);
+	int compare_len;
 	char **compare, **ap, **apsrc;
 	++s;
 	if (*itype_end(s, IIDENT, 0)) {
@@ -3090,9 +3093,9 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
 	    zerr("not an identifier: %s", s);
 	    return NULL;
 	}
-	compare = getaparam(s);
+	compare = getaparam(s, &compare_len);
 	if (compare) {
-	    HashTable ht = newuniqtable(arrlen(compare)+1);
+	    HashTable ht = newuniqtable(compare_len+1);
 	    int present;
 	    for (ap = compare; *ap; ap++)
 		(void)addhashnode2(ht, *ap, (HashNode)
diff --git a/Src/utils.c b/Src/utils.c
index 12911d3f4..28e78c149 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1483,7 +1483,7 @@ callhookfunc(char *name, LinkList lnklst, int arrayp, int *retval)
 	memcpy(arrnam, name, namlen);
 	memcpy(arrnam + namlen, HOOK_SUFFIX, HOOK_SUFFIX_LEN);
 
-	if ((arrptr = getaparam(arrnam))) {
+	if ((arrptr = getaparam(arrnam, NULL))) {
 	    arrptr = arrdup(arrptr);
 	    for (; *arrptr; arrptr++) {
 		if ((shfunc = getshfunc(*arrptr))) {
@@ -3748,7 +3748,7 @@ subst_string_by_func(Shfunc func, char *arg1, char *orig)
     if (doshfunc(func, l, 1))
 	ret = NULL;
     else
-	ret = getaparam("reply");
+	ret = getaparam("reply", NULL);
 
     sfcontext = osc;
     stopmsg = osm;
@@ -3780,7 +3780,7 @@ subst_string_by_hook(char *name, char *arg1, char *orig)
 	memcpy(arrnam, name, namlen);
 	memcpy(arrnam + namlen, HOOK_SUFFIX, HOOK_SUFFIX_LEN);
 
-	if ((arrptr = getaparam(arrnam))) {
+	if ((arrptr = getaparam(arrnam, NULL))) {
 	    /* Guard against internal modification of the array */
 	    arrptr = arrdup(arrptr);
 	    for (; *arrptr; arrptr++) {
diff --git a/Src/zsh.h b/Src/zsh.h
index eee31dad1..0e7b75e25 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1739,6 +1739,7 @@ struct param {
 
     int base;			/* output base or floating point prec    */
     int width;			/* field width                           */
+    int length;                 /* length of array                       */
     char *env;			/* location in environment, if exported  */
     char *ename;		/* name of corresponding environment var */
     Param old;			/* old struct for use with local         */