From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, PDS_TONAME_EQ_TOLOCAL_HDRS_LCASE,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 28890 invoked from network); 22 Oct 2021 19:52:09 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 22 Oct 2021 19:52:09 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1634932329; b=XkVgLv7Vc77Ims12aDJxNMor3iOtVr+zchpYBxnYbx5Rd/V9xVwPrfoiQYdUwzhf4fg2O2JGpo 7MpXq7EBFFD5NEJzM9+3BN5b+JGRAobiTIrrdW2smRdszMkzV/AD7OlyH3GYwaTk/vsnikZ1iJ gxdmOSEGwQA2tSAuz6IdQqkHDgWNfLUwn7wVMx5eNb0r8z5Xi370hiYaUD+SJNbbMgmu6MX/+U kFmCqcXo9kNDrTf6redq7Wz8FwG2h5wrs5MqfBjAo0jQRN54SfNhLNOohOOoroiu2KHaZyNIFc GT2Nfee0GZ+iIvw3t9JCXY38LZdyiR9OJIkQ/U0dx2wq8g==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (sonic311-31.consmr.mail.ir2.yahoo.com) smtp.remote-ip=77.238.176.163; dkim=pass header.d=yahoo.co.uk header.s=s2048 header.a=rsa-sha256; dmarc=pass header.from=yahoo.co.uk; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1634932329; bh=PB97I9quFH1TVUFGDNEM/UvQitM78pRz7v+lKDszamo=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Message-ID:Date:Content-ID:Content-Type:MIME-Version:Subject: To:References:From:In-Reply-To:Cc:DKIM-Signature:DKIM-Signature; b=R9QKZcRIevLz/nI0fSHageA9Zl249kKUSlguuVTLZZ032u2rFGpg+ZNIvp5gW3LdXad5u3dV+s SVOqiQeq3lY5L/hEaedde/LBbAnOsEysBLUTUTHfsiXVddNRvKop/kef2hcQlS3lNIbue45umY wa/RRrU0GHIQ6O81eHrIN/4C53vnx01U2cSFcqz64K9EBWCNXc8h39P0TQENPtsH6oS3XSOWEr O4vyxm3yp3SrA66TWJ7m+q7GuE+mpLJCNIYDnzfbRbZRyb0H6e81JTl4SK2I+WLqeMvJo23fxR 7Vnqi91E9lbIAP5yOIdVd345Dzi1bpo9EnZBDPLAMdzYDA==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Message-ID:Date:Content-ID: Content-Type:MIME-Version:Subject:To:References:From:In-reply-to:cc:Reply-To: Content-Transfer-Encoding:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=LPkmDvxQa35y6pvjYvOCUk+8Cq1ly2RJI2YbEGYJT04=; b=pFQkSRRKRbiiyDh8kSCO+cE0wD q0p+Fq1FfyBXIIpVehqs9hzpQOVgga9wtmHSYL39mgVZh/Oy1g64HYc36DTIpLuiUoM0IK+ZWnycR oiLW2SliuPep6JSpF3cW36rRN1SIK7tfRj+yHQKi6z0obKkaiBkD+9tvREW2Ed2npMh6et0sRD17o LJVoplZLL6lDh9Z6Fzsx6blH0E8QJM8IslT8Q+3Fir20JHP2jICR0HAHQWdw90qsvJG4kDlxJGj9x 7s1ZfONuLEPiu0eVvkEJM39JJydEGTNA0gEB2PQCYFh7jFF+1m/HLXAeL4V7949fo3/dj6EhMJ9UD eIRSo2EA==; Received: from authenticated user by zero.zsh.org with local id 1me0aF-000J9h-QQ; Fri, 22 Oct 2021 19:52:07 +0000 Authentication-Results: zsh.org; iprev=pass (sonic311-31.consmr.mail.ir2.yahoo.com) smtp.remote-ip=77.238.176.163; dkim=pass header.d=yahoo.co.uk header.s=s2048 header.a=rsa-sha256; dmarc=pass header.from=yahoo.co.uk; arc=none Received: from sonic311-31.consmr.mail.ir2.yahoo.com ([77.238.176.163]:43162) by zero.zsh.org with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) id 1me0Z8-000IpP-Kv; Fri, 22 Oct 2021 19:51:00 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.uk; s=s2048; t=1634932257; bh=LPkmDvxQa35y6pvjYvOCUk+8Cq1ly2RJI2YbEGYJT04=; h=cc:In-reply-to:From:References:To:Subject:Date:From:Subject:Reply-To; b=pU9uyiS1SdZSgKMAt7jcO8lnM8bvwH8RuTo/CaJegEBDQqI+ojK51KcbDcmwhZC5Gg/yEoCPHqaoY/r2im9u44FN5xdUikM2cpskoylDZ14a3nl1Rldm7SGuFrLOaMbz+a7cD5+ynr6dTE2Dtw52oilG96FDBFpj32squ5uBx2XzlfXH3qJEhrQ5lwowdtOqg6xyLPo3g21Rekmfau5SHWjOGv7kMtyCdq7UNfcLS7VTKLscFFNlGG0Qx8E1xD13mQrNjS2vA+ZJdNNYSiINF1zMYPqxmqiFo3/jq5KQdX58jZXwuBWIGG4UZ0tCGSsAUo/ey6E3J8XzbpZBysMSDg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1634932257; bh=dtdSd2GVAlt86iGSeHsYnCpWOz/hWi4jeNK5r9aEKsy=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=cxfteBZwKxx3qaEc0y4SFaglvyiYI5oIs60liThOMAAGaIF292gIyUaVY0jb7AxR9quGDUpmYUGMoMDFtoIruaMLwhU3yVetD5K49k0HRd/hzf46bsB8CeWr0kTu/XyShyo6CBVpeW1E1toXmlB0JHisgibHxUk4uV+KjO9/mo2H6QtQPPpH10LmNJrKahZuFaXaNEIj75agnQzN5977rwRmtqAdQfecKI/HXmehEeNCPVe0KBRI92MMLL1F/An6LBdflpIyIkGQ1cvLjGDhI4YixT6bAxbzoZyCjbAzfS0abANZqWhQzcQ/kKCaY+St5oPOo8Mlv18qFOVsT48HAw== X-YMail-OSG: nuzQbXMVM1lm73UXwoQPu.5ALYwJgCHmVzzQtuXtX3I0AQVTnOI8EPEXr5jhWTg ZrQARzn_UbWvEV.nugTYEJl3GQuWBzw_UXJ3Ms4uHpggbTucv.9JBm2ZzbymTyzVqgMcnkhP_bpt 9xBr1JqFKcz4pzBaxjO.fAFAPXYhehcZzj1SOnWyZAHRNjrrMjvhY3wMv2rKDhJlfHNW0Vam0ePr 0DUbDvDThDWKeVmfR51TolJH7whe9j6yksvvfyNLKaWqDUkbDuGKDEqJwlnq6zzgGsYhrcSVTM2G K4Q2k.XIm80t4ol7spScasNyMFef00VryZ4guWjePfCzm4PfdcW2hevZc8R1IhdOgEiOaXVzykqN 9mbUW94iZsdapY58gTodgndx2v0Vp.NOpVNHMe8hSOuoA627Ivw8vx5JK9XNGS6UoSMPM4Agc8H1 AOG_6KmFmuAgMF_H9iu8GUghTJf_EscmSTpPhOXUK_OaQMHwcscy5AdkWaSRW.KFkNxKO6merIQy 5gHi_AQGeciux5qfIiFsxrO44su1MbklznAWDtuxQnomueht._tfCovQHrn_gqZiP6IreywvxVk2 KH_m.ErpnXEtBghDpEh6MWJHe8qbtBnNE6aQmGFYqkJVOZUcrekEppL.QNJAKwosnQPhF3McnUvJ SPd9b0z4c07mfcx7qfoueMYAMtZoRa47s7UAvZXOZ5HlFYKyGAjCeo6amTxw1s64K8WQRJZ1ofov 6p13bzZlrEvNqKPW6310XobPl5Jwk_ZmjQwuBO8uoCUVGtqUZ.e0v8Gh2OoFwe73OBRTSliXvyoN w5DZ.5KguUSeAZoaaWHONTeHW9ot2v5VErNGjNQILSjfpulwy.N9Sy4C4JYEyeeVevQ.kkQapHGg dAvfFkKeU5Dq923cPbKW9lVMnYnofVPuUaWFt4yUwVn0TOX.ZaSKR.seSCKQbafLYWXMC_2donbu pOjT8jqB495iz13Fd2G7TMdsOjmRJeG0uRj92a4LI.ujhyip3GTMPQtiDDyWE_1aUpOWWs_6xIsR AsIU8wCmkXVRXfMfZhE.cOeOfhI25sSMaGdh33s.KQXMCnZZa6FDeP6VUDvu4ThXRzWcS9J39TQc n86SZekN2PfSsffkqq26mzyJ4onVbUrGoO9ArQeMCx9d_YFvzCps3H42MeNU9KrIvLLAnZUOIMRW aUl8YMaE3rxKd8O7UzaC6L4F.gga7bmFBt6rdIN5TZNSG8mRhvIGvJi6vL__EcIfzprB17kPx_wS c1mYPQ0gaqlajrD0GiT76t6wsmycvO6mdxbStjVXzfNsckzxUqjFXRQFOjhO9esw3svCsclFr5WZ 0pf7.XM84aZSRRZW7h_isaJFfzZ5nBX5wf2AU72cg3tpE27wQDX.EXZsM7xE1jowU9eht0oFt94P ehjmePH_szTqBIs_CaJYpUGlNgeL5.Uf9.IhsZDyVXUCki9hTclaxJqMUWtha56Lw0hIOX6qD9oY exgll6xPdpCYUFqQWy3wQMGsW29pgY5lFpf7S2UGfSMPxefqzoi2B6rXMH0KAApZYmoWnvw3rlTK j5405kdS3L2nIlXta8fOlWR1ytN73I2yVBhujEZ2Wel9roEBp1c.kMz90_RMemGMDkVjzLhWJ3fq EoSFghXRolgSGMyrJzMbfKqbVDUkgKOGRzojrQtiLQdALhnlwIdLK7CDHNsGd6U3U..a63kIJo7L cty7Gb0Q7bhfj2t64H_i9qWXAxO8lEgecULREDdelTmF7sVpkq1scV1C5yeaPi5rdidyJoGBPIhB urIqaF1WyaXRSFWVz_8K_uQOVk.4NnWzgqy799AXBjRexB_pHb2JYnFrKfu9vWMj.G.dAFRVIdUk HmwxLESgGWo355ckWR47Xz8Xk7KXtFoqFRKFUH1v4_7yMwlUyPELfEP24tqoS3bLL0ZMC_wYiMyx UdK0iqHuGpHRDLivYcQkYVirgn6nJRkP24hoZLFeOm4bYVxOiVCA_vh5ZVYhfQz7iCMCzBi42wfm suC0Bf1WVR.oFyyG24MeHmuJmZtG1or5cQbr3iHIpb0hbVvpp7My7zF9aTsfRosiWHJdu4PSiOIO jcO1ipqUdY0EtLlq9JSt2isos2_fKwRBWOr3loE6zyyxiZYi4O_Zxqt0jp3Cn95nGdkQgkwfeR2y eG6M1FzfO5kpBHxDxmxZURMAxbDLjk52GG_aotlmKuOdmITSPhwqsvl808MiFM7K0yZlUEGt.BuK hsTpyxXpoZLHPEfQqPg_XRYsutj._FE0Sig-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic311.consmr.mail.ir2.yahoo.com with HTTP; Fri, 22 Oct 2021 19:50:57 +0000 Received: by kubenode510.mail-prod1.omega.ir2.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 0f1c6664e7cc33f11673ba90c0dbced4; Fri, 22 Oct 2021 19:50:53 +0000 (UTC) Received: from [192.168.178.21] (helo=hydra) by mail.kiddle.eu with esmtp(Exim 4.94.2) (envelope-from ) id 1me0Z2-000DiP-4V; Fri, 22 Oct 2021 21:50:52 +0200 cc: Zsh hackers list In-reply-to: From: Oliver Kiddle References: To: dana Subject: Re: [BUG] Issue with _arguments !-x !+x MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <52723.1634932252.1@hydra> Date: Fri, 22 Oct 2021 21:50:52 +0200 Message-ID: <52724-1634932252.133446@GND0.A9K0.rCBc> X-Mailer: WebService/1.1.19198 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo X-Seq: 49518 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: On 12 Feb 2020, dana wrote: > I noticed something unexpected when i have both !-x and !+x type option specs > and then i try to complete stacked options containing the -x ones: Sorry, this has been on my todo list for a while. Implementation is essentially as I outlined in 45505 but using a function rather than a macro to get array indices. The example dana used to reproduce it is also added as a test case. Oliver diff --git a/Etc/BUGS b/Etc/BUGS index f1f8e44f8..5624fb24d 100644 --- a/Etc/BUGS +++ b/Etc/BUGS @@ -37,8 +37,6 @@ See test case in Test/C03traps.ztst. ------------------------------------------------------------------------ 44850 terminal issues with continuation markers ------------------------------------------------------------------------ -45422 _arguments !-x !+x ------------------------------------------------------------------------- users/24765 -direct terminals. Not a bug as such but we may need to do something if -direct values in TERM are ever common ------------------------------------------------------------------------ diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index e08788e89..b21033eb4 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -1035,7 +1035,7 @@ freecadef(Cadef d) freecaargs(d->rest); zsfree(d->nonarg); if (d->single) - zfree(d->single, 256 * sizeof(Caopt)); + zfree(d->single, 188 * sizeof(Caopt)); zfree(d, sizeof(*d)); d = s; } @@ -1079,6 +1079,21 @@ bslashcolon(char *s) return r; } +/* Get an index into the single array used in struct cadef + * opt is the option letter and pre is either - or + + * we only keep an array for the 94 ASCII characters from ! to ~ so + * with - and + prefixes, the array is double that at 188 elements + * returns -1 if opt is out-of-range + */ +static int +single_index(char pre, char opt) +{ + if (opt <= 20 || opt > 0x7e) + return -1; + + return opt + (pre == '-' ? -21 : 94 - 21); +} + /* Parse an argument definition. */ static Caarg @@ -1151,8 +1166,8 @@ alloc_cadef(char **args, int single, char *match, char *nonarg, int flags) ret->lastt = time(0); ret->set = NULL; if (single) { - ret->single = (Caopt *) zalloc(256 * sizeof(Caopt)); - memset(ret->single, 0, 256 * sizeof(Caopt)); + ret->single = (Caopt *) zalloc(188 * sizeof(Caopt)); + memset(ret->single, 0, 188 * sizeof(Caopt)); } else ret->single = NULL; ret->match = ztrdup(match); @@ -1558,9 +1573,10 @@ parse_cadef(char *nam, char **args) * pointer for the definition in the array for fast lookup. * But don't treat '--' as a single option called '-' */ - - if (single && name[1] && !name[2] && name[1] != '-') - ret->single[STOUC(name[1])] = opt; + if (single && name[1] && !name[2] && name[1] != '-') { + int sidx = single_index(*name, name[1]); + if (sidx >= 0) ret->single[sidx] = opt; + } if (again == 1) { /* Do it all again for `*-...'. */ @@ -1738,11 +1754,12 @@ ca_get_sopt(Cadef d, char *line, char **end, LinkList *lp) Caopt p, pp = NULL; char pre = *line++; LinkList l = NULL; + int sidx; *lp = NULL; for (p = NULL; *line; line++) { - if ((p = d->single[STOUC(*line)]) && p->active && - p->args && p->name[0] == pre) { + if ((sidx = single_index(pre, *line)) != -1 && + (p = d->single[sidx]) && p->active && p->args) { if (p->type == CAO_NEXT) { if (!l) *lp = l = newlinklist(); @@ -2190,6 +2207,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) char *p; Caopt tmpopt; + int sidx; if (cur != compcurrent && sopts && nonempty(sopts)) state.curopt = (Caopt) uremnode(sopts, firstnode(sopts)); @@ -2207,7 +2225,8 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) state.singles = (!pe || !*pe); for (p = line + 1; p < pe; p++) { - if ((tmpopt = d->single[STOUC(*p)])) { + if ((sidx = single_index(*line, *p)) != -1 && + (tmpopt = d->single[sidx])) { if (!state.oargs[tmpopt->num]) state.oargs[tmpopt->num] = znewlinklist(); diff --git a/Test/Y03arguments.ztst b/Test/Y03arguments.ztst index bf41aead5..0690b3629 100644 --- a/Test/Y03arguments.ztst +++ b/Test/Y03arguments.ztst @@ -102,6 +102,28 @@ >NO:{+o} >NO:{-o} + tst_arguments -s -{a,b,c} \!-{d,e,f} \!+{d,e,f} + comptest $'tst -ad\t\024\t\bef\t' +0:mix of + and - and exclusion of stacked options +>line: {tst -ad}{} +>DESCRIPTION:{option} +>NO:{-b} +>NO:{-c} +>line: {tst -da}{} +>DESCRIPTION:{option} +>NO:{-b} +>NO:{-c} +>line: {tst -def}{} +>DESCRIPTION:{option} +>NO:{-a} +>NO:{-b} +>NO:{-c} + + tst_arguments -s -{a,b,c} +{a,b,c} + comptest $'tst -a +b +c\t' +0:mix of + and - and exclusion of stacked options +>line: {tst -a +b +ca}{} + tst_arguments '-o:1:(a):2:(b)' comptest $'tst \t\t\t' 0:two option arguments