diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Src/subst.c | 17 | ||||
-rw-r--r-- | Test/D04parameter.ztst | 4 |
3 files changed, 26 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index f11641046..98ad613de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-09-12 Peter Stephenson <pws@csr.com> + + * 22689: Src/subst.c, Test/D04parameter.ztst: untokenize + strings for substitution in cases like + ${${~:-*}//(#m)*/$MATCH=$MATCH}. The pattern code tried + to metafy the tokens, which caused chaos. + 2006-09-11 Peter Stephenson <p.w.stephenson@ntlworld.com> * unposted: Mikael Magnusson: Doc/Zsh/mod_sched.yo: typos. diff --git a/Src/subst.c b/Src/subst.c index 1e8907d5c..3a2c3e111 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2257,15 +2257,28 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) /* * Either loop over an array doing replacements or * do the replacment on a string. + * + * We need an untokenized value for matching. */ if (!vunset && isarr) { + char **ap; + if (!copied) { + aval = arrdup(aval); + copied = 1; + } + for (ap = aval; *ap; ap++) { + untokenize(*ap); + } getmatcharr(&aval, s, flags, flnum, replstr); - copied = 1; } else { if (vunset) val = dupstring(""); + if (!copied) { + val = dupstring(val); + copied = 1; + untokenize(val); + } getmatch(&val, s, flags, flnum, replstr); - copied = 1; } break; } diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index 5d48328ed..7c0b28878 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -829,6 +829,10 @@ 0:(#m) flag with pure string >this 4 4 is 7 7 a s 11 11tring + print ${${~:-*}//(#m)*/$MATCH=$MATCH} +0:(#m) flag with tokenized input +>*=* + print -l JAMES${(u)${=:-$(echo yes yes)}}JOYCE print -l JAMES${(u)${=:-$(echo yes yes she said yes i will yes)}}JOYCE 0:Bug with (u) flag reducing arrays to one element |