/* See the end of this file for copyright and license terms. */ #include #include #include 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 . * * 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 ; 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. */