X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=list.c;h=d9612b80b12095a33a406bea9903ecacfc73b868;hb=refs%2Fheads%2Fproxy-state;hp=2b8f34adaeb07da71d6930c5e53dd16cf1697976;hpb=6515ce3d742c1273484a52833b157477575fdd99;p=libradsec.git diff --git a/list.c b/list.c index 2b8f34a..d9612b8 100644 --- a/list.c +++ b/list.c @@ -1,7 +1,28 @@ +/* Copyright (c) 2007-2009, UNINETT AS */ +/* See LICENSE for licensing information. */ + #include #include #include "list.h" +/* Private helper functions. */ +static void list_free_helper_(struct list *list, int free_data_flag) { + struct list_node *node, *next; + + if (!list) + return; + + for (node = list->first; node; node = next) { + if (free_data_flag) + free(node->data); + next = node->next; + free(node); + } + free(list); +} + +/* Public functions. */ + /* allocates and initialises list structure; returns NULL if malloc fails */ struct list *list_create() { struct list *list = malloc(sizeof(struct list)); @@ -10,19 +31,18 @@ struct list *list_create() { return list; } -/* frees all memory associated with the list */ +/* frees all memory associated with the list + note that the data pointed at from each node is also freed + use list_free() to free only the memory used by the list itself */ void list_destroy(struct list *list) { - struct list_node *node, *next; + list_free_helper_(list, 1); +} - if (!list) - return; - - for (node = list->first; node; node = next) { - free(node->data); - next = node->next; - free(node); - } - free(list); +/* frees the meory used by the list itself + note that the data pointed at from each node is not freed + use list_destroy() to free all the data associated with the list */ +void list_free(struct list *list) { + list_free_helper_(list, 0); } /* appends entry to list; returns 1 if ok, 0 if malloc fails */ @@ -32,7 +52,7 @@ int list_push(struct list *list, void *data) { node = malloc(sizeof(struct list_node)); if (!node) return 0; - + node->next = NULL; node->data = data; @@ -41,7 +61,8 @@ int list_push(struct list *list, void *data) { else list->first = node; list->last = node; - + + list->count++; return 1; } @@ -49,43 +70,48 @@ int list_push(struct list *list, void *data) { void *list_shift(struct list *list) { struct list_node *node; void *data; - - if (!list->first) + + if (!list || !list->first) return NULL; - + node = list->first; list->first = node->next; if (!list->first) list->last = NULL; data = node->data; free(node); - + list->count--; return data; } -/* removes first entry with matching data pointer */ +/* removes all entries with matching data pointer */ void list_removedata(struct list *list, void *data) { struct list_node *node, *t; - - if (!list->first) + + if (!list || !list->first) return; node = list->first; - if (node->data == data) { + while (node->data == data) { list->first = node->next; - if (!list->first) - list->last = NULL; free(node); - return; + list->count--; + node = list->first; + if (!node) { + list->last = NULL; + return; + } } for (; node->next; node = node->next) if (node->next->data == data) { t = node->next; - node->next = node->next->next; - if (!node->next) /* we removed the last one */ - list->last = node; + node->next = t->next; free(t); - return; + list->count--; + if (!node->next) { /* we removed the last one */ + list->last = node; + return; + } } } @@ -98,3 +124,12 @@ struct list_node *list_first(struct list *list) { struct list_node *list_next(struct list_node *node) { return node->next; } + +/* returns number of nodes */ +uint32_t list_count(struct list *list) { + return list->count; +} + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */