From 54b82706a01049e4ed5e4d417f50f642c701105b Mon Sep 17 00:00:00 2001 From: "@syxhe" Date: Tue, 15 Apr 2025 18:02:06 -0500 Subject: Finish prototype scanning code --- src/ll.c | 68 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 32 deletions(-) (limited to 'src/ll.c') diff --git a/src/ll.c b/src/ll.c index 5e67244..d25818a 100644 --- a/src/ll.c +++ b/src/ll.c @@ -1,6 +1,7 @@ #include "ll.h" #include "shared.h" +#include #include #include #include @@ -32,20 +33,6 @@ dllnode * dllnode_init(void *data, dll_freecb fcb) { return n; } -int dllnode_free(dllnode **n) { - if(!n) - RETURNWERR(EINVAL, 1); - if(!(*n)) - RETURNWERR(EINVAL, 1); - - if((*n)->freecb != NULL) - (*n)->freecb((*n)->data); - free(*n); - *n = NULL; - - return 0; -} - dlinkedlist * dlinkedlist_init(void) { dlinkedlist *ll = xcalloc(1, sizeof(*ll)); ll->end = NULL; @@ -55,21 +42,23 @@ dlinkedlist * dlinkedlist_init(void) { return ll; } -int dlinkedlist_free(dlinkedlist **ll) { +void dlinkedlist_free(dlinkedlist *ll) { if(!ll) - RETURNWERR(EINVAL, 1); - if(!(*ll)) - RETURNWERR(EINVAL, 1); + return; + + for(dllnode *current = ll->start, *next; current != NULL; ) { + next = current->next; - for(dllnode *n; (*ll)->start != NULL;) { - n = (*ll)->start->next; - dllnode_free(&((*ll)->start)); - (*ll)->start = n; + // This used to be a function but was causing issues for some inscrutable reason + if(current->freecb != NULL) + current->freecb(current->data); + free(current); + + current = next; } - free(*ll); - *ll = NULL; + free(ll); - return 0; + return; } int dlinkedlist_size(const dlinkedlist * const ll) { @@ -107,14 +96,14 @@ int dlinkedlist_xxxend(dlinkedlist * const ll, void *data, dll_freecb fcb, char dllnode *n = dllnode_init(data, fcb); switch (op) { case 'a': - n->prev = ll->end; - ll->end->next = n; + n->prev = (ll->end); + (ll->end)->next = n; ll->end = n; break; case 'p': - n->next = ll->start; - ll->start->prev = n; + n->next = (ll->start); + (ll->start)->prev = n; ll->start = n; break; @@ -176,8 +165,8 @@ int dlinkedlist_insert(dlinkedlist * const ll, void *data, dll_freecb fcb, int i if(!current) XALLOC_EXIT(" somehow managed to pull a null node from dlinkedlist_getnode(... , ... , ... , %d)", , (index)); - current->prev->next = new; - new->prev = current->prev; + (current->prev)->next = new; + new->prev = (current->prev); new->next = current; current->prev = new; @@ -206,7 +195,10 @@ int dlinkedlist_remove(dlinkedlist * const ll, int index) { current->next->prev = current->prev; } - dllnode_free(¤t); + if(current->freecb != NULL) + current->freecb(current->data); + free(current); + ll->size--; return 0; @@ -218,4 +210,16 @@ void* dlinkedlist_get(const dlinkedlist * const ll, int index) { return NULL; return n->data; +} + +int dlinkedlist_foreach(dlinkedlist *ll, int (*callback)(void*)) { + if(!ll) + RETURNWERR(EINVAL, -1); + if(!callback) + RETURNWERR(EINVAL, -1); + + for(dllnode *p = ll->start; p != NULL; p = p->next) + callback(p->data); + + return 0; } \ No newline at end of file -- cgit v1.2.3