zsh-workers
 help / color / mirror / code / Atom feed
* Re: PATCH: Re: Don't understand compadd -p (or -P) any more
@ 1999-03-02  9:14 Sven Wischnowsky
  0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 1999-03-02  9:14 UTC (permalink / raw)
  To: zsh-workers


I wrote:

> I had played with this the weekend before the last one and wanted to
> make the code automatically insert the `-p'-prefix.

Thinking about this some more, I found a really easy way to get this
(should have thought of this from the beginning...).

The patch below makes `compadd' eagerly insert as much of the `-p' and 
`-P' prefixes as possible. The problem with the older solution was
that it required the `-p' prefix to be on the line. When comparing it
with the old code this seemed to make sense, since the `-p' prefix is
like an path prefix when completing files in the old code, where this
prefix is *taken* from the line. With `compadd' it's the other way
round: one *gives* such a prefix and suddenly this is completely
independent of the contents of the line. With that I had some trouble
finding out, what should be used for matching. Should the line match
`<-p><match><-s>', or only `<match>'? The patch below makes the `-P'
prefix be ignored as for `comp{gen,ctl}', then it sees if what's on
the line matches the beginning of the `-p' prefix. If there is nothing 
on the line, it just uses an empty string for matching, otherwise the
`-p'-prefix-part from the line is *not* used for matching, only what's 
after it.

And the same for the suffix, of course.

Bye
 Sven

diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c	Mon Mar  1 18:10:54 1999
+++ Src/Zle/zle_tricky.c	Tue Mar  2 08:49:24 1999
@@ -3984,7 +3984,6 @@
 	   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;
@@ -4033,11 +4032,9 @@
 		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;
-		    }
+		    pl = pfxlen(pre, lpre);
+		    llpl -= pl;
+		    lpre += pl;
 		}
 		if (isset(GLOBCOMPLETE)) {
 		    char *tmp = (char *) zhalloc(2 + llpl + llsl);
@@ -4070,15 +4067,27 @@
 		lsl = strlen(psuf);
 	    } else
 		lsl = 0;
-	    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 (aflags & CAF_MATCH) {
+		s = ppre ? ppre : "";
+		if (llpl <= lpl && strpfx(lpre, s)) {
+		    llpl = 0;
+		    lpre = "";
+		} else if (llpl > lpl && strpfx(s, lpre)) {
+		    llpl -= lpl;
+		    lpre += lpl;
+		} else
+		    *argv = NULL;
+		s = psuf ? psuf : "";
+		if (llsl <= lsl && strsfx(lsuf, s)) {
+		    llsl = 0;
+		    lsuf = "";
+		} else if (llsl > lsl && strsfx(s, lsuf)) {
+		    lsuf[llsl - lsl] = '\0';
+		    llsl -= lsl;
+		} else
+		    *argv = NULL;
+	    }
+	    if (*argv) {
 		if (pre)
 		    pre = dupstring(pre);
 		if (suf)
@@ -4154,19 +4163,19 @@
 			else
 			    continue;
 		    } else {
-			test = (sl >= llpl + llsl - lpl - lsl &&
-				strpfx(lpre + lpl, s) && strsfx(tlsuf, s));
+			test = (sl >= llpl + llsl &&
+				strpfx(lpre, s) && strsfx(lsuf, s));
 			if (!test && mstack &&
-			    (ms = comp_match(lpre + lpl, tlsuf, s,
+			    (ms = comp_match(lpre, lsuf, s,
 					     &lc, (aflags & CAF_QUOTE),
 					     &bpl, &bsl)))
 			    test = 1;
 
 			if (!test)
 			    continue;
-			pl = sl - (llsl - lsl);
-			me = s + sl - (llsl - lsl);
-			e = s + (llpl - lpl);
+			pl = sl - llsl;
+			me = s + sl - llsl;
+			e = s + llpl;
 		    }
 		} else {
 		    e = s;
@@ -4193,7 +4202,7 @@
 		if (ppre)
 		    t = dyncat(ppre, t);
 		if (!cp && !ms && mstack) {
-		    int bl = ((aflags & CAF_MATCH) ? (llpl - lpl) : 0);
+		    int bl = ((aflags & CAF_MATCH) ? llpl : 0);
 		    Cline *clp = &lc, tlc;
 		    char *ss = dupstring(s), *ee = me + (ss - s);
 

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 2+ messages in thread

* PATCH: Re: Don't understand compadd -p (or -P) any more
@ 1999-03-01 17:10 Sven Wischnowsky
  0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 1999-03-01 17:10 UTC (permalink / raw)
  To: zsh-workers


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/<TAB>                      # nothing
> % foo <TAB>
> 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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1999-03-02  9:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-03-02  9:14 PATCH: Re: Don't understand compadd -p (or -P) any more Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
1999-03-01 17:10 Sven Wischnowsky

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).