diff options
Diffstat (limited to 'src/internal/kitlist.c')
-rw-r--r-- | src/internal/kitlist.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/internal/kitlist.c b/src/internal/kitlist.c new file mode 100644 index 0000000..b6d861c --- /dev/null +++ b/src/internal/kitlist.c @@ -0,0 +1,79 @@ +#include "kitchensink/internal/kitlist.h" + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> + +Kit_List* Kit_CreateList(unsigned int size, Kit_ListFreeCallback free_cb) { + Kit_List *m = calloc(1, sizeof(Kit_List)); + if(m == NULL) { + return NULL; + } + m->size = size; + m->free_cb = free_cb; + m->data = calloc(size, sizeof(void*)); + if(m->data == NULL) { + free(m); + return NULL; + } + return m; +} + +void Kit_DestroyList(Kit_List *list) { + if(list == NULL) return; + Kit_ClearList(list); + free(list->data); + free(list); +} + +void Kit_ClearList(Kit_List *list) { + assert(list != NULL); + for(unsigned int i = 0; i < list->size; i++) { + if(list->data[i] != NULL) { + list->free_cb(list->data[i]); + list->data[i] = NULL; + } + } + list->length = 0; +} + +void Kit_RemoveFromList(Kit_List *list, unsigned int iterator) { + assert(list != NULL); + list->free_cb(list->data[iterator-1]); + list->data[iterator-1] = NULL; + list->length--; +} + +void* Kit_IterateList(const Kit_List *list, unsigned int *iterator) { + assert(list != NULL); + assert(iterator != NULL); + while((*iterator) < list->size) { + void *ptr = list->data[(*iterator)]; + *iterator += 1; + if(ptr != NULL) { + return ptr; + } + } + return NULL; +} + +int Kit_WriteList(Kit_List *list, void *ptr) { + assert(list != NULL); + assert(ptr != NULL); + if(list->length >= list->size) { + return 1; + } + for(unsigned int i = 0; i < list->size; i++) { + if(list->data[i] == NULL) { + list->data[i] = ptr; + list->length++; + return 0; + } + } + return 1; +} + +int Kit_GetListLength(const Kit_List *list) { + assert(list != NULL); + return list->length; +} |