kern/kernel/clist.c
fef 5a5135f416
update license terms
As of now, everything except the code imported
from FreeBSD is proprietary.  Of course, it won't
be like this for long, only until we have decided
which license we like to use.  The rationale is
that releasing everything under a copyleft license
later is always easier than doing so immediately
and then changing it afterwards.
Naturally, any changes made before this commit are
still subject to the terms of the CNPL.
2021-11-15 19:23:22 +01:00

84 lines
1.6 KiB
C

/* Copyright (C) 2021 fef <owo@fef.moe>. All rights reserved. */
#include <gay/clist.h>
#include <gay/config.h>
#include <gay/kprintf.h>
void clist_init(struct clist *head)
{
# if CFG_DEBUG_CLIST
if (head->next == head && head->prev == head)
kprintf("clist_init(%p) called multiple times\n", head);
# endif
head->next = head;
head->prev = head;
}
void clist_add(struct clist *head, struct clist *new)
{
# if CFG_DEBUG_CLIST
if (sus_nil(head->next) || sus_nil(head->prev)) {
kprintf("clist_add(%p, %p): head seems uninitialized\n", head, new);
return;
}
if (sus_nil(new)) {
kprintf("clist_add(%p, %p): new node is NULL!\n", head, new);
return;
}
# endif
head->prev->next = new;
new->next = head;
new->prev = head->prev;
head->prev = new;
}
void clist_add_first(struct clist *head, struct clist *new)
{
head->next->prev = new;
new->next = head->next;
new->prev = head;
head->next = new;
}
void clist_del(struct clist *node)
{
node->next->prev = node->prev;
node->prev->next = node->next;
# if CFG_DEBUG_CLIST
node->next = nil;
node->prev = nil;
# endif
}
struct clist *clist_del_first(struct clist *head)
{
# if CFG_DEBUG_CLIST
if (clist_is_empty(head)) {
kprintf("clist_del_first(%p): empty list!\n", head);
return nil;
}
# endif
struct clist *first = head->next;
clist_del(first);
return first;
}
struct clist *clist_del_last(struct clist *head)
{
# ifdef CFG_DEBUG_CLIST
if (clist_is_empty(head)) {
kprintf("clist_del_last(%p): empty list!\n", head);
return nil;
}
# endif
struct clist *last = head->prev;
clist_del(last);
return last;
}