From e86720190efc6550086e6a733394cb393cd0da4d Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 15 May 2015 09:35:24 +0100 Subject: 35131: allow "[]" to match empty character set. This only works if there's no further "]" in the pattern, since if there is the first "]" has to match a literal character. --- ChangeLog | 6 ++++++ Src/pattern.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 8791e5dcf..e23f314ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-05-15 Peter Stephenson + + * 35131: Src/pattern.c: "[]" in a pattern is treated as an empty + character set (matching nothing) if there are no more active "]" + is in the pattern. + 2015-05-14 Oliver Kiddle * 35139: Completion/Zsh/Context/_brace_parameter: add (b) flag diff --git a/Src/pattern.c b/Src/pattern.c index 05dcb2943..4e5e8a110 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -1405,7 +1405,16 @@ patcomppiece(int *flagp, int paren) starter = patnode(P_ANYBUT); } else starter = patnode(P_ANYOF); - if (*patparse == Outbrack) { + /* + * []...] means match a "]" or other included characters. + * However, to be a bit helpful and for compatibility + * with other shells, don't take in that sense if + * there's no further "]". That's still imperfect, + * but it's all we can do --- we're required to + * treat [$var]*[$var]with empty var as [ ... ] + * containing "]*[". + */ + if (*patparse == Outbrack && strchr(patparse+1, Outbrack)) { patparse++; patadd(NULL, ']', 1, PA_NOALIGN); } -- cgit v1.2.3-70-g09d2