about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2000-05-30 03:43:27 +0000
committerBart Schaefer <barts@users.sourceforge.net>2000-05-30 03:43:27 +0000
commit8564aa5c0d77999138e4f46b496e2bbc2f48f718 (patch)
treeefebd369f29947bb23a73d9cd77914e9619a5e45
parent76868bdc6a9d9aaffb280f8206bdeebd1d2f14fc (diff)
downloadzsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.tar.gz
zsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.tar.xz
zsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.zip
Wayne: Fix two history bugs that were causing the
failure of `print -s'.
-rw-r--r--ChangeLog5
-rw-r--r--Src/Modules/parameter.c4
-rw-r--r--Src/Zle/compctl.c2
-rw-r--r--Src/Zle/zle_main.c3
-rw-r--r--Src/hist.c39
5 files changed, 30 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 272383a29..2df4a4025 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2000-05-29  Bart Schaefer  <schaefer@zsh.org>
 
+	* Wayne Davison: 11641: Src/hist.c, Src/Modules/parameter.c,
+	Src/Zle/compctl.c, Src/Zle/zle_main.c: Make sure `curline' has
+	sane values at more points during history manipulation, so that
+	"print -s" from a ZLE widget doesn't cause confusion.
+
 	* unposted: Completion/Core/_path_files: Add a comment to explain
 	the change made in 11635.
 
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index e46b14108..55fca09ac 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -1059,7 +1059,7 @@ scanpmhistory(HashTable ht, ScanFunc func, int flags)
 {
     struct param pm;
     int i = addhistnum(curhist, -1, HIST_FOREIGN);
-    Histent he = quietgethistent(i, GETHIST_UPWARD);
+    Histent he = gethistent(i, GETHIST_UPWARD);
     char buf[40];
 
     pm.flags = PM_SCALAR | PM_READONLY;
@@ -1096,7 +1096,7 @@ histwgetfn(Param pm)
     LinkList l = newlinklist(), ll;
     LinkNode n;
     int i = addhistnum(curhist, -1, HIST_FOREIGN), iw;
-    Histent he = quietgethistent(i, GETHIST_UPWARD);
+    Histent he = gethistent(i, GETHIST_UPWARD);
 
     ll = bufferwords(NULL, NULL, NULL);
     for (n = firstnode(ll); n; incnode(n))
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index b443b7da5..0e1dc088c 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -3688,7 +3688,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
 	Patprog pprogc = NULL;
 	char *e, *h, hpatsav;
 	int i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum;
-	Histent he = quietgethistent(i, GETHIST_UPWARD);
+	Histent he = gethistent(i, GETHIST_UPWARD);
 
 	/* Parse the pattern, if it isn't the null string. */
 	if (*(cc->hpat)) {
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index a19f9b5db..49b682c18 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -641,8 +641,11 @@ execzlefunc(Thingy func, char **args)
 	if(!(wflags & ZLE_LASTCOL))
 	    lastcol = -1;
 	if (wflags & WIDGET_NCOMP) {
+	  int atcurhist = histline == curhist;
 	    compwidget = w;
 	    ret = completecall(args);
+	    if (atcurhist)
+		histline = curhist;
 	} else
 	    ret = w->u.fn(args);
 	if (!(wflags & ZLE_NOTCOMMAND))
diff --git a/Src/hist.c b/Src/hist.c
index a3d8fa7ef..3b3757b8d 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -853,6 +853,7 @@ movehistent(Histent he, int n, int xflags)
 	if (!(he->flags & xflags))
 	    n--;
     }
+    checkcurline(he);
     return he;
 }
 
@@ -880,27 +881,26 @@ gethistent(int ev, int nearmatch)
 	return NULL;
 
     if (ev - hist_ring->down->histnum < hist_ring->histnum - ev) {
-	for (he = hist_ring->down; he->histnum <= ev; he = he->down) {
-	    if (he->histnum == ev)
-		return he;
+	for (he = hist_ring->down; he->histnum < ev; he = he->down) ;
+	if (nearmatch == 0) {
+	    if (he->histnum != ev)
+		return NULL;
 	}
-	if (nearmatch < 0)
-	    return up_histent(he);
-	if (nearmatch > 0)
-	    return he;
+	else if (nearmatch < 0 && (he = up_histent(he)) == NULL)
+	    return NULL;
     }
     else {
-	for (he = hist_ring; he->histnum >= ev; he = he->up) {
-	    if (he->histnum == ev)
-		return he;
+	for (he = hist_ring; he->histnum > ev; he = he->up) ;
+	if (nearmatch == 0) {
+	    if (he->histnum != ev)
+		return NULL;
 	}
-	if (nearmatch < 0)
-	    return he;
-	if (nearmatch > 0)
-	    return down_histent(he);
+	else if (nearmatch > 0 && (he = down_histent(he)) == NULL)
+	    return NULL;
     }
 
-    return NULL;
+    checkcurline(he);
+    return he;
 }
 
 /**/
@@ -1452,22 +1452,21 @@ convamps(char *out, char *in, int inlen)
 }
 
 /**/
-mod_export Histent
-quietgethistent(int ev, int nearmatch)
+mod_export void
+checkcurline(Histent he)
 {
-    if (ev == curhist && (histactive & HA_ACTIVE)) {
+    if (he->histnum == curhist && (histactive & HA_ACTIVE)) {
 	curline.text = chline;
 	curline.nwords = chwordpos/2;
 	curline.words = chwords;
     }
-    return gethistent(ev, nearmatch);
 }
 
 /**/
 mod_export Histent
 quietgethist(int ev)
 {
-    return quietgethistent(ev, GETHIST_EXACT);
+    return gethistent(ev, GETHIST_EXACT);
 }
 
 /**/