]> Pileus Git - wmpus/blob - util.c
Fix list_insert
[wmpus] / util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4
5 #include "util.h"
6
7 list_t *list_insert(list_t *next, void *data)
8 {
9         list_t *node = new0(list_t);
10         node->data = data;
11         node->next = next;
12         node->prev = next ? next->prev : NULL;
13         if (node->next) node->next->prev = node;
14         if (node->prev) node->prev->next = node;
15         return node;
16 }
17
18 list_t *list_append(list_t *head, void *data)
19 {
20         list_t *last = head;
21         while (last->next)
22                 last = last->next;
23         list_t *node = new0(list_t);
24         node->data = data;
25         node->prev = last;
26         if (last) last->next = node;
27         return last ? head : node;
28 }
29
30 list_t *list_remove(list_t *head, list_t *node)
31 {
32         list_t *next = node->next;
33         list_t *prev = node->prev;
34         if (next) next->prev = prev;
35         if (prev) prev->next = next;
36         free(node);
37         return head == node ? next : head;
38 }
39
40 int list_length(list_t *node)
41 {
42         int len = 0;
43         for (; node; node = node->next)
44                 len++;
45         return len;
46 }
47
48 void list_move(list_t *node, int offset)
49 {
50 }
51
52 /* Misc */
53 int error(char *fmt, ...)
54 {
55         va_list ap;
56         va_start(ap, fmt);
57         fprintf(stderr, "Error: ");
58         vfprintf(stderr, fmt, ap);
59         fprintf(stderr, "\n");
60         va_end(ap);
61         exit(1);
62         return 0;
63 }