summaryrefslogtreecommitdiff
path: root/src/history.c
diff options
context:
space:
mode:
authorjcid <devnull@localhost>2007-10-07 00:36:34 +0200
committerjcid <devnull@localhost>2007-10-07 00:36:34 +0200
commit93715c46a99c96d6c866968312691ec9ab0f6a03 (patch)
tree573f19ec6aa740844f53a7c0eb7114f04096bf64 /src/history.c
Initial revision
Diffstat (limited to 'src/history.c')
-rw-r--r--src/history.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/history.c b/src/history.c
new file mode 100644
index 00000000..7819e58e
--- /dev/null
+++ b/src/history.c
@@ -0,0 +1,125 @@
+/*
+ * File: history.c
+ *
+ * Copyright (C) 2001, 2002 Jorge Arellano Cid <jcid@dillo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ */
+
+/*
+ * Linear history (it also provides indexes for the navigation stack)
+ */
+
+#include "list.h"
+#include "history.h"
+
+
+typedef struct {
+ DilloUrl *url;
+ char *title;
+} H_Item;
+
+
+/* Global history list */
+static H_Item *history = NULL;
+static int history_size = 0; /* [1 based] */
+static int history_size_max = 16;
+
+
+/*
+ * Add a new H_Item at the end of the history list
+ * (taking care of not making a duplicate entry)
+ */
+int a_History_add_url(DilloUrl *url)
+{
+ int i, idx;
+
+ for (i = 0; i < history_size; ++i)
+ if (a_Url_cmp(history[i].url, url) == 0)
+ return i;
+
+ idx = history_size;
+ a_List_add(history, history_size, history_size_max);
+ history[idx].url = a_Url_dup(url);
+ history[idx].title = NULL;
+ ++history_size;
+ return idx;
+}
+
+/*
+ * Set the page-title for a given URL (by idx)
+ * (this is known when the first chunks of HTML data arrive)
+ */
+int a_History_set_title(int idx, const char *title)
+{
+ dReturn_val_if_fail(idx >= 0 && idx < history_size, 0);
+
+ dFree(history[idx].title);
+ history[idx].title = dStrdup(title);
+ return 1;
+}
+
+/*
+ * Return the DilloUrl camp (by index)
+ */
+DilloUrl *a_History_get_url(int idx)
+{
+ dReturn_val_if_fail(idx >= 0 && idx < history_size, NULL);
+
+ return history[idx].url;
+}
+
+/*
+ * Return the title camp (by index)
+ * ('force' returns URL_STR when there's no title)
+ */
+const char *a_History_get_title(int idx, int force)
+{
+ dReturn_val_if_fail(idx >= 0 && idx < history_size, NULL);
+
+ if (history[idx].title)
+ return history[idx].title;
+ else if (force)
+ return URL_STR(history[idx].url);
+ else
+ return NULL;
+}
+
+/*
+ * Return the title camp (by url)
+ * ('force' returns URL_STR when there's no title)
+ */
+const char *a_History_get_title_by_url(DilloUrl *url, int force)
+{
+ int i;
+
+ dReturn_val_if_fail(url != NULL, NULL);
+
+ for (i = 0; i < history_size; ++i)
+ if (a_Url_cmp(url, history[i].url) == 0)
+ break;
+
+ if (i < history_size && history[i].title)
+ return history[i].title;
+ else if (force)
+ return URL_STR_(url);
+ return NULL;
+}
+
+
+/*
+ * Free all the memory used by this module
+ */
+void a_History_free()
+{
+ int i;
+
+ for (i = 0; i < history_size; ++i) {
+ a_Url_free(history[i].url);
+ dFree(history[i].title);
+ }
+ dFree(history);
+}