diff options
author | Peter Stephenson <p.stephenson@samsung.com> | 2019-12-12 10:22:24 +0000 |
---|---|---|
committer | Peter Stephenson <p.stephenson@samsung.com> | 2019-12-12 10:23:47 +0000 |
commit | 273d669a568ed9ee705916e42945f4239501cdcb (patch) | |
tree | 7c7a1ac21687dea39d17327ee3d99cddd26fb5c6 | |
parent | c578f0a08b9257f3db85dab5431270f1a6eb8858 (diff) | |
download | zsh-273d669a568ed9ee705916e42945f4239501cdcb.tar.gz zsh-273d669a568ed9ee705916e42945f4239501cdcb.tar.xz zsh-273d669a568ed9ee705916e42945f4239501cdcb.zip |
45001: Fix zero-length matches with ${...%...}
As the shortest match is preferred, zero-length matches beat any other.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/glob.c | 6 | ||||
-rw-r--r-- | Test/D04parameter.ztst | 23 |
3 files changed, 35 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 434318f27..dcffc5bd5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-12-12 Peter Stephenson <p.stephenson@samsung.com> + + * 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 <martijn@inlv.org> * 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 +> |