From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 835 invoked from network); 1 Mar 1999 17:11:25 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 1 Mar 1999 17:11:25 -0000 Received: (qmail 27544 invoked by alias); 1 Mar 1999 17:10:53 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 5590 Received: (qmail 27536 invoked from network); 1 Mar 1999 17:10:51 -0000 Date: Mon, 1 Mar 1999 18:10:07 +0100 (MET) Message-Id: <199903011710.SAA16183@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: Peter Stephenson's message of Mon, 01 Mar 1999 17:13:23 +0100 Subject: PATCH: Re: Don't understand compadd -p (or -P) any more Peter Stephenson wrote: > I thought I'd got this worked out, so maybe it's a bug. > > % _foo() { compadd -p pref/ bar rod; } > % compdef _foo foo > % foo pref/ # nothing > % foo > bar rod > > and the choices on the line do have the correct prefix. In other words, if > there's a pre-existing prefix there, it doesn't recognise it. Now it seems > -P is doing the same thing. Has the behaviour changed in some way I don't > understand? I had played with this the weekend before the last one and wanted to make the code automatically insert the `-p'-prefix. At that time I had a function where it worked, but I don't remember it anymore. The patch below implements the other thing I tried at the time. With this, the prefix/suffix given with `-p' and `-s' have to be present on the line if matching is done. I think this makes sense (and the older stuff had some other problems anyway). The problem with the `-P' prefix was that the prefix on the line wasn't ignored. Bye Sven --- os/Zle/zle_tricky.c Mon Mar 1 16:42:13 1999 +++ Src/Zle/zle_tricky.c Mon Mar 1 18:08:15 1999 @@ -3984,6 +3984,7 @@ int flags, int aflags, Cmatcher match, char *exp, char **argv) { char *s, *t, *e, *me, *ms, *lipre = NULL, *lpre, *lsuf, **aign = NULL; + char *tlsuf; int lpl, lsl, i, pl, sl, test, bpl, bsl, llpl, llsl; Aminfo ai; Cline lc = NULL; @@ -4030,6 +4031,14 @@ lsuf = dupstring(compsuffix); llpl = strlen(lpre); llsl = strlen(lsuf); + /* Test if there is an existing -P prefix. */ + if (pre && *pre) { + pl = strlen(pre); + if (pl <= llpl && !strncmp(lpre, pre, pl)) { + llpl -= pl; + lpre += pl; + } + } if (isset(GLOBCOMPLETE)) { char *tmp = (char *) zhalloc(2 + llpl + llsl); @@ -4061,47 +4070,56 @@ lsl = strlen(psuf); } else lsl = 0; - if (pre) - pre = dupstring(pre); - if (suf) - suf = dupstring(suf); - if (!prpre && (prpre = ppre)) { - singsub(&prpre); - untokenize(prpre); - } else - prpre = dupstring(prpre); - /* Select the group in which to store the matches. */ - if (group) { - endcmgroup(NULL); - begcmgroup(group, (aflags & CAF_NOSORT)); - if (aflags & CAF_NOSORT) - mgroup->flags |= CGF_NOSORT; - } else { - endcmgroup(NULL); - begcmgroup("default", 0); - } - /* Select the set of matches. */ - if (aflags & CAF_ALT) { - l = fmatches; - ai = fainfo; - } else { - l = matches; - ai = ainfo; - } - if (remf) { - remf = dupstring(remf); - rems = NULL; - } else if (rems) - rems = dupstring(rems); - /* Build the common -P prefix. */ - if (ai->pprefix) { + if ((aflags & CAF_MATCH) && + ((lpl && (llpl < lpl || strncmp(lpre, ppre, lpl))) || + (lsl && (llsl < lsl || strncmp(lsuf + llsl - lsl, psuf, lsl))))) + *argv = NULL; + else { + if (aflags & CAF_MATCH) { + tlsuf = dupstring(lsuf); + tlsuf[llsl - lsl] = '\0'; + } if (pre) - ai->pprefix[pfxlen(ai->pprefix, pre)] = '\0'; - else - ai->pprefix[0] = '\0'; - } else - ai->pprefix = dupstring(pre ? pre : ""); - + pre = dupstring(pre); + if (suf) + suf = dupstring(suf); + if (!prpre && (prpre = ppre)) { + singsub(&prpre); + untokenize(prpre); + } else + prpre = dupstring(prpre); + /* Select the group in which to store the matches. */ + if (group) { + endcmgroup(NULL); + begcmgroup(group, (aflags & CAF_NOSORT)); + if (aflags & CAF_NOSORT) + mgroup->flags |= CGF_NOSORT; + } else { + endcmgroup(NULL); + begcmgroup("default", 0); + } + /* Select the set of matches. */ + if (aflags & CAF_ALT) { + l = fmatches; + ai = fainfo; + } else { + l = matches; + ai = ainfo; + } + if (remf) { + remf = dupstring(remf); + rems = NULL; + } else if (rems) + rems = dupstring(rems); + /* Build the common -P prefix. */ + if (ai->pprefix) { + if (pre) + ai->pprefix[pfxlen(ai->pprefix, pre)] = '\0'; + else + ai->pprefix[0] = '\0'; + } else + ai->pprefix = dupstring(pre ? pre : ""); + } /* Walk through the matches given. */ for (; (s = dupstring(*argv)); argv++) { sl = strlen(s); @@ -4136,19 +4154,19 @@ else continue; } else { - test = (sl >= llpl + llsl && - strpfx(lpre, s) && strsfx(lsuf, s)); + test = (sl >= llpl + llsl - lpl - lsl && + strpfx(lpre + lpl, s) && strsfx(tlsuf, s)); if (!test && mstack && - (ms = comp_match(lpre, lsuf, s, + (ms = comp_match(lpre + lpl, tlsuf, s, &lc, (aflags & CAF_QUOTE), &bpl, &bsl))) test = 1; if (!test) continue; - pl = sl - llsl; - me = s + sl - llsl; - e = s + llpl; + pl = sl - (llsl - lsl); + me = s + sl - (llsl - lsl); + e = s + (llpl - lpl); } } else { e = s; @@ -4175,7 +4193,7 @@ if (ppre) t = dyncat(ppre, t); if (!cp && !ms && mstack) { - int bl = ((aflags & CAF_MATCH) ? llpl : 0); + int bl = ((aflags & CAF_MATCH) ? (llpl - lpl) : 0); Cline *clp = &lc, tlc; char *ss = dupstring(s), *ee = me + (ss - s); -- Sven Wischnowsky wischnow@informatik.hu-berlin.de