Add pushhist(), pophist() and forgethist()

This commit is contained in:
sin 2014-10-22 17:07:04 +01:00
parent 1183a9428f
commit aedec0ddf3
1 changed files with 50 additions and 26 deletions

76
noice.c
View File

@ -482,6 +482,47 @@ dentfree(struct entry *dents, int n)
free(dents);
}
void
pushhist(int pos)
{
struct history *hist;
hist = xmalloc(sizeof(*hist));
hist->pos = pos;
SLIST_INSERT_HEAD(&histhead, hist, entry);
}
int
pophist(void)
{
struct history *hist;
int pos;
/* Recall history */
hist = SLIST_FIRST(&histhead);
if (hist != NULL) {
pos = hist->pos;
SLIST_REMOVE_HEAD(&histhead, entry);
free(hist);
} else {
pos = 0;
}
return pos;
}
void
forgethist(void)
{
struct history *hist;
while (!SLIST_EMPTY(&histhead)) {
hist = SLIST_FIRST(&histhead);
SLIST_REMOVE_HEAD(&histhead, entry);
free(hist);
}
}
void
browse(const char *ipath, const char *ifilter)
{
@ -530,7 +571,6 @@ begin:
char *dir;
char *tmp;
regex_t re;
struct history *hist;
redraw:
nlines = MIN(LINES - 4, n);
@ -569,11 +609,7 @@ nochange:
free(path);
free(filter);
/* Forget history */
while (!SLIST_EMPTY(&histhead)) {
hist = SLIST_FIRST(&histhead);
SLIST_REMOVE_HEAD(&histhead, entry);
free(hist);
}
forgethist();
return;
case SEL_BACK:
/* There is no going back */
@ -582,18 +618,11 @@ nochange:
dir = xdirname(path);
free(path);
path = dir;
/* Reset filter */
free(filter);
filter = xstrdup(ifilter); /* Reset filter */
filter = xstrdup(ifilter);
/* Recall history */
hist = SLIST_FIRST(&histhead);
if (hist != NULL) {
cur = hist->pos;
DPRINTF_D(hist->pos);
SLIST_REMOVE_HEAD(&histhead, entry);
free(hist);
} else {
cur = 0;
}
cur = pophist();
goto out;
case SEL_GOIN:
/* Cannot descend in empty directories */
@ -615,12 +644,11 @@ nochange:
case S_IFDIR:
free(path);
path = xrealpath(name);
/* Reset filter */
free(filter);
filter = xstrdup(ifilter); /* Reset filter */
/* Save history */
hist = xmalloc(sizeof(struct history));
hist->pos = cur;
SLIST_INSERT_HEAD(&histhead, hist, entry);
filter = xstrdup(ifilter);
/* Remember history */
pushhist(cur);
cur = 0;
goto out;
case S_IFREG:
@ -679,11 +707,7 @@ nochange:
free(filter);
filter = xstrdup(ifilter); /* Reset filter */
/* Forget history */
while (!SLIST_EMPTY(&histhead)) {
hist = SLIST_FIRST(&histhead);
SLIST_REMOVE_HEAD(&histhead, entry);
free(hist);
}
forgethist();
DPRINTF_S(path);
cur = 0;
goto out;