update changelog
[debian/sudo] / include / list.h
1 /*
2  * Copyright (c) 2007, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #ifndef _SUDO_LIST_H
18 #define _SUDO_LIST_H
19
20 /*
21  * Convenience macro for declaring a list head.
22  */
23 #define TQ_DECLARE(n)                                   \
24 struct n##_list {                                       \
25     struct n *first;                                    \
26     struct n *last;                                     \
27 };
28
29 /*
30  * Foreach loops: forward and reverse
31  */
32 #undef tq_foreach_fwd
33 #define tq_foreach_fwd(h, v)                            \
34     for ((v) = (h)->first; (v) != NULL; (v) = (v)->next)
35
36 #undef tq_foreach_rev
37 #define tq_foreach_rev(h, v)                            \
38     for ((v) = (h)->last; (v) != NULL; (v) = (v)->prev)
39
40 /*
41  * Init a list head.
42  */
43 #undef tq_init
44 #define tq_init(h) do {                                 \
45     (h)->first = NULL;                                  \
46     (h)->last = NULL;                                   \
47 } while (0)
48
49 /*
50  * Simple macros to avoid exposing first/last and prev/next.
51  */
52 #undef tq_empty
53 #define tq_empty(h)     ((h)->first == NULL)
54
55 #undef tq_first
56 #define tq_first(h)     ((h)->first)
57
58 #undef tq_last
59 #define tq_last(h)      ((h)->last)
60
61 #undef list_next
62 #define list_next(e)    ((e)->next)
63
64 #undef list_prev
65 #define list_prev(e)    ((e)->prev)
66
67 /*
68  * Prototypes for list.c
69  */
70 void *tq_pop(void *);
71 void tq_append(void *, void *);
72 void tq_remove(void *, void *);
73 void list_append(void *, void *);
74 void list2tq(void *, void *);
75
76 #endif /* _SUDO_LIST_H */