diff options
| author | Philippe Altherr <philippe.altherr@gmail.com> | 2025-11-19 15:25:29 +0100 |
|---|---|---|
| committer | Oliver Kiddle <opk@zsh.org> | 2025-11-24 23:18:26 +0100 |
| commit | 8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4 (patch) | |
| tree | bd9110ae128404cfb70ae0a819d888690b9ff6c9 /Src/params.c | |
| parent | 54104: fix bug with packing strings into wordcode (diff) | |
| download | zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar.gz zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar.bz2 zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar.lz zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar.xz zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.tar.zst zsh-8a3ee5a802a89fd12ddc2741d8ac785bb4169bf4.zip | |
54093 (tweaked per 54101): Cleanup isarr fields and variables
Diffstat (limited to 'Src/params.c')
| -rw-r--r-- | Src/params.c | 184 |
1 files changed, 93 insertions, 91 deletions
diff --git a/Src/params.c b/Src/params.c index ccb73c9b6..fadcc669c 100644 --- a/Src/params.c +++ b/Src/params.c @@ -649,10 +649,11 @@ scanparamvals(HashNode hn, int flags) if (!(flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL))) return; } - v.isarr = (PM_TYPE(v.pm->node.flags) & (PM_ARRAY|PM_HASHED)); - v.flags = 0; + v.scanflags = 0; + v.valflags = 0; v.start = 0; v.end = -1; + v.arr = NULL; paramvals[numparamvals] = getstrvalue(&v); if (flags & SCANPM_MATCHVAL) { if (pattry(scanprog, paramvals[numparamvals])) { @@ -695,7 +696,7 @@ getvaluearr(Value v) else if (PM_TYPE(v->pm->node.flags) == PM_ARRAY) return v->arr = v->pm->gsu.a->getfn(v->pm); else if (PM_TYPE(v->pm->node.flags) == PM_HASHED) { - v->arr = paramvalarr(v->pm->gsu.h->getfn(v->pm), v->isarr); + v->arr = paramvalarr(v->pm->gsu.h->getfn(v->pm), v->scanflags); /* Can't take numeric slices of associative arrays */ v->start = 0; v->end = numparamvals + 1; @@ -719,7 +720,7 @@ issetvar(char *name) if (!(v = getvalue(&vbuf, &name, 1)) || *name) return 0; /* no value or more chars after the variable name */ - if (v->isarr & ~SCANPM_ARRONLY) + if (v->scanflags & ~SCANPM_ARRONLY) return v->end > 1; /* for extracted elements, end gives us a count */ slice = v->start != 0 || v->end != -1; @@ -1318,7 +1319,7 @@ isident(char *s) * * *inv is set to indicate if the subscript is reversed (output) * v is the Value for the parameter being accessed (input; note - * v->isarr may be modified, and if v is a hash the parameter will + * v->scanflags may be modified, and if v is a hash the parameter will * be updated to the element of the hash) * a2 is 1 if this is the second subscript of a range (input) * *w is only set if we need to find the end of a word (input; should @@ -1340,7 +1341,7 @@ isident(char *s) /**/ static zlong getarg(char **str, int *inv, Value v, int a2, zlong *w, - int *prevcharlen, int *nextcharlen, int flags) + int *prevcharlen, int *nextcharlen, int scanflags) { int hasbeg = 0, word = 0, rev = 0, ind = 0, down = 0, l, i, ishash; int keymatch = 0, needtok = 0, arglen, len, inpar = 0; @@ -1464,23 +1465,23 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, down = !down; num = -num; } - if (v->isarr & SCANPM_WANTKEYS) - *inv = (ind || !(v->isarr & SCANPM_WANTVALS)); - else if (v->isarr & SCANPM_WANTVALS) + if (v->scanflags & SCANPM_WANTKEYS) + *inv = (ind || !(v->scanflags & SCANPM_WANTVALS)); + else if (v->scanflags & SCANPM_WANTVALS) *inv = 0; else { - if (v->isarr) { + if (v->scanflags) { if (ind) { - v->isarr |= SCANPM_WANTKEYS; - v->isarr &= ~SCANPM_WANTVALS; + v->scanflags |= SCANPM_WANTKEYS; + v->scanflags &= ~SCANPM_WANTVALS; } else if (rev) - v->isarr |= SCANPM_WANTVALS; + v->scanflags |= SCANPM_WANTVALS; /* * This catches the case where we are using "k" (rather * than "K") on a hash. */ if (!down && keymatch && ishash) - v->isarr &= ~SCANPM_MATCHMANY; + v->scanflags &= ~SCANPM_MATCHMANY; } *inv = ind; } @@ -1541,7 +1542,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, s = dupstring(s); if (parsestr(&s)) return 0; - if (flags & SCANPM_NOEXEC) + if (scanflags & SCANPM_NOEXEC) opts[EXECOPT] = 0; singsub(&s); opts[EXECOPT] = exe; @@ -1551,7 +1552,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, if (ishash) { HashTable ht = v->pm->gsu.h->getfn(v->pm); if (!ht) { - if (flags & SCANPM_CHECKING) + if (scanflags & SCANPM_CHECKING) return 0; ht = newparamtable(17, v->pm->node.nam); v->pm->gsu.h->setfn(v->pm, ht); @@ -1563,7 +1564,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, v->pm = createparam(s, PM_SCALAR|PM_UNSET); paramtab = tht; } - v->isarr = (*inv ? SCANPM_WANTINDEX : 0); + v->scanflags = (*inv ? SCANPM_WANTINDEX : 0); v->start = 0; *inv = 0; /* We've already obtained the "index" (key) */ *w = v->end = -1; @@ -1573,7 +1574,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, if (isset(KSHARRAYS) && r >= 0) r++; } - if (word && !v->isarr) { + if (word && !v->scanflags) { s = t = getstrvalue(v); i = wordcount(s, sep, 0); if (r < 0) @@ -1592,7 +1593,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, *w = (zlong)(s - t); return (a2 ? s : d + 1) - t; - } else if (!v->isarr && !word) { + } else if (!v->scanflags && !word) { int lastcharlen = 1; s = getstrvalue(v); /* @@ -1640,7 +1641,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, } } } else { - if (!v->isarr && !word && !quote_arg) { + if (!v->scanflags && !word && !quote_arg) { l = strlen(s); if (a2) { if (!l || *s != '*') { @@ -1662,7 +1663,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, if (quote_arg) { untokenize(s); /* Scalar (e) needs implicit asterisk tokens */ - if (!v->isarr && !word) { + if (!v->scanflags && !word) { l = strlen(s); d = (char *) hcalloc(l + 2); if (a2) { @@ -1682,27 +1683,27 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, } else pprog = NULL; - if (v->isarr) { + if (v->scanflags) { if (ishash) { scanprog = pprog; scanstr = s; if (keymatch) - v->isarr |= SCANPM_KEYMATCH; + v->scanflags |= SCANPM_KEYMATCH; else { if (!pprog) return 1; if (ind) - v->isarr |= SCANPM_MATCHKEY; + v->scanflags |= SCANPM_MATCHKEY; else - v->isarr |= SCANPM_MATCHVAL; + v->scanflags |= SCANPM_MATCHVAL; } if (down) - v->isarr |= SCANPM_MATCHMANY; + v->scanflags |= SCANPM_MATCHMANY; if ((ta = getvaluearr(v)) && - (*ta || ((v->isarr & SCANPM_MATCHMANY) && - (v->isarr & (SCANPM_MATCHKEY | SCANPM_MATCHVAL | - SCANPM_KEYMATCH))))) { - *inv = (v->flags & VALFLAG_INV) ? 1 : 0; + (*ta || ((v->scanflags & SCANPM_MATCHMANY) && + (v->scanflags & (SCANPM_MATCHKEY | SCANPM_MATCHVAL | + SCANPM_KEYMATCH))))) { + *inv = (v->valflags & VALFLAG_INV) ? 1 : 0; *w = v->end; scanprog = NULL; return 1; @@ -1967,19 +1968,20 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, * v: In/Out parameter. Its .start and .end members (at least) will be updated * with the parsed indices. * - * flags: can be either SCANPM_DQUOTED or zero. Other bits are not used. + * scanflags: can be a combination of SCANPM_DQUOTED, SCANPM_NOEXEC, and + * SCANPM_CHECKING. Other bits are not used. */ /**/ int -getindex(char **pptr, Value v, int flags) +getindex(char **pptr, Value v, int scanflags) { int start, end, inv = 0; char *s = *pptr, *tbrack; *s++ = '['; /* Error handled after untokenizing */ - s = parse_subscript(s, flags & SCANPM_DQUOTED, ']'); + s = parse_subscript(s, scanflags & SCANPM_DQUOTED, ']'); /* Now we untokenize everything except inull() markers so we can check * * for the '*' and '@' special subscripts. The inull()s are removed * * in getarg() after we know whether we're doing reverse indexing. */ @@ -1999,8 +2001,8 @@ getindex(char **pptr, Value v, int flags) } s = *pptr + 1; if ((s[0] == '*' || s[0] == '@') && s + 1 == tbrack) { - if ((v->isarr || IS_UNSET_VALUE(v)) && s[0] == '@') - v->isarr |= SCANPM_ISVAR_AT; + if ((v->scanflags || IS_UNSET_VALUE(v)) && s[0] == '@') + v->scanflags |= SCANPM_ISVAR_AT; v->start = 0; v->end = -1; s += 2; @@ -2009,10 +2011,10 @@ getindex(char **pptr, Value v, int flags) int startprevlen, startnextlen; start = getarg(&s, &inv, v, 0, &we, &startprevlen, &startnextlen, - flags); + scanflags); if (inv) { - if (!v->isarr && start != 0) { + if (!v->scanflags && start != 0) { char *t, *p; t = getstrvalue(v); /* @@ -2064,9 +2066,9 @@ getindex(char **pptr, Value v, int flags) } if (start > 0 && (isset(KSHARRAYS) || (v->pm->node.flags & PM_HASHED))) start--; - if (v->isarr != SCANPM_WANTINDEX) { - v->flags |= VALFLAG_INV; - v->isarr = 0; + if (v->scanflags != SCANPM_WANTINDEX) { + v->valflags |= VALFLAG_INV; + v->scanflags = 0; v->start = start; v->end = start + 1; } @@ -2083,7 +2085,7 @@ getindex(char **pptr, Value v, int flags) if ((com = (*s == ','))) { s++; - end = getarg(&s, &inv, v, 1, &dummy, NULL, NULL, flags); + end = getarg(&s, &inv, v, 1, &dummy, NULL, NULL, scanflags); } else { end = we ? we : start; } @@ -2118,18 +2120,18 @@ getindex(char **pptr, Value v, int flags) * for setting elements. Set the indexes * to a range that returns empty for other accesses. */ - v->flags |= VALFLAG_EMPTY; + v->valflags |= VALFLAG_EMPTY; start = -1; com = 1; } } if (s == tbrack) { s++; - if (v->isarr && !com && - (!(v->isarr & SCANPM_MATCHMANY) || - !(v->isarr & (SCANPM_MATCHKEY | SCANPM_MATCHVAL | - SCANPM_KEYMATCH)))) - v->isarr = 0; + if (v->scanflags && !com && + (!(v->scanflags & SCANPM_MATCHMANY) || + !(v->scanflags & (SCANPM_MATCHKEY | SCANPM_MATCHVAL | + SCANPM_KEYMATCH)))) + v->scanflags = 0; v->start = start; v->end = end; } else @@ -2151,12 +2153,12 @@ getvalue(Value v, char **pptr, int bracks) /**/ mod_export Value -fetchvalue(Value v, char **pptr, int bracks, int flags) +fetchvalue(Value v, char **pptr, int bracks, int scanflags) { char *s, *t, *ie; char sav, c; int ppar = 0; - int itype = (flags & SCANPM_NONAMESPC) ? IIDENT : INAMESPC; + int itype = (scanflags & SCANPM_NONAMESPC) ? IIDENT : INAMESPC; s = t = *pptr; @@ -2189,12 +2191,10 @@ fetchvalue(Value v, char **pptr, int bracks, int flags) if ((sav = *s)) *s = '\0'; if (ppar) { - if (v) - memset(v, 0, sizeof(*v)); - else - v = (Value) hcalloc(sizeof *v); + if (!v) + v = (Value) zhalloc(sizeof *v); + memset(v, 0, sizeof(*v)); v->pm = argvparam; - v->flags = 0; v->start = ppar - 1; v->end = ppar; if (sav) @@ -2205,7 +2205,7 @@ fetchvalue(Value v, char **pptr, int bracks, int flags) int isrefslice = 0; isvarat = (t[0] == '@' && !t[1]); - if (flags & SCANPM_NONAMEREF) + if (scanflags & SCANPM_NONAMEREF) pm = (Param) paramtab->getnode2(paramtab, *t == '0' ? "0" : t); else pm = (Param) paramtab->getnode(paramtab, *t == '0' ? "0" : t); @@ -2220,11 +2220,7 @@ fetchvalue(Value v, char **pptr, int bracks, int flags) if (!pm || ((pm->node.flags & PM_UNSET) && !(pm->node.flags & PM_DECLARED))) return NULL; - if (v) - memset(v, 0, sizeof(*v)); - else - v = (Value) hcalloc(sizeof *v); - if ((pm->node.flags & PM_NAMEREF) && !(flags & SCANPM_NONAMEREF)) { + if ((pm->node.flags & PM_NAMEREF) && !(scanflags & SCANPM_NONAMEREF)) { char *refname = GETREFNAME(pm); if (refname && *refname) { /* only happens for namerefs pointing to array elements */ @@ -2247,7 +2243,7 @@ fetchvalue(Value v, char **pptr, int bracks, int flags) !(pm->node.flags & PM_DECLARED))) return NULL; if (ss) { - flags |= SCANPM_NOEXEC; + scanflags |= SCANPM_NOEXEC; *ss = sav; s = dyncat(ss,*pptr); isrefslice = 1; @@ -2255,27 +2251,30 @@ fetchvalue(Value v, char **pptr, int bracks, int flags) s = *pptr; } } + if (!v) + v = (Value) zhalloc(sizeof *v); + memset(v, 0, sizeof(*v)); if (PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED)) { - /* Overload v->isarr as the flag bits for hashed arrays. */ - v->isarr = flags | (isvarat ? SCANPM_ISVAR_AT : 0); + /* Overload v->scanflags as the flag bits for hashed arrays. */ + v->scanflags = scanflags | (isvarat ? SCANPM_ISVAR_AT : 0); /* If no flags were passed, we need something to represent * * `true' yet differ from an explicit WANTVALS. Use a * * special flag for this case. */ - if (!v->isarr) - v->isarr = SCANPM_ARRONLY; + if (!v->scanflags) + v->scanflags = SCANPM_ARRONLY; } v->pm = pm; - v->flags = isrefslice ? VALFLAG_REFSLICE : 0; - v->start = 0; + if (isrefslice) + v->valflags = VALFLAG_REFSLICE; v->end = -1; if (bracks > 0 && (*s == '[' || *s == Inbrack)) { - if (getindex(&s, v, flags)) { + if (getindex(&s, v, scanflags)) { *pptr = s; return v; } - } else if (!(flags & SCANPM_ASSIGNING) && v->isarr && + } else if (!(scanflags & SCANPM_ASSIGNING) && v->scanflags && itype_end(t, INAMESPC, 1) != t && isset(KSHARRAYS)) - v->end = 1, v->isarr = 0; + v->end = 1, v->scanflags = 0; } if (!bracks && *s) return NULL; @@ -2323,7 +2322,7 @@ getstrvalue(Value v) if (!v) return hcalloc(1); - if ((v->flags & VALFLAG_INV) && !(v->pm->node.flags & PM_HASHED)) { + if ((v->valflags & VALFLAG_INV) && !(v->pm->node.flags & PM_HASHED)) { sprintf(buf, "%d", v->start); s = dupstring(buf); return s; @@ -2331,8 +2330,8 @@ getstrvalue(Value v) switch(PM_TYPE(v->pm->node.flags)) { case PM_HASHED: - /* (!v->isarr) should be impossible unless emulating ksh */ - if (!v->isarr && EMULATION(EMULATE_KSH)) { + /* (!v->scanflags) should be impossible unless emulating ksh */ + if (!v->scanflags && EMULATION(EMULATE_KSH)) { s = dupstring("[0]"); if (getindex(&s, v, 0) == 0) s = getstrvalue(v); @@ -2340,7 +2339,7 @@ getstrvalue(Value v) } /* else fall through */ case PM_ARRAY: ss = getvaluearr(v); - if (v->isarr) + if (v->scanflags) s = sepjoin(ss, NULL, 1); else { if (v->start < 0) @@ -2367,7 +2366,7 @@ getstrvalue(Value v) break; } - if (v->flags & VALFLAG_SUBST) { + if (v->valflags & VALFLAG_SUBST) { if (v->pm->node.flags & (PM_LEFT|PM_RIGHT_B|PM_RIGHT_Z)) { size_t fwidth = v->pm->width ? (unsigned int)v->pm->width : MB_METASTRLEN(s); switch (v->pm->node.flags & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) { @@ -2534,7 +2533,7 @@ getarrvalue(Value v) return arrdup(nular); else if (IS_UNSET_VALUE(v)) return arrdup(&nular[1]); - if (v->flags & VALFLAG_INV) { + if (v->valflags & VALFLAG_INV) { char buf[DIGBUFSIZE]; s = arrdup(nular); @@ -2583,9 +2582,9 @@ getintvalue(Value v) { if (!v) return 0; - if (v->flags & VALFLAG_INV) + if (v->valflags & VALFLAG_INV) return v->start; - if (v->isarr) { + if (v->scanflags) { char **arr = getarrvalue(v); if (arr) { char *scal = sepjoin(arr, NULL, 1); @@ -2610,9 +2609,9 @@ getnumvalue(Value v) if (!v) { mn.u.l = 0; - } else if (v->flags & VALFLAG_INV) { + } else if (v->valflags & VALFLAG_INV) { mn.u.l = v->start; - } else if (v->isarr) { + } else if (v->scanflags) { char **arr = getarrvalue(v); if (arr) { char *scal = sepjoin(arr, NULL, 1); @@ -2639,10 +2638,13 @@ export_param(Param pm) #if 0 /* Requires changes elsewhere in params.c and builtin.c */ if (EMULATION(EMULATE_KSH) /* isset(KSHARRAYS) */) { struct value v; - v.isarr = 1; - v.flags = 0; + v.pm = NULL; + v.scanflags = (PM_TYPE(v.pm->node.flags) & PM_HASHED) ? + SCANPM_WANTVALS : SCANPM_ARRONLY; + v.valflags = 0; v.start = 0; v.end = -1; + v.arr = NULL; val = getstrvalue(&v); } else #endif @@ -2682,12 +2684,12 @@ assignstrvalue(Value v, char *val, int flags) return; } if ((v->pm->node.flags & PM_HASHED) && - (v->isarr & (SCANPM_MATCHMANY|SCANPM_ARRONLY))) { + (v->scanflags & (SCANPM_MATCHMANY|SCANPM_ARRONLY))) { zerr("%s: attempt to set slice of associative array", v->pm->node.nam); zsfree(val); return; } - if (v->flags & VALFLAG_EMPTY) { + if (v->valflags & VALFLAG_EMPTY) { zerr("%s: assignment to invalid subscript range", v->pm->node.nam); zsfree(val); return; @@ -2707,7 +2709,7 @@ assignstrvalue(Value v, char *val, int flags) z = v->pm->gsu.s->getfn(v->pm); zlen = strlen(z); - if ((v->flags & VALFLAG_INV) && unset(KSHARRAYS)) + if ((v->valflags & VALFLAG_INV) && unset(KSHARRAYS)) v->start--, v->end--; if (v->start < 0) { v->start += zlen; @@ -2897,7 +2899,7 @@ setarrvalue(Value v, char **val) v->pm->node.nam); return; } - if (v->flags & VALFLAG_EMPTY) { + if (v->valflags & VALFLAG_EMPTY) { zerr("%s: assignment to invalid subscript range", v->pm->node.nam); freearray(val); return; @@ -2926,7 +2928,7 @@ setarrvalue(Value v, char **val) q = old; - if ((v->flags & VALFLAG_INV) && unset(KSHARRAYS)) { + if ((v->valflags & VALFLAG_INV) && unset(KSHARRAYS)) { if (v->start > 0) v->start--; v->end--; @@ -3224,7 +3226,7 @@ assignsparam(char *s, char *val, int flags) createparam(t, PM_SCALAR); created = 1; } else if ((((v->pm->node.flags & PM_ARRAY) && - !(v->flags & VALFLAG_REFSLICE) && + !(v->valflags & VALFLAG_REFSLICE) && !(flags & ASSPM_AUGMENT)) || (v->pm->node.flags & PM_HASHED)) && !(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) && @@ -3314,7 +3316,7 @@ assignsparam(char *s, char *val, int flags) kshappend: /* treat slice as the end element */ v->start = sstart = v->end > 0 ? v->end - 1 : v->end; - v->isarr = 0; + v->scanflags = 0; var = getstrvalue(v); v->start = sstart; copy = val; @@ -3385,7 +3387,7 @@ assignaparam(char *s, char **val, int flags) createparam(t, PM_ARRAY); created = 1; } else if (!(PM_TYPE(v->pm->node.flags) & (PM_ARRAY|PM_HASHED)) && - !(v->flags & VALFLAG_REFSLICE) && + !(v->valflags & VALFLAG_REFSLICE) && !(v->pm->node.flags & (PM_SPECIAL|PM_TIED))) { int uniq = v->pm->node.flags & PM_UNIQUE; if ((flags & ASSPM_AUGMENT) && !(v->pm->node.flags & PM_UNSET)) { @@ -3613,7 +3615,7 @@ sethparam(char *s, char **val) createparam(t, PM_HASHED); checkcreate = 1; } else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) && - !(v->flags & VALFLAG_REFSLICE)) { + !(v->valflags & VALFLAG_REFSLICE)) { if (!(v->pm->node.flags & PM_SPECIAL)) { if (resetparam(v->pm, PM_HASHED)) { unqueue_signals(); |
