summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ll.c97
-rw-r--r--src/ll.h35
2 files changed, 132 insertions, 0 deletions
diff --git a/src/ll.c b/src/ll.c
new file mode 100644
index 0000000..c94a45b
--- /dev/null
+++ b/src/ll.c
@@ -0,0 +1,97 @@
1#include "ll.h"
2
3#include <stddef.h>
4
5void dlinkedlist_init(dlinkedlist **ll) {
6 (*ll) = xcalloc(1, sizeof(**ll));
7
8 (*ll)->start = NULL;
9 (*ll)->end = NULL;
10 (*ll)->size = 0;
11
12 return;
13}
14
15void dlinkedlist_free(dlinkedlist **ll) {
16 dllnode *p = (*ll)->start, *n;
17 while(p != NULL) {
18 n = p->next;
19
20 if(p->dfreecb != NULL)
21 p->dfreecb(p->data);
22 free(p);
23
24 p = n;
25 }
26
27 free(*ll);
28 (*ll) = NULL;
29 return;
30}
31
32int dlinkedlist_firstitem(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
33 if(!ll)
34 return -1;
35 if(ll->size != 0)
36 return 0;
37
38 dllnode *n = xcalloc(1, sizeof(*n));
39 n->next = NULL;
40 n->prev = NULL;
41 n->data = data;
42 n->dfreecb = dfreecb;
43
44 ll->start = n;
45 ll->end = n;
46 ll->size = 1;
47
48 return 1;
49}
50
51int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
52 if(!ll)
53 return -1;
54 if(dlinkedlist_firstitem(ll, data, dfreecb) > 0)
55 return 0;
56
57 dllnode *n = xcalloc(1, sizeof(*n));
58 n->data = data;
59 n->dfreecb = dfreecb;
60 n->prev = NULL;
61 n->next = ll->start;
62
63 ll->start->prev = n;
64 ll->start = n;
65 ll->size++;
66
67 return 0;
68}
69
70int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
71 if(!ll)
72 return -1;
73 if(dlinkedlist_firstitem(ll, data, dfreecb) > 0)
74 return 0;
75
76 dllnode *n = xcalloc(1, sizeof(*n));
77 n->data = data;
78 n->dfreecb = dfreecb;
79 n->prev = ll->end;
80 n->next = NULL;
81
82 ll->end->next = n;
83 ll->end = n;
84 ll->size++;
85
86 return 0;
87}
88
89dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index) {
90 if(index >= ll->size)
91 return NULL;
92
93 dllnode *p = ll->start;
94 for(size_t i = 0; i < index && p != NULL; i++, p = p->next);
95
96 return p;
97} \ No newline at end of file
diff --git a/src/ll.h b/src/ll.h
new file mode 100644
index 0000000..5e47bd9
--- /dev/null
+++ b/src/ll.h
@@ -0,0 +1,35 @@
1#ifndef __VXGG_REWRITE___SHARED_H___28542989122405___
2#define __VXGG_REWRITE___SHARED_H___28542989122405___
3
4#include <stddef.h>
5
6typedef struct dll {
7 void *data;
8 int (*dfreecb)(void*);
9
10 struct dll *next;
11 struct dll *prev;
12} dllnode;
13
14typedef struct {
15 dllnode *start;
16 dllnode *end;
17 size_t size;
18} dlinkedlist;
19
20// Initialize a dlinkedlist
21void dlinkedlist_init(dlinkedlist **ll);
22
23// Free a dlinkedlist and its elements
24void dlinkedlist_free(dlinkedlist **ll);
25
26// Insert an element to the beginning of the list
27int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*));
28
29// Insert an element to the end of the list
30int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*));
31
32// Get the element from a dlinkedlist at index
33dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index);
34
35#endif \ No newline at end of file