From 22af58bf2b5b695cdbfaf4b7cdf82bb09136860b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 3 Jun 2011 22:03:43 +0000 Subject: 29451: ${##stuff} removes stuff from the head of $# --- ChangeLog | 5 ++++- Src/subst.c | 11 ++++++++++- Test/D04parameter.ztst | 10 +++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3377ae3ba..5a727fd4e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,9 @@ 2011-06-03 Peter Stephenson + * 29451: Src/subst.c, Test/D04parameter.ztst: ${##stuff} + removes stuff from the head of $#. + * 29413: Doc/Zsh/builtins.yo, Src/builtin.c, Src/hist.c: print -S takes a single argument, applies lexical history word splitting, and puts it on the history. @@ -14942,5 +14945,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5359 $ +* $Revision: 1.5360 $ ***************************************************** diff --git a/Src/subst.c b/Src/subst.c index f9c48404b..314489e49 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2080,7 +2080,16 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub) || (cc = s[1]) == '*' || cc == Star || cc == '@' || cc == '?' || cc == Quest || cc == '$' || cc == String || cc == Qstring - || cc == '#' || cc == Pound + /* + * Me And My Squiggle: + * ${##} is the length of $#, but ${##foo} + * is $# with a "foo" removed from the start. + * If someone had defined the *@!@! language + * properly in the first place we wouldn't + * have this nonsense. + */ + || ((cc == '#' || cc == Pound) && + s[2] == Outbrace) || cc == '-' || (cc == ':' && s[2] == '-') || (isstring(cc) && (s[2] == Inbrace || s[2] == Inpar)))) { getlen = 1 + whichlen, s++; diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index 378505e12..8f95420dd 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -179,9 +179,17 @@ print ${##} set 1 2 3 4 5 6 7 8 9 10 print ${##} -0:${##} is length of $# + print ${##""} + print ${##1} + print ${##2} + print ${###<->} # oh, for pete's sake... +0:${##} is length of $#, and other tales of hash horror >1 >2 +>10 +>0 +>10 +> array=(once bitten twice shy) print IF${array}THEN -- cgit 1.4.1