From 0a88c244ed49aa67543e3fc9b9a5b213e229472d Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 13 Dec 2015 14:45:22 +0000 Subject: Uncontroversial Changes from Mikael's bcf975a2ea3ebc6ba1ed8150b376bef45e527cda: - paramsubst: Change setting of 'ziplen' --- Src/Modules/zutil.c | 10 +++++----- Src/Zle/compcore.c | 2 +- Src/Zle/computil.c | 14 +++++++------- Src/Zle/zle_main.c | 5 +++-- Src/Zle/zle_refresh.c | 2 +- Src/builtin.c | 15 +++++++-------- Src/glob.c | 2 +- Src/params.c | 8 +++++++- Src/prompt.c | 2 +- Src/subst.c | 13 ++++++++----- Src/utils.c | 6 +++--- Src/zsh.h | 1 + 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 */ -- cgit 1.4.1