shithub: ircd

ref: eaf9a2c0694335ea7d5139f83b3824f6127fb310
dir: /ll.c/

View raw version
#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);
}