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