ref: c86384b841687ea975571db934fb0e353ce5b5d4
dir: /ll.c/
#include <u.h>
#include <libc.h>
#include "ll.h"
void
ladd(Linked **ll, void *ptr)
{
Linked *l;
l = mallocz(sizeof(Linked), 1);
l->ptr = ptr;
if (!(*ll)) {
*ll = l;
return;
}
l->next = *ll;
(*ll)->prev = l;
(*ll) = l;
}
void
ldel(Linked **ll, void *ptr, void (*f)(void*))
{
Linked *l = nil;
if (!(*ll))
return;
for (Linked *fl = *ll; fl; fl = fl->next) {
if (fl->ptr == ptr) {
l = fl;
break;
}
}
if (!l)
return;
if (!l->prev) {
*ll = l->next;
if (l->next)
l->next->prev = nil;
} else {
l->prev->next = l->next;
if (l->next)
l->next->prev = l->prev;
}
if (f)
f(l->ptr);
}
void*
lfind(Linked **ll, int (*f)(void*,void*), void *aux)
{
for (Linked *l = *ll; l; l = l->next) {
if (f(l->ptr, aux))
return l->ptr;
}
return nil;
}
void
lforeach(Linked **ll, void (*f)(void*,void*), void *aux)
{
for (Linked *l = *ll; l; l = l->next)
f(l->ptr, aux);
}