From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from primenet.com.au (ns1.primenet.com.au [203.24.36.2]) by inbox.vuxu.org (OpenSMTPD) with ESMTP id 214c6a86 for ; Tue, 10 Dec 2019 10:49:10 +0000 (UTC) Received: (qmail 358 invoked by alias); 10 Dec 2019 10:49:05 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 45001 Received: (qmail 11831 invoked by uid 1010); 10 Dec 2019 10:49:05 -0000 X-Qmail-Scanner-Diagnostics: from mailout1.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.102.1/25656. spamassassin: 3.4.2. Clear:RC:0(210.118.77.11):SA:0(-7.0/5.0):. Processed in 3.31369 secs); 10 Dec 2019 10:49:05 -0000 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _spf.samsung.com designates 210.118.77.11 as permitted sender) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20191210104826euoutp015a8cdc12588623192c4f93326cbcf044~e-NPBiXOp0384103841euoutp01U X-AuditID: cbfec7f4-0cbff7000001ed07-97-5def77f930d6 Message-ID: <1575974904.4447.1.camel@samsung.com> Subject: Re: BUG: small posix glitch in ${x%*} From: Peter Stephenson To: Date: Tue, 10 Dec 2019 10:48:24 +0000 In-Reply-To: X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djP87o/y9/HGjzaZWpxsPkhkwOjx6qD H5gCGKO4bFJSczLLUov07RK4MlZ/u8lesJqv4s49lwbGm9xdjJwcEgImEkuWT2fsYuTiEBJY wShxZ+F0Jginj0ni/YItrBBOL5PElQMTgRwOsJZ3T6sg4ssZJb4u6GcFGQVW9OoxO0TiDKPE 71n72SCcC4wSPe+ms4FU8QoYSnS/3scEYgsL6Elcef4TLM4GFJ+6aTYjiC0iIClxrfk0I8g2 FgFVia1fLUDCnAKBEjtOTWWDuFtDYsPNY0wQIwUlTs58wgJiMwvISzRvnc0MUXOfTeLmtxII 20WiYeYBqF5hiVfHt7BD2DIS/3fOB3tZQqCdUWLNpNfsEE4Po8Smo3cYIaqsJfpuXwQ7iFlA U2L9Ln2IsKPE3DlbGCGhwidx460gxA18EpO2TWeGCPNKdLQJQVSrSexo2gpVLSPxdI3CBEal WUgemIXkgVkIqxYwMq9iFE8tLc5NTy02ykst1ytOzC0uzUvXS87P3cQITAKn/x3/soNx15+k Q4wCHIxKPLwLHN7FCrEmlhVX5h5ilOBgVhLhPd4GFOJNSaysSi3Kjy8qzUktPsQozcGiJM5r vOhlrJBAemJJanZqakFqEUyWiYNTqoGxx9RGJuh5icp5rfbojd5pFad3sy9zv3/92SOdvLft iiXPJrwsbXPbedjhWVzQ8xduW8OlRczdNjYlT89J3q17Lvh3QmvpJ95am1m7NL+/nl27qWfz v8vT0gQidnFIrj9kYL6crUB2iWLIE/bFn1+Uz5lqHPk/tebMhUnWlb+n17z7FHZVKOmCEktx RqKhFnNRcSIAfbWG8v4CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsVy+t/xe7o/y9/HGqxrVrI42PyQyYHRY9XB D0wBjFF6NkX5pSWpChn5xSW2StGGFkZ6hpYWekYmlnqGxuaxVkamSvp2NimpOZllqUX6dgl6 Gau/3WQvWM1XceeeSwPjTe4uRg4OCQETiXdPq7oYOTmEBJYyStw5wQViSwjISHy68pEdwhaW +HOti62LkQuopptJ4uTPa1DOGUaJP9NOsUA4Fxgl1p5YwArSwitgKNH9eh8TiC0soCdx5flP NhCbDSg+ddNsRhBbREBS4lrzaUaQK1gEVCW2frUACXMKBErsODWVDe6iq++EQGxmAU2J1u2/ oS7SkNhw8xgTxCpBiZMzn7BA1MhLNG+dzTyBUWgWkpZZSMpmISlbwMi8ilEktbQ4Nz232Eiv ODG3uDQvXS85P3cTIzDstx37uWUHY9e74EOMAhyMSjy8CxzexQqxJpYVV+YeYpTgYFYS4T3e BhTiTUmsrEotyo8vKs1JLT7EaAr0z0RmKdHkfGBM5pXEG5oamltYGpobmxubWSiJ83YIHIwR EkhPLEnNTk0tSC2C6WPi4JRqYPSaXn9xkYrRvpBatTdSvYGlleKLF9sbrpsvca6E9arPyslF /V+y+oMD2vk3bxZbNSPXqeCtB+Ok8w+3qdvf5ZofNo1XIuOIbvSsUm3OpKp08dfFrxXKD2W8 Wtw9f4WJ+n/NxvntTg9lIx/Nk1+8c9PGSYtdzWXZPmx+zlD+Ttd/1ncRk5lZf5VYijMSDbWY i4oTATbwrJSRAgAA X-CMS-MailID: 20191210104825eucas1p2589ece1b8c9f0f2825a284da14fc64c6 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20191210014119eucas1p155aa663c9f726ba5ca07a37c54829bec X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20191210014119eucas1p155aa663c9f726ba5ca07a37c54829bec References: On Mon, 2019-12-09 at 22:07 +0000, Jan Grant wrote: > As I read the spec, the smallest suffix that can match * is the null > string; so >  >     x=123; echo ${x%*} >  > should output "123". Zsh (as of 5.7.1) drops the last character. >  > (The behaviour for prefixes is correct.) Yes, that's right --- there are already some age-old icky special cases for this in some places but not this one.  So a bit of copy and paste... pws diff --git a/Src/glob.c b/Src/glob.c index 92fd64e7c..674563c8f 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 +>