1/*
2 * Copyright (c) 2007 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#ifdef __STDC__
24#define TQ_DECLARE(n)					\
25struct n##_list {					\
26    struct n *first;					\
27    struct n *last;					\
28};
29#else
30#define TQ_DECLARE(n)					\
31struct n/**/_list {					\
32    struct n *first;					\
33    struct n *last;					\
34};
35#endif
36
37/*
38 * Foreach loops: forward and reverse
39 */
40#undef tq_foreach_fwd
41#define tq_foreach_fwd(h, v)				\
42    for ((v) = (h)->first; (v) != NULL; (v) = (v)->next)
43
44#undef tq_foreach_rev
45#define tq_foreach_rev(h, v)				\
46    for ((v) = (h)->last; (v) != NULL; (v) = (v)->prev)
47
48/*
49 * Init a list head.
50 */
51#undef tq_init
52#define tq_init(h) do {					\
53    (h)->first = NULL;					\
54    (h)->last = NULL;					\
55} while (0)
56
57/*
58 * Simple macros to avoid exposing first/last and prev/next.
59 */
60#undef tq_empty
61#define tq_empty(h)	((h)->first == NULL)
62
63#undef tq_first
64#define tq_first(h)	((h)->first)
65
66#undef tq_last
67#define tq_last(h)	((h)->last)
68
69#undef list_next
70#define list_next(e)	((e)->next)
71
72#undef list_prev
73#define list_prev(e)	((e)->prev)
74
75/*
76 * Prototypes for list.c
77 */
78void *tq_pop		__P((void *));
79void tq_append		__P((void *, void *));
80void tq_remove		__P((void *, void *));
81void list_append	__P((void *, void *));
82void list2tq		__P((void *, void *));
83
84#endif /* _SUDO_LIST_H */
85