From a9add3de545d71be3d882f94714e4d2857b0ef15 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Mon, 6 Jul 2015 12:02:36 -0700 Subject: [PATCH] 35694: fix handling of history modifiers applied across all elements of an array parameter value --- ChangeLog | 10 ++++++++++ Src/subst.c | 10 ++++++++-- Test/D04parameter.ztst | 9 +++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7eb45224..27335d8f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2015-07-06 Barton E. Schaefer + + * unposted: Doc/Zsh/expn.yo: alphabetize ${(b)...} flag + + * 35709: Doc/Zsh/expn.yo: explain :s/// modifier contexts + + * 35694: Src/subst.c, Test/D04parameter.ztst: fix handling of + history modifiers (specifically :s/l/r/) when applied across all + elements of an array parameter value + 2015-07-06 Oliver Kiddle * 35704: Doc/Zsh/compwid.yo, Src/Zle/compcore.c, Src/Zle/complete.c; diff --git a/Src/subst.c b/Src/subst.c index 81d34d28a..021d23444 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -3834,8 +3834,14 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags) y = dupstring(nulstring); insertlinknode(l, n, (void *) y), incnode(n); } - if (eval) - n = on; + /* This used to omit restoring of *str and instead test + * if (eval) + * n = on; + * but that causes strange behavior of history modifiers when + * applied across all values of an array. What is magic about + * eval here that *str seemed not to need restoring? + */ + *str = getdata(n = on); } else { /* * Scalar value. Handle last minute transformations diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index d06a73afd..0a9e2530c 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -1711,3 +1711,12 @@ 0:Avoid confusion after overloaded characters in braceless substitution in sh >13 >0-1 + + a="aaa bab cac" + b=d + echo $a:gs/a/${b}/ + a=(aaa bab cac) + echo $a:gs/a/${b}/ +0:History modifier works the same for scalar and array substitution +>ddd bdb cdc +>ddd bdb cdc