X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Flist.c;h=668a5a94e520cbd5b2efe1b2dfe5a15651fb199c;hp=4c90b580e7117b8da3ef4dccc024f00da453a7a8;hb=dac256505e1af78505c9f905bd55c11d4b87345c;hpb=d9ce5a7f3f5eddb193b6a9b5974c7c49eac41ea1 diff --git a/lib/list.c b/lib/list.c index 4c90b580..668a5a94 100644 --- a/lib/list.c +++ b/lib/list.c @@ -17,14 +17,15 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: list.c,v 1.1.2.1 2000/11/15 22:04:48 zarq Exp $ + $Id: list.c,v 1.1.2.5 2000/11/22 22:18:03 guus Exp $ */ #include "config.h" +#include #include +#include -#include #include #include @@ -48,31 +49,25 @@ list_t *list_new(void) Delete the element pointed to by idx from the list. */ -list_node_t *list_delete(list_t *list, list_node_t *idx) +void list_delete(list_t *list, list_node_t *idx) { - list_node_t *res; - - if(!list) - return NULL; - if(!idx) - return NULL; + if(!list || !idx) + return; if(list->callbacks->delete != NULL) if(list->callbacks->delete(idx->data)) - error(ERR_WARNING, N_("List callback[delete] failed for %08lx - freeing anyway"), idx->data); + syslog(LOG_WARNING, _("List callback[delete] failed for %08lx - freeing anyway"), idx->data); free(idx->data); if(idx->prev == NULL) /* First element in list */ { - res = idx->next; list->head = idx->next; } if(idx->next == NULL) /* Last element in list */ { - res = NULL; list->tail = idx->prev; } if(idx->prev != NULL && idx->next != NULL) @@ -86,8 +81,8 @@ list_node_t *list_delete(list_t *list, list_node_t *idx) else if(list->tail == NULL) list->head = NULL; + free(idx); - return res; } /* @@ -98,7 +93,7 @@ list_node_t *list_delete(list_t *list, list_node_t *idx) */ void list_forall_nodes(list_t *list, int (*function)(void *data)) { - list_node_t *p; + list_node_t *p, *next; int res; if(!list) /* no list given */ @@ -107,11 +102,12 @@ void list_forall_nodes(list_t *list, int (*function)(void *data)) return; if(!list->head) /* list is empty */ return; - for(p = list->head; p != NULL; p = p->next) + for(p = list->head; p != NULL; p = next) { + next = p->next; res = function(p->data); if(res != 0) - p = list_delete(list, p); + list_delete(list, p); } } @@ -125,7 +121,7 @@ void list_destroy(list_t *list) { if(!list) return; - list_destroy_nodes(list); +/* list_destroy_nodes(list); */ free(list); } @@ -134,13 +130,14 @@ void list_destroy(list_t *list) Append a new node to the list that points to data. */ -list_append(list_t *list, void *data) +void list_append(list_t *list, void *data) { list_node_t *n; n = xmalloc_and_zero(sizeof(list_node_t)); n->data = data; n->prev = list->tail; - list->tail->next = n; + if(list->tail) + list->tail->next = n; list->tail = n; }