summaryrefslogtreecommitdiff
path: root/Src/hist.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@users.sourceforge.net>2001-05-15 16:32:25 +0000
committerWayne Davison <wayned@users.sourceforge.net>2001-05-15 16:32:25 +0000
commit9f9ced8c622cf303aa334fae6f36530d01e46e09 (patch)
treed45514ea038bbc27c99f7a89108da0a515bc478d /Src/hist.c
parenteb71464b09eb01014934ede89c031f8acddff6b8 (diff)
downloadzsh-9f9ced8c622cf303aa334fae6f36530d01e46e09.tar.gz
zsh-9f9ced8c622cf303aa334fae6f36530d01e46e09.zip
+ Changed histreduceblanks() to preserve spaces at the start of the
line when HISTIGNORESPACE is set. + Flag a history entry with HIST_TMPSTORE when should_ignore_line() returns true (instead of dropping it from the history immediately). + Get rid of old HIST_TMPSTORE entries when a new command is entered. + The hist-file-reading code now handles destroying a foreign duplicate (when marked as duplicate by addhistnode()).
Diffstat (limited to 'Src/hist.c')
-rw-r--r--Src/hist.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/Src/hist.c b/Src/hist.c
index f662ed9af..09a043d4d 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -794,16 +794,19 @@ hbegin(int dohist)
void
histreduceblanks(void)
{
- int i, len, pos, needblank;
+ int i, len, pos, needblank, spacecount = 0;
- for (i = 0, len = 0; i < chwordpos; i += 2) {
+ if (isset(HISTIGNORESPACE))
+ while (chline[spacecount] == ' ') spacecount++;
+
+ for (i = 0, len = spacecount; i < chwordpos; i += 2) {
len += chwords[i+1] - chwords[i]
+ (i > 0 && chwords[i] > chwords[i-1]);
}
if (chline[len] == '\0')
return;
- for (i = 0, pos = 0; i < chwordpos; i += 2) {
+ for (i = 0, pos = spacecount; i < chwordpos; i += 2) {
len = chwords[i+1] - chwords[i];
needblank = (i < chwordpos-2 && chwords[i+2] > chwords[i+1]);
if (pos != chwords[i]) {
@@ -1044,8 +1047,10 @@ hend(Eprog prog)
} else
save = 0;
}
- if (chwordpos <= 2 || should_ignore_line(prog))
+ if (chwordpos <= 2)
save = 0;
+ else if (should_ignore_line(prog))
+ save = -1;
}
if (flag & (HISTFLAG_DONE | HISTFLAG_RECALL)) {
char *ptr;
@@ -1058,14 +1063,23 @@ hend(Eprog prog)
}
if (flag & HISTFLAG_RECALL) {
zpushnode(bufstack, ptr);
-
save = 0;
} else
zsfree(ptr);
}
+ if (save || *chline == ' ') {
+ Histent he;
+ for (he = hist_ring; he && he->flags & HIST_FOREIGN;
+ he = up_histent(he)) ;
+ if (he && he->flags & HIST_TMPSTORE) {
+ if (he == hist_ring)
+ curline.histnum = curhist--;
+ freehistnode((HashNode)he);
+ }
+ }
if (save) {
Histent he;
- int keepflags;
+ int newflags;
#ifdef DEBUG
/* debugging only */
@@ -1081,6 +1095,7 @@ hend(Eprog prog)
if (isset(HISTREDUCEBLANKS))
histreduceblanks();
}
+ newflags = save > 0? 0 : HIST_OLD | HIST_TMPSTORE;
if ((isset(HISTIGNOREDUPS) || isset(HISTIGNOREALLDUPS)) && hist_ring
&& histstrcmp(chline, hist_ring->text) == 0) {
/* This history entry compares the same as the previous.
@@ -1089,18 +1104,16 @@ hend(Eprog prog)
* timestamp right. Perhaps, preserve the HIST_OLD flag.
*/
he = hist_ring;
- keepflags = he->flags & HIST_OLD; /* Avoid re-saving */
+ newflags |= he->flags & HIST_OLD; /* Avoid re-saving */
freehistdata(he, 0);
curline.histnum = curhist;
- } else {
- keepflags = 0;
+ } else
he = prepnexthistent();
- }
he->text = ztrdup(chline);
he->stim = time(NULL);
he->ftim = 0L;
- he->flags = keepflags;
+ he->flags = newflags;
if ((he->nwords = chwordpos/2)) {
he->words = (short *)zalloc(chwordpos * sizeof(short));
@@ -1893,8 +1906,10 @@ readhistfile(char *fn, int err, int readflags)
} else
he->words = (short *)NULL;
addhistnode(histtab, he->text, he);
- if (hist_ring != he)
- curhist--; /* We discarded a foreign duplicate */
+ if (he->flags & HIST_DUP) {
+ freehistnode((HashNode)he);
+ curhist--;
+ }
}
if (start && readflags & HFILE_USE_OPTIONS) {
zsfree(lasthist.text);
@@ -1962,7 +1977,8 @@ savehistfile(char *fn, int err, int writeflags)
if (out) {
for (; he && he->histnum <= xcurhist; he = down_histent(he)) {
if ((writeflags & HFILE_SKIPDUPS && he->flags & HIST_DUP)
- || (writeflags & HFILE_SKIPFOREIGN && he->flags & HIST_FOREIGN))
+ || (writeflags & HFILE_SKIPFOREIGN && he->flags & HIST_FOREIGN)
+ || he->flags & HIST_TMPSTORE)
continue;
if (writeflags & HFILE_SKIPOLD) {
if (he->flags & HIST_OLD)