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"
7 #define ITER_REFS node = &list->fst; *node != NULL; node = &(*node)->nxt
9 void list_ini(List *list)
12 list->end = &list->fst;
15 WRAP_NODE_FUNCTIONS(List, list_)
17 void list_apd(List *list, void *dat)
19 list_nmk(list, list->end, dat);
22 void list_ppd(List *list, void *dat)
24 ListNode *fst = list->fst;
25 list_nmk(list, &list->fst, dat);
29 ListNode **list_nfd(List *list, void *key, void *cmp)
34 if (((Comparator) cmp)((*node)->dat, key) == 0)
40 void list_nmk(List *list, ListNode **node, void *dat)
42 *node = malloc(sizeof **node);
46 if (list->end == node)
47 list->end = &(*node)->nxt;
50 void list_nrm(List *list, ListNode **node)
52 ListNode *old = *node;
55 if (list->end == &old->nxt)
61 void list_itr(List *list, void *iter, void *arg, void *trans)
63 LIST_ITERATE(list, node)
64 ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg);
67 void list_clr(List *list, void *iter, void *arg, void *trans)
69 for (ListNode *node = list->fst; node != NULL;) {
70 ListNode *next = node->nxt;
73 ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg);