diff options
author | Bart Schaefer <barts@users.sourceforge.net> | 2000-05-30 03:43:27 +0000 |
---|---|---|
committer | Bart Schaefer <barts@users.sourceforge.net> | 2000-05-30 03:43:27 +0000 |
commit | 8564aa5c0d77999138e4f46b496e2bbc2f48f718 (patch) | |
tree | efebd369f29947bb23a73d9cd77914e9619a5e45 /Src/hist.c | |
parent | 76868bdc6a9d9aaffb280f8206bdeebd1d2f14fc (diff) | |
download | zsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.tar.gz zsh-8564aa5c0d77999138e4f46b496e2bbc2f48f718.tar.xz 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.c | 39 |
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); } /**/ |