From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12392 invoked from network); 18 Nov 2008 10:00:18 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.5 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 18 Nov 2008 10:00:18 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 70831 invoked from network); 18 Nov 2008 10:00:08 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 18 Nov 2008 10:00:08 -0000 Received: (qmail 18829 invoked by alias); 18 Nov 2008 09:59:59 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 26061 Received: (qmail 18819 invoked from network); 18 Nov 2008 09:59:59 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 18 Nov 2008 09:59:59 -0000 Received: from cluster-d.mailcontrol.com (cluster-d.mailcontrol.com [217.69.20.190]) by bifrost.dotsrc.org (Postfix) with ESMTPS id 0032280524C4 for ; Tue, 18 Nov 2008 10:59:55 +0100 (CET) Received: from cameurexb01.EUROPE.ROOT.PRI ([193.128.72.68]) by rly16d.srv.mailcontrol.com (MailControl) with ESMTP id mAI9xsHV017149 for ; Tue, 18 Nov 2008 09:59:54 GMT Received: from news01.csr.com ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.3959); Tue, 18 Nov 2008 09:59:54 +0000 Received: from news01.csr.com (localhost.localdomain [127.0.0.1]) by news01.csr.com (8.14.2/8.13.4) with ESMTP id mAI9xsA0016043 for ; Tue, 18 Nov 2008 09:59:54 GMT Received: from csr.com (pws@localhost) by news01.csr.com (8.14.2/8.14.2/Submit) with ESMTP id mAI9xrL4016039 for ; Tue, 18 Nov 2008 09:59:54 GMT X-Authentication-Warning: news01.csr.com: pws owned process doing -bs To: zsh-workers@sunsite.dk (Zsh hackers list) Subject: PATCH: bad clash between process substitution and numeric glob X-Mailer: MH-E 8.0.3; nmh 1.3; GNU Emacs 22.1.1 Date: Tue, 18 Nov 2008 09:59:53 +0000 Message-ID: <16038.1227002393@csr.com> From: Peter Stephenson X-OriginalArrivalTime: 18 Nov 2008 09:59:54.0535 (UTC) FILETIME=[67E46B70:01C94964] X-Scanned-By: MailControl A_08_51_00 (www.mailcontrol.com) on 10.68.0.126 X-Virus-Scanned: ClamAV 0.92.1/8645/Tue Nov 18 05:30:32 2008 on bifrost X-Virus-Status: Clean % print <->(N) zsh: command not found: N <-/proc/self/fd/13 Luckily we need to know in advance where numeric globs are, so we can handle them differently from redirections. I've chosen to mark process substitutions specially since it seemed the smaller change. Index: Src/lex.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/lex.c,v retrieving revision 1.47 diff -u -r1.47 lex.c --- Src/lex.c 13 Nov 2008 21:18:14 -0000 1.47 +++ Src/lex.c 18 Nov 2008 09:53:19 -0000 @@ -33,7 +33,7 @@ /* tokens */ /**/ -mod_export char ztokens[] = "#$^*()$=|{}[]`<>?~`,'\"\\\\"; +mod_export char ztokens[] = "#$^*()$=|{}[]`<>>?~`,'\"\\\\"; /* parts of the current token */ @@ -1160,7 +1160,7 @@ lexstop = 0; goto brk; } - add(Outang); + add(OutangProc); if (skipcomm()) { peek = LEXERR; goto brk; Index: Src/parse.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/parse.c,v retrieving revision 1.76 diff -u -r1.76 parse.c --- Src/parse.c 29 Sep 2008 08:46:33 -0000 1.76 +++ Src/parse.c 18 Nov 2008 09:53:20 -0000 @@ -1574,7 +1574,7 @@ * we need process handling. */ if (p[1] == Inpar && - (*p == Equals || *p == Inang || *p == Outang)) { + (*p == Equals || *p == Inang || *p == OutangProc)) { *complex = 1; break; } @@ -1833,7 +1833,7 @@ } case REDIR_WRITE: case REDIR_WRITENOW: - if (tokstr[0] == Outang && tokstr[1] == Inpar) + if (tokstr[0] == OutangProc && tokstr[1] == Inpar) /* > >(...) */ type = REDIR_OUTPIPE; else if (tokstr[0] == Inang && tokstr[1] == Inpar) @@ -1843,11 +1843,12 @@ if (tokstr[0] == Inang && tokstr[1] == Inpar) /* < <(...) */ type = REDIR_INPIPE; - else if (tokstr[0] == Outang && tokstr[1] == Inpar) + else if (tokstr[0] == OutangProc && tokstr[1] == Inpar) YYERROR(ecused); break; case REDIR_READWRITE: - if ((tokstr[0] == Inang || tokstr[0] == Outang) && tokstr[1] == Inpar) + if ((tokstr[0] == Inang || tokstr[0] == OutangProc) && + tokstr[1] == Inpar) type = tokstr[0] == Inang ? REDIR_INPIPE : REDIR_OUTPIPE; break; } Index: Src/subst.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/subst.c,v retrieving revision 1.92 diff -u -r1.92 subst.c --- Src/subst.c 17 Nov 2008 16:11:30 -0000 1.92 +++ Src/subst.c 18 Nov 2008 09:53:20 -0000 @@ -152,12 +152,13 @@ char *str = str3, c; while (!errflag && (c = *str)) { - if (((c = *str) == Inang || c == Outang || (str == str3 && c == Equals)) + if (((c = *str) == Inang || c == OutangProc || + (str == str3 && c == Equals)) && str[1] == Inpar) { char *subst, *rest, *snew, *sptr; int str3len = str - str3, sublen, restlen; - if (c == Inang || c == Outang) + if (c == Inang || c == OutangProc) subst = getproc(str, &rest); /* <(...) or >(...) */ else subst = getoutputfile(str, &rest); /* =(...) */ Index: Src/zsh.h =================================================================== RCS file: /cvsroot/zsh/zsh/Src/zsh.h,v retrieving revision 1.150 diff -u -r1.150 zsh.h --- Src/zsh.h 30 Oct 2008 19:52:44 -0000 1.150 +++ Src/zsh.h 18 Nov 2008 09:53:20 -0000 @@ -147,28 +147,29 @@ #define Tick ((char) 0x91) #define Inang ((char) 0x92) #define Outang ((char) 0x93) -#define Quest ((char) 0x94) -#define Tilde ((char) 0x95) -#define Qtick ((char) 0x96) -#define Comma ((char) 0x97) +#define OutangProc ((char) 0x94) +#define Quest ((char) 0x95) +#define Tilde ((char) 0x96) +#define Qtick ((char) 0x97) +#define Comma ((char) 0x98) /* * Null arguments: placeholders for single and double quotes * and backslashes. */ -#define Snull ((char) 0x98) -#define Dnull ((char) 0x99) -#define Bnull ((char) 0x9a) +#define Snull ((char) 0x99) +#define Dnull ((char) 0x9a) +#define Bnull ((char) 0x9b) /* * Backslash which will be returned to "\" instead of being stripped * when we turn the string into a printable format. */ -#define Bnullkeep ((char) 0x9b) +#define Bnullkeep ((char) 0x9c) /* * Null argument that does not correspond to any character. * This should be last as it does not appear in ztokens and * is used to initialise the IMETA type in inittyptab(). */ -#define Nularg ((char) 0x9c) +#define Nularg ((char) 0x9d) /* * Take care to update the use of IMETA appropriately when adding Index: Test/D02glob.ztst =================================================================== RCS file: /cvsroot/zsh/zsh/Test/D02glob.ztst,v retrieving revision 1.14 diff -u -r1.14 D02glob.ztst --- Test/D02glob.ztst 30 Mar 2008 22:14:24 -0000 1.14 +++ Test/D02glob.ztst 18 Nov 2008 09:53:20 -0000 @@ -386,3 +386,9 @@ [[ foo = (#c0)foo ]] 1:Misplaced (#c...) flag ?(eval):1: bad pattern: (#c0)foo + + mkdir glob.tmp/dir5 + touch glob.tmp/dir5/N123 + print glob.tmp/dir5/N<->(N) +0:Numeric glob is not usurped by process substitution. +>glob.tmp/dir5/N123 -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070