From 66152e8adad7b00935c0b5fbe0cf0a7df3c639c7 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Wed, 15 Dec 2010 04:05:50 +0000 Subject: 28530: replace (z+opts+) flag with (Z:opts:), add reserved (_:flags:). --- ChangeLog | 7 ++++++- Doc/Zsh/expn.yo | 31 +++++++++++++++++++------------ Src/subst.c | 42 ++++++++++++++++++++++++++++++++++-------- Test/D04parameter.ztst | 8 ++++---- 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 68a9aea0e..1d7a8104e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2010-12-14 Barton E. Schaefer + + * 28530: Doc/Zsh/expn.yo, Src/subst.c, Test/D04parameter.ztst: + replace (z+opts+) flag with (Z:opts:), add reserved (_:flags:). + 2010-12-14 Peter Stephenson * unposted: Src/lex.c: another neatening of lexflags use for @@ -13958,5 +13963,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5151 $ +* $Revision: 1.5152 $ ***************************************************** diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo index cf8aee65f..1814d6c49 100644 --- a/Doc/Zsh/expn.yo +++ b/Doc/Zsh/expn.yo @@ -1009,18 +1009,6 @@ find the words, i.e. taking into account any quoting in the value. 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 @@ produces two lines of output for tt(one) and tt(three) and elides the 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 character 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 diff --git a/Src/subst.c b/Src/subst.c index 7ad4aecdf..24d515d06 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -1936,10 +1936,15 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) 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 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) 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 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) 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"); diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index 74c73b360..8ce68c317 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -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 -- cgit 1.4.1