You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.1 KiB
C
99 lines
2.1 KiB
C
/* See the end of this file for copyright and license terms. */
|
|
|
|
#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;
|
|
}
|
|
|
|
/*
|
|
* This file is part of GayBSD.
|
|
* Copyright (c) 2021 fef <owo@fef.moe>.
|
|
*
|
|
* GayBSD is nonviolent software: you may only use, redistribute, and/or
|
|
* modify it under the terms of the Cooperative Nonviolent Public License
|
|
* (CNPL) as found in the LICENSE file in the source code root directory
|
|
* or at <https://git.pixie.town/thufie/npl-builder>; either version 7
|
|
* of the license, or (at your option) any later version.
|
|
*
|
|
* GayBSD comes with ABSOLUTELY NO WARRANTY, to the extent
|
|
* permitted by applicable law. See the CNPL for details.
|
|
*/
|