/* libcr_ipc/_linkedlist.c - Common low-level linked lists for use in libcr_ipc * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include /* for NULL */ #include "_linkedlist.h" /* singly linked list *********************************************************/ void cr_ipc_sll_push_to_rear(_cr_ipc_sll_root *root, cr_ipc_sll_node *node) { assert(root); node->rear = NULL; if (root->rear) root->rear->rear = node; else root->front = node; root->rear = node; } void cr_ipc_sll_pop_from_front(_cr_ipc_sll_root *root) { assert(root); assert(root->front); root->front = root->front->rear; if (!root->front) root->rear = NULL; } /* doubly linked list *********************************************************/ void cr_ipc_dll_push_to_rear(_cr_ipc_dll_root *root, cr_ipc_dll_node *node) { assert(root); assert(node); node->front = root->rear; node->rear = NULL; if (root->rear) root->rear->rear = node; else root->front = node; root->rear = node; } void cr_ipc_dll_remove(_cr_ipc_dll_root *root, cr_ipc_dll_node *node) { assert(root); assert(node); if (node->front) node->front->rear = node->rear; else root->front = node->rear; if (node->rear) node->rear->front = node->front; else root->rear = node->front; } void cr_ipc_dll_pop_from_front(_cr_ipc_dll_root *root) { assert(root); assert(root->front); cr_ipc_dll_remove(root, root->front); }