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.
84 lines
1.6 KiB
C
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;
|
|
}
|