zsh-workers
 help / color / mirror / code / Atom feed
* Re: ${${~:-*}//(#m)*/$MATCH=$MATCH} fails
       [not found] <dbfc82860609111536n545e6378i371458c3895c2997@mail.gmail.com>
@ 2006-09-12  9:34 ` Peter Stephenson
  2006-09-12 14:31   ` Nikolai Weibull
  0 siblings, 1 reply; 4+ messages in thread
From: Peter Stephenson @ 2006-09-12  9:34 UTC (permalink / raw)
  To: Zsh hackers list

"Nikolai Weibull" wrote:
> Try the above with an echo.  In zsh 4.3.2, this will give you an
> illegal UTF-8 character, an equal sign, and another illegal UTF-8
> character.  Is $MATCH accessing uninitialized memory?  Or am I doing
> something wrong?

Neither: the pattern matcher is being passed a tokenized string as the
test string for matching.  This doesn't make sense, particularly since
the pattern matcher assumes the string can be metafied, which is what is
messing up the characters.  The easy fix is just to untokenize all test
strings at that point (the pattern string needs tokens, of course).

This stops the "*" being active at that point, although it's eligible
for the effect of a ~ in the context further out.  What I mean is,

% foo="*
% print ${${~foo}/\*/*}
*
% print ${~foo/\*/*}
<list of files>

I don't think that's unreasonable.

Index: Src/subst.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/subst.c,v
retrieving revision 1.57
diff -u -r1.57 subst.c
--- Src/subst.c	10 Sep 2006 18:10:49 -0000	1.57
+++ Src/subst.c	12 Sep 2006 09:30:53 -0000
@@ -2257,15 +2257,28 @@
 	    /*
 	     * 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;
 	}
Index: Test/D04parameter.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/D04parameter.ztst,v
retrieving revision 1.19
diff -u -r1.19 D04parameter.ztst
--- Test/D04parameter.ztst	1 Aug 2006 17:16:43 -0000	1.19
+++ Test/D04parameter.ztst	12 Sep 2006 09:30:53 -0000
@@ -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

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


To access the latest news from CSR copy this link into a web browser:  http://www.csr.com/email_sig.php


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ${${~:-*}//(#m)*/$MATCH=$MATCH} fails
  2006-09-12  9:34 ` ${${~:-*}//(#m)*/$MATCH=$MATCH} fails Peter Stephenson
@ 2006-09-12 14:31   ` Nikolai Weibull
  2006-09-12 14:49     ` Peter Stephenson
  0 siblings, 1 reply; 4+ messages in thread
From: Nikolai Weibull @ 2006-09-12 14:31 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: Zsh hackers list

On 9/12/06, Peter Stephenson <pws@csr.com> wrote:
> "Nikolai Weibull" wrote:
> > Try the above with an echo.  In zsh 4.3.2, this will give you an
> > illegal UTF-8 character, an equal sign, and another illegal UTF-8
> > character.  Is $MATCH accessing uninitialized memory?  Or am I doing
> > something wrong?
>
> Neither: the pattern matcher is being passed a tokenized string as the
> test string for matching.  This doesn't make sense, particularly since
> the pattern matcher assumes the string can be metafied, which is what is
> messing up the characters.  The easy fix is just to untokenize all test
> strings at that point (the pattern string needs tokens, of course).
>
> This stops the "*" being active at that point, although it's eligible
> for the effect of a ~ in the context further out.  What I mean is,
>
> % foo="*
> % print ${${~foo}/\*/*}
> *
> % print ${~foo/\*/*}
> <list of files>

Hm.  My intent doesn't seem to have been clear.  What I want it to do
is print a list of files where each file is followed by an equal sign
and the file again.  This is for passing args to mkisofs with the
-graft-points option.

  nikolai


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ${${~:-*}//(#m)*/$MATCH=$MATCH} fails
  2006-09-12 14:31   ` Nikolai Weibull
@ 2006-09-12 14:49     ` Peter Stephenson
  2006-09-12 17:23       ` Nikolai Weibull
  0 siblings, 1 reply; 4+ messages in thread
From: Peter Stephenson @ 2006-09-12 14:49 UTC (permalink / raw)
  To: Zsh hackers list

"Nikolai Weibull" wrote:
> Hm.  My intent doesn't seem to have been clear.  What I want it to do
> is print a list of files where each file is followed by an equal sign
> and the file again.  This is for passing args to mkisofs with the
> -graft-points option.

You can't do that with parameter matching; it doesn't do globbing, which
is a completely separate, and later, phase of command line expansion.

Try

*(e:'REPLY=$REPLY=$REPLY':)

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


To access the latest news from CSR copy this link into a web browser:  http://www.csr.com/email_sig.php


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ${${~:-*}//(#m)*/$MATCH=$MATCH} fails
  2006-09-12 14:49     ` Peter Stephenson
@ 2006-09-12 17:23       ` Nikolai Weibull
  0 siblings, 0 replies; 4+ messages in thread
From: Nikolai Weibull @ 2006-09-12 17:23 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: Zsh hackers list

On 9/12/06, Peter Stephenson <pws@csr.com> wrote:
> "Nikolai Weibull" wrote:
> > Hm.  My intent doesn't seem to have been clear.  What I want it to do
> > is print a list of files where each file is followed by an equal sign
> > and the file again.  This is for passing args to mkisofs with the
> > -graft-points option.
>
> You can't do that with parameter matching; it doesn't do globbing, which
> is a completely separate, and later, phase of command line expansion.
>
> Try
>
> *(e:'REPLY=$REPLY=$REPLY':)

Ah, thanks.  I was thinking that somehow the globbing could be done
inside the expansion somehow.  This is simpler.

  nikolai


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-09-12 17:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <dbfc82860609111536n545e6378i371458c3895c2997@mail.gmail.com>
2006-09-12  9:34 ` ${${~:-*}//(#m)*/$MATCH=$MATCH} fails Peter Stephenson
2006-09-12 14:31   ` Nikolai Weibull
2006-09-12 14:49     ` Peter Stephenson
2006-09-12 17:23       ` Nikolai Weibull

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).