diff -r 1fdbf4170ef4 -r b8bf95b39952 src/server/util/list.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server/util/list.c Sat Jan 14 13:53:44 2012 +0100 @@ -0,0 +1,175 @@ +/* + * File: list.c + * Author: olaf + * + * Created on 18. Dezember 2010, 11:23 + */ + +#include +#include + +#include "list.h" + +/* add functions */ +sdlist_t* sdlist_add(sdlist_t *list, void *data) { + sdlist_t *elm = malloc(sizeof(sdlist_t)); + elm->data = data; + elm->next = NULL; + + return sdlist_addl(list, elm); +} + +sdlist_t* sdlist_addl(sdlist_t *list, sdlist_t *l) { + if (list != NULL) { + sdlist_t *end = sdlist_getlast(list); + end->next = l; + return list; + } else { + return l; + } +} + + + +/* remove functions */ +sdlist_t* sdlist_remove(sdlist_t *list, void *data) { + sdlist_t *s = list; + + sdlist_t *prev = NULL; + while (list != NULL) { + if (list->data == data) { + sdlist_t *nl = sdlist_remove_elm(s, prev, list); + free(list); + return nl; + } + + prev = list; + list = list->next; + } + + return s; +} + +sdlist_t* sdlist_removei(sdlist_t *list, int index) { + sdlist_t *s = list; + + sdlist_t *prev = NULL; + int i = 0; + while (list != NULL) { + if (i == index) { + sdlist_t *nl = sdlist_remove_elm(s, prev, list); + free(list); + return nl; + } + + prev = list; + list = list->next; + i++; + } + + return s; +} + +sdlist_t* sdlist_removel(sdlist_t *list, sdlist_t *l) { + sdlist_t *s = list; + + sdlist_t *prev = NULL; + while (list != NULL) { + if (list == l) { + return sdlist_remove_elm(s, prev, list); + } + + prev = list; + list = list->next; + } + + return s; +} + + +sdlist_t *sdlist_remove_elm(sdlist_t *list, sdlist_t *prev, sdlist_t *elm) { + if (elm == NULL) { + return list; + } + + if (prev == NULL) { + return elm->next; + } + + prev->next = elm->next; + + return list; +} + + + +/* insert functions */ +void sdlist_insert(sdlist_t *elm, void *data) { + sdlist_t *newelm = malloc(sizeof(sdlist_t)); + newelm->data = data; + sdlist_insertl(elm, newelm); +} + +void sdlist_insertl(sdlist_t *elm, sdlist_t *l) { + if (elm == NULL || l == NULL) { + return; + } + + l->next = elm->next; + elm->next = l; +} + + +/* get functions */ +sdlist_t* sdlist_get(sdlist_t *list, void *data) { + while (list != NULL) { + if (list->data == data) { + return list; + } + list = list->next; + } + return NULL; +} + +sdlist_t* sdlist_geti(sdlist_t *list, int index) { + for (int i=0;inext; + } + return list; +} + +sdlist_t* sdlist_getlast(sdlist_t *list) { + while(list->next != NULL) { + list = list->next; + } + return list; +} + + + +/* miscellaneous functions */ +size_t sdlist_length(sdlist_t *list) { + int i = 0; + while(list->next != NULL) { + list = list->next; + i++; + } + return i; +} + +void sdlist_free(sdlist_t *elm) { + free(elm); +} + +void sdlist_foreach(sdlist_t *list, sdlist_iterator_func f, void *data) { + while(list != NULL) { + int r = f(list, data); + if (r) { + return; + } + list = list->next; + } +}