1/*
2 * This file is not copyrighted.
3 */
4
5#ifndef _WSBM_UTIL_H_
6#define _WSBM_UTIL_H_
7
8#include <stddef.h>
9
10#ifndef containerOf
11#define containerOf(__item, __type, __field)				\
12      ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
13#endif
14
15struct _WsbmListHead
16{
17    struct _WsbmListHead *prev;
18    struct _WsbmListHead *next;
19};
20
21#define WSBMINITLISTHEAD(__item)		       \
22    do{						       \
23	(__item)->prev = (__item);		       \
24	(__item)->next = (__item);		       \
25    } while (0)
26
27#define WSBMLISTADD(__item, __list)		\
28  do {						\
29    (__item)->prev = (__list);			\
30    (__item)->next = (__list)->next;		\
31    (__list)->next->prev = (__item);		\
32    (__list)->next = (__item);			\
33  } while (0)
34
35#define WSBMLISTADDTAIL(__item, __list)		\
36  do {						\
37    (__item)->next = (__list);			\
38    (__item)->prev = (__list)->prev;		\
39    (__list)->prev->next = (__item);		\
40    (__list)->prev = (__item);			\
41  } while(0)
42
43#define WSBMLISTDEL(__item)			\
44  do {						\
45    (__item)->prev->next = (__item)->next;	\
46    (__item)->next->prev = (__item)->prev;	\
47  } while(0)
48
49#define WSBMLISTDELINIT(__item)			\
50  do {						\
51    (__item)->prev->next = (__item)->next;	\
52    (__item)->next->prev = (__item)->prev;	\
53    (__item)->next = (__item);			\
54    (__item)->prev = (__item);			\
55  } while(0)
56
57#define WSBMLISTFOREACH(__item, __list) \
58    for((__item) = (__list)->next; (__item) != (__list); (__item) = (__item)->next)
59
60#define WSBMLISTFOREACHPREV(__item, __list) \
61    for((__item) = (__list)->prev; (__item) != (__list); (__item) = (__item)->prev)
62
63#define WSBMLISTFOREACHSAFE(__item, __next, __list)		\
64        for((__item) = (__list)->next, (__next) = (__item)->next;	\
65	(__item) != (__list);					\
66	(__item) = (__next), (__next) = (__item)->next)
67
68#define WSBMLISTFOREACHPREVSAFE(__item, __prev, __list)		\
69    for((__item) = (__list)->prev, (__prev) = (__item->prev);	\
70	(__item) != (__list);					\
71	(__item) = (__prev), (__prev) = (__item)->prev)
72
73#define WSBMLISTENTRY(__item, __type, __field)			\
74  containerOf(__item, __type, __field)
75
76#endif
77