]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/list.c
Append .zip to ZIP files generated by release script
[dragonblocks_alpha.git] / src / list.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "list.h"
4
5 bool list_compare_default(void *v1, void *v2)
6 {
7         return v1 == v2;
8 }
9
10 bool list_compare_string(void *v1, void *v2)
11 {
12         return strcmp(v1, v2) == 0;
13 }
14
15 List list_create(ListComparator cmp)
16 {
17         return (List) {
18                 .cmp = cmp ? cmp : list_compare_default,
19                 .first = NULL,
20         };
21 }
22
23 void list_clear(List *list)
24 {
25         for (ListPair *pair = list->first; pair != NULL;) {
26                 ListPair *next = pair->next;
27                 free(pair);
28                 pair = next;
29         }
30         list->first = NULL;
31 }
32
33 static ListPair *make_pair(void *key, void *value)
34 {
35         ListPair *pair = malloc(sizeof(ListPair));
36         pair->key = key;
37         pair->value = value;
38         pair->next = NULL;
39         return pair;
40 }
41
42 bool list_put(List *list, void *key, void *value)
43 {
44         ListPair **pairptr;
45         for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
46                 if (list->cmp((*pairptr)->key, key))
47                         return false;
48         }
49         *pairptr = make_pair(key, value);
50         return true;
51 }
52
53 void list_set(List *list, void *key, void *value)
54 {
55         ListPair **pairptr;
56         for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
57                 if (strcmp((*pairptr)->key, key) == 0)
58                         break;
59         }
60         *pairptr = make_pair(key, value);
61 }
62
63 void *list_delete(List *list, void *key)
64 {
65         for (ListPair **pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
66                 if (list->cmp((*pairptr)->key, key)) {
67                         ListPair *pair = *pairptr;
68                         void *value = (*pairptr)->value;
69                         *pairptr = pair->next;
70                         free(pair);
71                         return value;
72                 }
73         }
74         return NULL;
75 }
76
77 void *list_get(List *list, void *key)
78 {
79         for (ListPair *pair = list->first; pair != NULL; pair = pair->next)
80                 if (list->cmp(pair->key, key))
81                         return pair->value;
82         return NULL;
83 }