7 list_t *list_insert(list_t *next, void *data)
9 list_t *node = new0(list_t);
12 node->prev = next ? next->prev : NULL;
13 if (node->next) node->next->prev = node;
14 if (node->prev) node->prev->next = node;
18 void list_insert_after(list_t *prev, void *data)
20 // prev must be valid,
21 // as we cannot return the original list head
22 list_t *node = new0(list_t);
25 node->next = prev->next;
27 if (node->next) node->next->prev = node;
30 list_t *list_append(list_t *head, void *data)
35 list_t *node = new0(list_t);
38 if (last) last->next = node;
39 return last ? head : node;
42 list_t *list_remove(list_t *head, list_t *node)
44 list_t *next = node->next;
45 list_t *prev = node->prev;
46 if (next) next->prev = prev;
47 if (prev) prev->next = next;
49 return head == node ? next : head;
52 int list_length(list_t *node)
55 for (; node; node = node->next)
61 int error(char *fmt, ...)
65 fprintf(stderr, "Error: ");
66 vfprintf(stderr, fmt, ap);
67 fprintf(stderr, "\n");