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