From 273d669a568ed9ee705916e42945f4239501cdcb Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 12 Dec 2019 10:22:24 +0000 Subject: 45001: Fix zero-length matches with ${...%...} As the shortest match is preferred, zero-length matches beat any other. --- ChangeLog | 6 ++++++ Src/glob.c | 6 ++++++ Test/D04parameter.ztst | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/ChangeLog b/ChangeLog index 434318f27..dcffc5bd5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-12-12 Peter Stephenson + + * 45001: Src/glob.c, Test/D04parameter.ztst: ${...%...} didn't + test for zero-length matches, which should be preferred where + possible. + 2019-12-11 Martijn Dekker * 45004: Src/builtin.c, Src/compat.c, Src/exec.c, Src/glob.c, diff --git a/Src/glob.c b/Src/glob.c index a367b082b..ca5846704 100644 --- a/Src/glob.c +++ b/Src/glob.c @@ -2909,6 +2909,12 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr, */ mb_charinit(); tmatch = NULL; + set_pat_start(p, l); + if (pattrylen(p, send, 0, 0, &patstralloc, umltot) && + !--n) { + *sp = get_match_ret(&imd, umltot, umltot); + return 1; + } for (ioff = 0, t = s, umlen = umltot; t < send; ioff++) { set_pat_start(p, t-s); if (pattrylen(p, t, umlen, 0, &patstralloc, ioff)) diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index b6e85a9fe..c91af1a9c 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -2534,3 +2534,26 @@ F:behavior, see http://austingroupbugs.net/view.php?id=888 0:Global variables are not trashed by "foo=bar builtin" (regression test) >function-value >global-value + + foo=pws + print ${foo%*} +0:Smallest match at end can match zero-length string +>pws + + foo=pws + print ${foo%?} +0:Smallest match at end with a character always matches one +>pw + + setopt extendedglob + foo=pws + print ${foo%s#} + print ${foo%%s#} +0:Smallest / largest match with non-trivial closure +>pws +>pw + + foo=pws + print ${foo%%*} +0:Largest match at end matches entire string +> -- cgit 1.4.1