5 bool list_compare_default(void *v1, void *v2)
10 bool list_compare_string(void *v1, void *v2)
12 return strcmp(v1, v2) == 0;
15 List list_create(ListComparator cmp)
18 .cmp = cmp ? cmp : list_compare_default,
23 void list_clear(List *list)
25 for (ListPair *pair = list->first; pair != NULL;) {
26 ListPair *next = pair->next;
33 static ListPair *make_pair(void *key, void *value)
35 ListPair *pair = malloc(sizeof(ListPair));
42 bool list_put(List *list, void *key, void *value)
45 for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
46 if (list->cmp((*pairptr)->key, key))
49 *pairptr = make_pair(key, value);
53 void list_set(List *list, void *key, void *value)
56 for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
57 if (strcmp((*pairptr)->key, key) == 0)
60 *pairptr = make_pair(key, value);
63 void *list_delete(List *list, void *key)
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;
77 void *list_get(List *list, void *key)
79 for (ListPair *pair = list->first; pair != NULL; pair = pair->next)
80 if (list->cmp(pair->key, key))