diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 1999-05-12 04:49:46 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 1999-05-12 04:49:46 +0000 |
commit | ea0ddb0fc6073be3d7d289e59b083f564dbd761f (patch) | |
tree | d1e3f1be8624d47e7e8a75838f9e84885a17a484 /Src/subst.c | |
parent | 53d36e795b26a945048e7a87a1a91224f8e1663a (diff) | |
download | zsh-ea0ddb0fc6073be3d7d289e59b083f564dbd761f.tar.gz zsh-ea0ddb0fc6073be3d7d289e59b083f564dbd761f.tar.xz zsh-ea0ddb0fc6073be3d7d289e59b083f564dbd761f.zip |
pws-18 dot-zsh-199905171944
Diffstat (limited to 'Src/subst.c')
-rw-r--r-- | Src/subst.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/Src/subst.c b/Src/subst.c index e8e22f943..4b60de120 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -245,35 +245,43 @@ singsub(char **s) * the result is stored in *a. If `a' is zero a multiple word result is * * joined using sep or the IFS parameter if sep is zero and the result * * is returned in *s. The return value is true iff the expansion * - * resulted in an empty list */ + * resulted in an empty list. * + * The mult_isarr variable is used by paramsubst() to tell if it yields * + * an array. */ + +static int mult_isarr; /**/ static int multsub(char **s, char ***a, int *isarr, char *sep) { LinkList foo; - int l; + int l, omi = mult_isarr; char **r, **p; + mult_isarr = 0; foo = newlinklist(); addlinknode(foo, *s); prefork(foo, 0); if (errflag) { if (isarr) *isarr = 0; + mult_isarr = omi; return 0; } - if ((l = countlinknodes(foo)) > 1 || a) { + if ((l = countlinknodes(foo))) { p = r = ncalloc((l + 1) * sizeof(char*)); while (nonempty(foo)) *p++ = (char *)ugetnode(foo); *p = NULL; - if (a) { + if (a && mult_isarr) { *a = r; *isarr = 1; + mult_isarr = omi; return 0; } *s = sepjoin(r, NULL); + mult_isarr = omi; return 0; } if (l) @@ -282,6 +290,7 @@ multsub(char **s, char ***a, int *isarr, char *sep) *s = dupstring(""); if (isarr) *isarr = 0; + mult_isarr = omi; return !l; } @@ -977,16 +986,12 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) skipparens(*s, *s == Inpar ? Outpar : Outbrace, &s); sav = *s; *s = 0; - if (multsub(&val, ((!aspar && (!quoted || nojoin)) ? &aval : NULL), - &isarr, NULL) && - quoted) { + if (multsub(&val, (aspar ? NULL : &aval), &isarr, NULL) && quoted) { isarr = -1; aval = alloc(sizeof(char *)); aspar = 0; } else if (aspar) idbeg = val; - if (isarr) - isarr = -1; copied = 1; *s = sav; v = (Value) NULL; @@ -1465,6 +1470,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) val = dupstring(buf); isarr = 0; } + mult_isarr = isarr; if (isarr > 0 && !plan9 && (!aval || !aval[0])) { val = dupstring(""); isarr = 0; @@ -1485,6 +1491,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) val = aval[0]; else isarr = 2; + mult_isarr = isarr; } } if (casmod) { |