X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Flist.c;h=8a48360481d2f8f0a3431812d036520ab9311553;hb=9cde0d32cf209388cc59b06b7dcb0c3432f97da5;hp=c74eb2132cf24913f9619c632f1740def270906d;hpb=fb7b6e7a0c966a88a682f656ca1caeb9a0583c5b;p=meshlink diff --git a/src/list.c b/src/list.c index c74eb213..8a483604 100644 --- a/src/list.c +++ b/src/list.c @@ -40,8 +40,9 @@ list_node_t *list_alloc_node(void) { } void list_free_node(list_t *list, list_node_t *node) { - if(node->data && list->delete) + if(node->data && list->delete) { list->delete(node->data); + } free(node); } @@ -56,10 +57,11 @@ list_node_t *list_insert_head(list_t *list, void *data) { node->next = list->head; list->head = node; - if(node->next) + if(node->next) { node->next->prev = node; - else + } else { list->tail = node; + } list->count++; @@ -74,10 +76,11 @@ list_node_t *list_insert_tail(list_t *list, void *data) { node->prev = list->tail; list->tail = node; - if(node->prev) + if(node->prev) { node->prev->next = node; - else + } else { list->head = node; + } list->count++; @@ -92,10 +95,11 @@ list_node_t *list_insert_after(list_t *list, list_node_t *after, void *data) { node->prev = after; after->next = node; - if(node->next) + if(node->next) { node->next->prev = node; - else + } else { list->tail = node; + } list->count++; @@ -112,10 +116,11 @@ list_node_t *list_insert_before(list_t *list, list_node_t *before, void *data) { node->prev = before->prev; before->prev = node; - if(node->prev) + if(node->prev) { node->prev->next = node; - else + } else { list->head = node; + } list->count++; @@ -123,15 +128,17 @@ list_node_t *list_insert_before(list_t *list, list_node_t *before, void *data) { } void list_unlink_node(list_t *list, list_node_t *node) { - if(node->prev) + if(node->prev) { node->prev->next = node->next; - else + } else { list->head = node->next; + } - if(node->next) + if(node->next) { node->next->prev = node->prev; - else + } else { list->tail = node->prev; + } list->count--; } @@ -151,31 +158,38 @@ void list_delete_tail(list_t *list) { void list_delete(list_t *list, const void *data) { for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) - if(node->data == data) + if(node->data == data) { list_delete_node(list, node); + } } /* Head/tail lookup */ void *list_get_head(list_t *list) { - if(list->head) + if(list->head) { return list->head->data; - else + } else { return NULL; + } } void *list_get_tail(list_t *list) { - if(list->tail) + if(list->tail) { return list->tail->data; - else + } else { return NULL; + } } /* Fast list deletion */ void list_delete_list(list_t *list) { - for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) + for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) { list_free_node(list, node); + list->count--; + } + + assert(!list->count); list_free(list); } @@ -183,12 +197,14 @@ void list_delete_list(list_t *list) { /* Traversing */ void list_foreach_node(list_t *list, list_action_node_t action) { - for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) + for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) { action(node); + } } void list_foreach(list_t *list, list_action_t action) { for(list_node_t *node = list->head, *next; next = node ? node->next : NULL, node; node = next) - if(node->data) + if(node->data) { action(node->data); + } }