/* list.c Pedro Flynn - pflynn@microsoftsucks.org */ #include #include "list.h" List* list_create(void (*destroy)(void*)) { List* list; if(!(list = (List*) malloc(sizeof(List)))) return NULL; list->size = 0; list->destroy = destroy; list->head = list->tail = NULL; return list; } void list_destroy(List* list) { void* data; while(LIST_SIZE(list)) if(!list_rem_next(list,NULL,(void**) &data) && list->destroy) list->destroy(data); return; } ListElmt* list_ins_next(List* list,ListElmt* element,const void* data) { ListElmt* newelement; if(!(newelement = (ListElmt*) malloc(sizeof(ListElmt)))) return NULL; newelement->data = (void*) data; if(!element){ if(!LIST_SIZE(list)) list->tail = newelement; newelement->next = list->head; list->head = newelement; }else{ if(!element->next) list->tail = newelement; newelement->next = element->next; element->next = newelement; } list->size++; return newelement; } int list_rem_next(List* list,ListElmt* element,void** data) { ListElmt* oldelement; if(!LIST_SIZE(list)) return -1; if(!element){ *data = list->head->data; oldelement = list->head; list->head = list->head->next; if(LIST_SIZE(list) == 1) list->tail = NULL; }else{ if(!element->next) return -1; *data = element->next->data; oldelement = element->next; element->next = element->next->next; if(!element->next) list->tail = element; } free(oldelement); list->size--; return 0; }