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