1 /* $Id: history.c,v 1.11 2003/09/26 17:59:51 ukai Exp $ */
6 historyBuffer(Hist *hist)
12 /* FIXME: gettextize? */
13 Strcat_charp(src, "<html>\n<head><title>History Page</title></head>\n");
14 Strcat_charp(src, "<body>\n<h1>History Page</h1>\n<hr>\n");
15 Strcat_charp(src, "<ol>\n");
16 if (hist && hist->list) {
17 for (item = hist->list->last; item; item = item->prev) {
18 q = html_quote((char *)item->ptr);
20 p = html_quote(url_unquote_conv((char *)item->ptr, 0));
23 Strcat_charp(src, "<li><a href=\"");
25 Strcat_charp(src, "\">");
27 Strcat_charp(src, "</a>\n");
30 Strcat_charp(src, "</ol>\n</body>\n</html>");
31 return loadHTMLString(src);
35 loadHistory(Hist *hist)
42 if ((f = fopen(rcFile(HISTORY_FILE), "rt")) == NULL)
48 Strremovefirstspaces(line);
49 Strremovetrailingspaces(line);
50 if (line->length == 0)
52 pushHist(hist, url_quote(line->ptr));
58 saveHistory(Hist *hist, size_t size)
64 if (hist == NULL || hist->list == NULL)
66 tmpf = tmpfname(TMPF_DFL, NULL)->ptr;
67 if ((f = fopen(tmpf, "w")) == NULL) {
68 /* FIXME: gettextize? */
69 disp_err_message("Can't open history", FALSE);
72 for (item = hist->list->first; item && hist->list->nitem > size;
75 for (; item; item = item->next)
76 fprintf(f, "%s\n", (char *)item->ptr);
77 if (fclose(f) == EOF) {
78 /* FIXME: gettextize? */
79 disp_err_message("Can't save history", FALSE);
82 rename(tmpf, rcFile(HISTORY_FILE));
84 #endif /* USE_HISTORY */
92 hist->list = (HistList *)newGeneralList();
107 for (item = hist->list->first; item; item = item->next)
108 pushHist(new, (char *)item->ptr);
113 unshiftHist(Hist *hist, char *ptr)
117 if (hist == NULL || hist->list == NULL)
119 item = (HistItem *)newListItem((void *)allocStr(ptr, -1),
120 (ListItem *)hist->list->first, NULL);
121 if (hist->list->first)
122 hist->list->first->prev = item;
124 hist->list->last = item;
125 hist->list->first = item;
131 pushHist(Hist *hist, char *ptr)
135 if (hist == NULL || hist->list == NULL)
137 item = (HistItem *)newListItem((void *)allocStr(ptr, -1),
138 NULL, (ListItem *)hist->list->last);
139 if (hist->list->last)
140 hist->list->last->next = item;
142 hist->list->first = item;
143 hist->list->last = item;
148 /* Don't mix pushHashHist() and pushHist()/unshiftHist(). */
151 pushHashHist(Hist *hist, char *ptr)
155 if (hist == NULL || hist->list == NULL)
157 item = getHashHist(hist, ptr);
160 item->next->prev = item->prev;
161 else /* item == hist->list->last */
162 hist->list->last = item->prev;
164 item->prev->next = item->next;
165 else /* item == hist->list->first */
166 hist->list->first = item->next;
169 item = pushHist(hist, ptr);
170 putHash_sv(hist->hash, ptr, (void *)item);
175 getHashHist(Hist *hist, char *ptr)
179 if (hist == NULL || hist->list == NULL)
181 if (hist->hash == NULL) {
182 hist->hash = newHash_sv(HIST_HASH_SIZE);
183 for (item = hist->list->first; item; item = item->next)
184 putHash_sv(hist->hash, (char *)item->ptr, (void *)item);
186 return (HistItem *)getHash_sv(hist->hash, ptr, NULL);
192 if (hist == NULL || hist->list == NULL)
194 if (hist->list->last) {
195 hist->current = hist->list->last;
196 return (char *)hist->current->ptr;
204 if (hist == NULL || hist->list == NULL)
206 if (hist->current && hist->current->next) {
207 hist->current = hist->current->next;
208 return (char *)hist->current->ptr;
216 if (hist == NULL || hist->list == NULL)
218 if (hist->current && hist->current->prev) {
219 hist->current = hist->current->prev;
220 return (char *)hist->current->ptr;