1 /* 2 * iter.h 3 * Linked lists and iterators. 4 * 5 * SPDX-License-Identifier: pkgconf 6 * 7 * Copyright (c) 2013 pkgconf authors (see AUTHORS). 8 * 9 * Permission to use, copy, modify, and/or distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * This software is provided 'as is' and without any warranty, express or 14 * implied. In no event shall the authors be liable for any damages arising 15 * from the use of this software. 16 */ 17 18 #ifndef LIBPKGCONF_ITER_H 19 #define LIBPKGCONF_ITER_H 20 21 #include <stddef.h> 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 typedef struct pkgconf_node_ pkgconf_node_t; 28 29 struct pkgconf_node_ { 30 pkgconf_node_t *prev, *next; 31 void *data; 32 }; 33 34 typedef struct { 35 pkgconf_node_t *head, *tail; 36 size_t length; 37 } pkgconf_list_t; 38 39 #define PKGCONF_LIST_INITIALIZER { NULL, NULL, 0 } 40 41 static inline void 42 pkgconf_list_zero(pkgconf_list_t *list) 43 { 44 list->head = NULL; 45 list->tail = NULL; 46 list->length = 0; 47 } 48 49 static inline void 50 pkgconf_node_insert(pkgconf_node_t *node, void *data, pkgconf_list_t *list) 51 { 52 pkgconf_node_t *tnode; 53 54 node->data = data; 55 56 if (list->head == NULL) 57 { 58 list->head = node; 59 list->tail = node; 60 list->length = 1; 61 return; 62 } 63 64 tnode = list->head; 65 66 node->next = tnode; 67 tnode->prev = node; 68 69 list->head = node; 70 list->length++; 71 } 72 73 static inline void 74 pkgconf_node_insert_tail(pkgconf_node_t *node, void *data, pkgconf_list_t *list) 75 { 76 pkgconf_node_t *tnode; 77 78 node->data = data; 79 80 if (list->tail == NULL) 81 { 82 list->head = node; 83 list->tail = node; 84 list->length = 1; 85 return; 86 } 87 88 tnode = list->tail; 89 90 node->prev = tnode; 91 tnode->next = node; 92 93 list->tail = node; 94 list->length++; 95 } 96 97 static inline void 98 pkgconf_node_delete(pkgconf_node_t *node, pkgconf_list_t *list) 99 { 100 list->length--; 101 102 if (node->prev == NULL) 103 list->head = node->next; 104 else 105 node->prev->next = node->next; 106 107 if (node->next == NULL) 108 list->tail = node->prev; 109 else 110 node->next->prev = node->prev; 111 } 112 113 #ifdef __cplusplus 114 } 115 #endif 116 117 #endif 118