ref: eaf9a2c0694335ea7d5139f83b3824f6127fb310
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); }