summaryrefslogtreecommitdiff
path: root/Src/hist.c
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 /Src/hist.c
parent76868bdc6a9d9aaffb280f8206bdeebd1d2f14fc (diff)
downloadzsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.tar.gz
zsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.zip
Wayne: Fix two history bugs that were causing the
failure of `print -s'.
Diffstat (limited to 'Src/hist.c')
-rw-r--r--Src/hist.c39
1 files changed, 19 insertions, 20 deletions
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);
}
/**/