summaryrefslogtreecommitdiffhomepage
path: root/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'list.c')
-rw-r--r--list.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/list.c b/list.c
new file mode 100644
index 0000000..8be1a3a
--- /dev/null
+++ b/list.c
@@ -0,0 +1,49 @@
+#include "options.h"
+#include "dbutil.h"
+#include "list.h"
+
+void list_append(m_list *list, void *item) {
+ m_list_elem *elem;
+
+ elem = m_malloc(sizeof(*elem));
+ elem->item = item;
+ elem->list = list;
+ elem->next = NULL;
+ if (!list->first) {
+ list->first = elem;
+ elem->prev = NULL;
+ } else {
+ elem->prev = list->last;
+ list->last->next = elem;
+ }
+ list->last = elem;
+}
+
+m_list * list_new() {
+ m_list *ret = m_malloc(sizeof(m_list));
+ ret->first = ret->last = NULL;
+ return ret;
+}
+
+void * list_remove(m_list_elem *elem) {
+ void *item = elem->item;
+ m_list *list = elem->list;
+ if (list->first == elem)
+ {
+ list->first = elem->next;
+ }
+ if (list->last == elem)
+ {
+ list->last = elem->prev;
+ }
+ if (elem->prev)
+ {
+ elem->prev->next = elem->next;
+ }
+ if (elem->next)
+ {
+ elem->next->prev = elem->prev;
+ }
+ m_free(elem);
+ return item;
+} \ No newline at end of file