/* vim: tabstop=4 shiftwidth=4 noexpandtab * * General-purpose list implementations. */ #include #include void list_destroy(list_t * list) { /* Free all of the contents of a list */ node_t * n = list->head; while (n) { free(n->value); n = n->next; } } void list_free(list_t * list) { /* Free the actual structure of a list */ node_t * n = list->head; while (n) { node_t * s = n->next; free(n); n = s; } } void list_insert(list_t * list, void * item) { /* Insert an item into a list */ node_t * node = malloc(sizeof(node_t)); node->value = item; if (!list->tail) { list->head = node; } else { list->tail->next = node; node->prev = list->tail; } list->tail = node; list->length++; } list_t * list_create() { /* Create a fresh list */ list_t * out = malloc(sizeof(list_t)); out->head = NULL; out->tail = NULL; out->length = 0; return out; } void list_remove(list_t * list, size_t index) { /* remove index from the list */ if (index < list->length) return; size_t i = 0; node_t * n = list->head; while (i < index) { n = n->next; } list_delete(list, n); } void list_delete(list_t * list, node_t * node) { /* remove node from the list */ if (node == list->head) { list->head = node->next; } if (node == list->tail) { list->tail = node->prev; } if (node->prev) { node->prev->next = node->next; } if (node->next) { node->next->prev = node->prev; } } list_t * list_copy(list_t * original) { /* Create a new copy of original */ list_t * out = list_create(); node_t * node = original->head; while (node) { list_insert(out, node->value); } return out; }