#include "fm.h"
#ifdef USE_HISTORY
Buffer *
historyBuffer(Hist * hist)
{
Str src = Strnew();
HistItem *item;
char *q;
Strcat_charp(src, "\n
History Page\n");
Strcat_charp(src, "\nHistory Page
\n
\n");
Strcat_charp(src, "\n");
if (hist && hist->list) {
for (item = hist->list->last; item; item = item->prev) {
q = html_quote((char *)item->ptr);
Strcat_charp(src, "- ");
Strcat_charp(src, q);
Strcat_charp(src, "\n");
}
}
Strcat_charp(src, "
\n\n");
return loadHTMLString(src);
}
void
loadHistory(Hist * hist)
{
FILE *f;
Str line;
if (hist == NULL)
return;
if ((f = fopen(rcFile(HISTORY_FILE), "rt")) == NULL)
return;
while (!feof(f)) {
line = Strfgets(f);
Strchop(line);
Strremovefirstspaces(line);
Strremovetrailingspaces(line);
if (line->length == 0)
continue;
pushHist(hist, url_quote(line->ptr));
}
fclose(f);
}
void
saveHistory(Hist * hist, size_t size)
{
FILE *f;
HistItem *item;
if (hist == NULL || hist->list == NULL)
return;
if ((f = fopen(rcFile(HISTORY_FILE), "w")) == NULL) {
disp_err_message("Can't open history", FALSE);
return;
}
for (item = hist->list->first; item && hist->list->nitem > size;
item = item->next)
size++;
for (; item; item = item->next)
fprintf(f, "%s\n", (char *)item->ptr);
fclose(f);
}
#endif /* USE_HISTORY */
Hist *
newHist()
{
Hist *hist;
hist = New(Hist);
hist->list = (HistList *)newGeneralList();
hist->current = NULL;
hist->hash = NULL;
return hist;
}
HistItem *
unshiftHist(Hist *hist, char *ptr)
{
HistItem *item;
if (hist == NULL || hist->list == NULL)
return NULL;
item = (HistItem *)newListItem((void *)allocStr(ptr, 0),
(ListItem *)hist->list->first, NULL);
if (hist->list->first)
hist->list->first->prev = item;
else
hist->list->last = item;
hist->list->first = item;
hist->list->nitem++;
return item;
}
HistItem *
pushHist(Hist *hist, char *ptr)
{
HistItem *item;
if (hist == NULL || hist->list == NULL)
return NULL;
item = (HistItem *)newListItem((void *)allocStr(ptr, 0),
NULL, (ListItem *)hist->list->last);
if (hist->list->last)
hist->list->last->next = item;
else
hist->list->first = item;
hist->list->last = item;
hist->list->nitem++;
return item;
}
/* Don't mix pushHashHist() and pushHist()/unshiftHist(). */
HistItem *
pushHashHist(Hist * hist, char *ptr)
{
HistItem *item;
if (hist == NULL || hist->list == NULL)
return NULL;
item = getHashHist(hist, ptr);
if (item) {
if (item->next)
item->next->prev = item->prev;
else /* item == hist->list->last */
hist->list->last = item->prev;
if (item->prev)
item->prev->next = item->next;
else /* item == hist->list->first */
hist->list->first = item->next;
hist->list->nitem--;
}
item = pushHist(hist, ptr);
putHash_hist(hist->hash, ptr, (void *)item);
return item;
}
HistItem *
getHashHist(Hist * hist, char *ptr)
{
HistItem *item;
if (hist == NULL || hist->list == NULL)
return NULL;
if (hist->hash == NULL) {
hist->hash = newHash_hist(HIST_HASH_SIZE);
for (item = hist->list->first; item; item = item->next)
putHash_hist(hist->hash, (char *)item->ptr, (void *)item);
}
return (HistItem *)getHash_hist(hist->hash, ptr, NULL);
}
char *
lastHist(Hist * hist)
{
if (hist == NULL || hist->list == NULL)
return NULL;
if (hist->list->last) {
hist->current = hist->list->last;
return (char *)hist->current->ptr;
}
return NULL;
}
char *
nextHist(Hist * hist)
{
if (hist == NULL || hist->list == NULL)
return NULL;
if (hist->current && hist->current->next) {
hist->current = hist->current->next;
return (char *)hist->current->ptr;
}
return NULL;
}
char *
prevHist(Hist * hist)
{
if (hist == NULL || hist->list == NULL)
return NULL;
if (hist->current && hist->current->prev) {
hist->current = hist->current->prev;
return (char *)hist->current->ptr;
}
return NULL;
}