diff options
Diffstat (limited to 'include/ulogd/slist.h')
-rw-r--r-- | include/ulogd/slist.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/include/ulogd/slist.h b/include/ulogd/slist.h new file mode 100644 index 0000000..3159056 --- /dev/null +++ b/include/ulogd/slist.h @@ -0,0 +1,40 @@ +#ifndef _SLIST_H_ +#define _SLIST_H_ + +#include "linuxlist.h" + +#define INIT_SLIST_HEAD(ptr) ((ptr).next = NULL) + +struct slist_head { + struct slist_head *next; +}; + +static inline int slist_empty(const struct slist_head *h) +{ + return !h->next; +} + +static inline void slist_del(struct slist_head *t, struct slist_head *prev) +{ + prev->next = t->next; +} + +static inline void slist_add(struct slist_head *head, struct slist_head *t) +{ + struct slist_head *tmp = head->next; + head->next = t; + t->next = tmp; +} + +#define slist_entry(ptr, type, member) container_of(ptr,type,member) + +#define slist_for_each(pos, head) \ + for (pos = (head)->next; pos; \ + pos = pos->next) + +#define slist_for_each_safe(pos, prev, next, head) \ + for (pos = (head)->next, prev = (head); \ + pos && ({ next = pos->next; 1; }); \ + ({ prev = (prev->next != next) ? prev->next : prev; }), pos = next) + +#endif |