]> git.lizzy.rs Git - dragonstd.git/blob - list.c
f7b3803fbacfb822c78b76c890a1ce198cd40ace
[dragonstd.git] / list.c
1 #include <stdlib.h> // for malloc, free
2 #include <string.h> // for strcmp
3 #include "bits/wrappers.h"
4 #include "list.h"
5
6 #define ITER_REFS node = &list->fst; *node != NULL; node = &(*node)->nxt
7
8 void list_ini(List *list)
9 {
10         list->fst = NULL;
11         list->end = &list->fst;
12 }
13
14 WRAP_NODE_FUNCTIONS(List, list_)
15
16 void list_apd(List *list, void *dat)
17 {
18         list_nmk(list, list->end, dat);
19 }
20
21 void list_ppd(List *list, void *dat)
22 {
23         ListNode *fst = list->fst;
24         list_nmk(list, &list->fst, dat);
25         list->fst->nxt = fst;
26 }
27
28 ListNode **list_nfd(List *list, void *key, Comparator cmp)
29 {
30         ListNode **node;
31
32         for (ITER_REFS)
33                 if (cmp((*node)->dat, key) == 0)
34                         return node;
35
36         return node;
37 }
38
39 void list_nmk(List *list, ListNode **node, void *dat)
40 {
41         *node = malloc(sizeof **node);
42         (*node)->dat = dat;
43         (*node)->nxt = NULL;
44
45         if (list->end == node)
46                 list->end = &(*node)->nxt;
47 }
48
49 void list_nrm(List *list, ListNode **node)
50 {
51         ListNode *old = *node;
52         *node = old->nxt;
53
54         if (list->end == &old->nxt)
55                 list->end = node;
56
57         free(old);
58 }
59
60 void list_itr(List *list, Iterator iter, void *arg, Transformer trans)
61 {
62         LIST_ITERATE(list, node)
63                 iter(trans ? trans(node->dat) : node->dat, arg);
64 }
65
66 void list_clr(List *list, Iterator iter, void *arg, Transformer trans)
67 {
68         for (ListNode *node = list->fst; node != NULL;) {
69                 ListNode *next = node->nxt;
70
71                 if (iter)
72                         iter(trans ? trans(node->dat) : node->dat, arg);
73
74                 free(node);
75                 node = next;
76         }
77
78         list_ini(list);
79 }