summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/expn.yo14
-rw-r--r--Src/subst.c11
3 files changed, 29 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 4d5b91205..5907112fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-02-25 Barton E. Schaefer <schaefer@zsh.org>
+
+ * 40640 (plus doc typo fixed): Doc/Zsh/expn.yo, Src/subst.c: the
+ (A) parameter flag forces array result even if assignment syntax
+ is not used
+
2017-02-25 Daniel Shahaf <d.s@daniel.shahaf.name>
* unposted: Completion/Zsh/Context/_brace_parameter: Port 40617
diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo
index 43ecd3155..016d8aef0 100644
--- a/Doc/Zsh/expn.yo
+++ b/Doc/Zsh/expn.yo
@@ -955,15 +955,25 @@ This is distinct from em(field splitting) by the tt(f), tt(s)
or tt(z) flags, which still applies within each array element.
)
item(tt(A))(
-Assign as an array parameter with `tt(${)...tt(=)...tt(})',
+Convert the substitution into an array expression, even if it otherwise
+would be scalar. This has lower precedence than subscripting, so one
+level of nested expansion is required in order that subscripts apply
+to array elements. Thus tt(${${LPAR()A)tt(RPAR())var(name)tt(}[1]})
+yields the full value of var(name) when var(name) is scalar.
+
+This assigns an array parameter with `tt(${)...tt(=)...tt(})',
`tt(${)...tt(:=)...tt(})' or `tt(${)...tt(::=)...tt(})'.
-If this flag is repeated (as in `tt(AA)'), assign an associative
+If this flag is repeated (as in `tt(AA)'), assigns an associative
array parameter. Assignment is made before sorting or padding;
if field splitting is active, the var(word) part is split before
assignment. The var(name) part may be a subscripted range for
ordinary arrays; when assigning an associative array, the var(word)
part em(must) be converted to an array, for example by using
`tt(${(AA)=)var(name)tt(=)...tt(})' to activate field splitting.
+
+Surrounding context such as additional nesting or use of the value
+in a scalar assignment may cause the array to be joined back into
+a single string again.
)
item(tt(a))(
Sort in array index order; when combined with `tt(O)' sort in reverse
diff --git a/Src/subst.c b/Src/subst.c
index 4df53bdb7..02dbe2864 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -2902,6 +2902,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
} else
setaparam(idbeg, a);
isarr = 1;
+ arrasg = 0;
} else {
untokenize(val);
setsparam(idbeg, ztrdup(val));
@@ -3784,6 +3785,16 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
insertlinknode(l, n, dupstring(fstr)); /* appended, no incnode */
*fstr = '\0';
}
+ if (arrasg && !isarr) {
+ /*
+ * Caller requested this be forced to an array even if scalar.
+ * Any point in distinguishing arrasg == 2 (assoc array) here?
+ */
+ l->list.flags |= LF_ARRAY;
+ aval = hmkarray(val);
+ isarr = 1;
+ DPUTS(!val, "value is NULL in paramsubst, empty array");
+ }
if (isarr) {
char *x;
char *y;