1 #include "auvirt-list.h"
4 list_t *list_init(list_t *list, list_free_data_fn *free_data_fn)
8 list->head = list->tail = NULL;
9 list->free_data_fn = free_data_fn;
13 list_t *list_new(list_free_data_fn *free_data_fn)
15 return list_init(malloc(sizeof(list_t)), free_data_fn);
18 void list_free_node(list_node_t *node, list_free_data_fn *free_data_fn)
22 free_data_fn(node->data);
27 void list_free_(list_t *list, list_free_data_fn *free_data_fn)
30 list_node_t *it = list->head;
31 while (it && it->next) {
33 list_free_node(it->prev, free_data_fn);
35 list_free_node(it, free_data_fn);
40 void list_free(list_t *list)
43 list_free_(list, list->free_data_fn);
46 list_node_t *list_insert_after(list_t *list, list_node_t *it,
49 list_node_t *node = NULL;
54 node = malloc(sizeof(list_node_t));
59 /* insert the new node after it */
62 node->next = it->next;
66 node->next = list->head;
68 node->next->prev = node;
70 /* update list's head and tail */
79 list_node_t *list_append(list_t *list, void *data)
81 return list_insert_after(list, list->tail, data);
84 int list_remove_(list_t *list, list_node_t *it,
85 list_free_data_fn *free_data_fn)
87 if (list == NULL || it == NULL)
90 list->head = it->next;
92 list->tail = it->prev;
94 it->next->prev = it->prev;
96 it->prev->next = it->next;
97 list_free_node(it, free_data_fn);
101 int list_remove(list_t *list, list_node_t *it)
103 return list_remove_(list, it, list->free_data_fn);