From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3428 invoked by alias); 14 Dec 2010 16:57:41 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 28530 Received: (qmail 5011 invoked from network); 14 Dec 2010 16:57:37 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received-SPF: none (ns1.primenet.com.au: domain at closedmail.com does not designate permitted sender hosts) From: Bart Schaefer Message-id: <101214085720.ZM19259@torch.brasslantern.com> Date: Tue, 14 Dec 2010 08:57:18 -0800 In-reply-to: <20101213181203.5a5ba7d5@pwslap01u.europe.root.pri> Comments: In reply to Peter Stephenson "Re: Another ${(z)param} buglet" (Dec 13, 6:12pm) References: <101207203441.ZM4340@torch.brasslantern.com> <20101208175103.40d6cc29@pwslap01u.europe.root.pri> <101209074233.ZM8003@torch.brasslantern.com> <20101209181632.27d47e95@pwslap01u.europe.root.pri> <20101209201913.43a94f54@pws-pc.ntlworld.com> <20101212224523.423399db@pws-pc.ntlworld.com> <101212172652.ZM9617@torch.brasslantern.com> <20101213094746.35712a38@pwslap01u.europe.root.pri> <101213093514.ZM10971@torch.brasslantern.com> <20101213181203.5a5ba7d5@pwslap01u.europe.root.pri> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: Subject: Re: Another ${(z)param} buglet MIME-version: 1.0 Content-type: text/plain; charset=us-ascii On Dec 13, 6:12pm, Peter Stephenson wrote: } Subject: Re: Another ${(z)param} buglet } } On Mon, 13 Dec 2010 09:35:12 -0800 } Bart Schaefer wrote: } > Let's go ahead and use up Z for this so as not to tangle up z with a } > new more restricted delimiter syntax. Further let's immediately } > reserve a character (maybe "+") to have no meaning of its own, but } > instead to always introduce a delimited string into which we can put } > new options. } } Can't see why that shouldn't work. Here's a patch (using underscore rather than plus for the reserved meta-flag). Index: Doc/Zsh/expn.yo --- zsh-forge/current/Doc/Zsh/expn.yo 2010-12-14 08:13:59.000000000 -0800 +++ Doc/Zsh/expn.yo 2010-12-14 08:54:56.000000000 -0800 @@ -1009,18 +1009,6 @@ Comments are not treated specially but as ordinary strings, similar to interactive shells with the tt(INTERACTIVE_COMMENTS) option unset. -The flag can take a combination of option letters between a following -pair of `tt(PLUS())' characters. tt(LPAR()z+PLUS()c+PLUS()RPAR()) -causes comments to be parsed as a string and retained; any field in the -resulting array beginning with an unquoted comment character is a -comment. tt(LPAR()z+PLUS()C+PLUS()RPAR()) causes comments to be parsed -and removed. The rule for comments is standard: anything between a word -starting with the third charcter of tt($HISTCHARS), default tt(#), up to -the next newline is a comment. tt(LPAR()z+PLUS()n+PLUS()RPAR()) causes -unquoted newlines to be treated as ordinary whitespace, else they are -treated as if they are shell code delimiters and converted to -semicolons. - Note that this is done very late, as for the `tt((s))' flag. So to access single words in the result, one has to use nested expansions as in `tt(${${(z)foo}[2]})'. Likewise, to remove the quotes in the @@ -1129,6 +1117,25 @@ empty field. To override this behaviour, supply the "(@)" flag as well, i.e. tt("${(@s.:.)line}"). ) +item(tt(Z:)var(opts)tt(:))( +As tt(z) but takes a combination of option letters between a following +pair of delimiter characters. tt(LPAR()Z+PLUS()c+PLUS()RPAR()) +causes comments to be parsed as a string and retained; any field in the +resulting array beginning with an unquoted comment character is a +comment. tt(LPAR()Z+PLUS()C+PLUS()RPAR()) causes comments to be parsed +and removed. The rule for comments is standard: anything between a word +starting with the third charcter of tt($HISTCHARS), default tt(#), up to +the next newline is a comment. tt(LPAR()Z+PLUS()n+PLUS()RPAR()) causes +unquoted newlines to be treated as ordinary whitespace, else they are +treated as if they are shell code delimiters and converted to +semicolons. +) +item(tt(_:)var(flags)tt(:))( +The underscore (tt(_)) flag is reserved for future use. As of this +revision of zsh, there are no valid var(flags); anything following an +underscore, other than an empty pair of delimiters, is treated as an +error, and the flag itself has no effect. +) enditem() The following flags are meaningful with the tt(${)...tt(#)...tt(}) or Index: Src/subst.c --- zsh-forge/current/Src/subst.c 2010-12-14 08:13:59.000000000 -0800 +++ Src/subst.c 2010-12-14 08:28:56.000000000 -0800 @@ -1936,10 +1936,15 @@ case 'z': shsplit = LEXFLAGS_ACTIVE; - if (s[1] == '+') { - s += 2; - while (*s && *s != '+' && *s != ')' && *s != Outpar) { - switch (*s++) { + break; + + case 'Z': + t = get_strarg(++s, &arglen); + if (*t) { + sav = *t; + *t = 0; + while (*++s) { + switch (*s) { case 'c': /* Parse and keep comments */ shsplit |= LEXFLAGS_COMMENTS_KEEP; @@ -1956,12 +1961,14 @@ break; default: - goto flagerr; + *t = sav; + goto flagerr; } } - if (*s != '+') - goto flagerr; - } + *t = sav; + s = t + arglen - 1; + } else + goto flagerr; break; case 'u': @@ -1973,6 +1980,25 @@ evalchar = 1; break; + case '_': + t = get_strarg(++s, &arglen); + if (*t) { + sav = *t; + *t = 0; + while (*++s) { + /* Reserved for future use */ + switch (*s) { + default: + *t = sav; + goto flagerr; + } + } + *t = sav; + s = t + arglen - 1; + } else + goto flagerr; + break; + default: flagerr: zerr("error in flags"); Index: Test/D04parameter.ztst --- zsh-forge/current/Test/D04parameter.ztst 2010-12-14 08:14:00.000000000 -0800 +++ Test/D04parameter.ztst 2010-12-14 08:29:28.000000000 -0800 @@ -421,9 +421,9 @@ print "*** Normal ***" print -l ${(z)line} print "*** Kept ***" - print -l ${(z+c+)line} + print -l ${(Z+c+)line} print "*** Removed ***" - print -l ${(z+C+)line} + print -l ${(Z+C+)line} 0:Comments with (z) >*** Normal *** >A @@ -457,13 +457,13 @@ >one line='with comment # at the end' - print -l ${(z+C+)line} + print -l ${(Z+C+)line} 0:Test we don't get an additional newline token >with >comment line=$'echo one\necho two # with a comment\necho three' - print -l ${(z+nc+)line} + print -l ${(Z+nc+)line} 0:Treating zplit newlines as ordinary whitespace >echo >one --