13bfa90b6Smrg/*
23bfa90b6Smrg * This file is not copyrighted.
33bfa90b6Smrg */
43bfa90b6Smrg
53bfa90b6Smrg#ifndef _WSBM_UTIL_H_
63bfa90b6Smrg#define _WSBM_UTIL_H_
73bfa90b6Smrg
83bfa90b6Smrg#include <stddef.h>
93bfa90b6Smrg
103bfa90b6Smrg#ifndef containerOf
113bfa90b6Smrg#define containerOf(__item, __type, __field)				\
123bfa90b6Smrg      ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
133bfa90b6Smrg#endif
143bfa90b6Smrg
153bfa90b6Smrgstruct _WsbmListHead
163bfa90b6Smrg{
173bfa90b6Smrg    struct _WsbmListHead *prev;
183bfa90b6Smrg    struct _WsbmListHead *next;
193bfa90b6Smrg};
203bfa90b6Smrg
213bfa90b6Smrg#define WSBMINITLISTHEAD(__item)		       \
223bfa90b6Smrg    do{						       \
233bfa90b6Smrg	(__item)->prev = (__item);		       \
243bfa90b6Smrg	(__item)->next = (__item);		       \
253bfa90b6Smrg    } while (0)
263bfa90b6Smrg
273bfa90b6Smrg#define WSBMLISTADD(__item, __list)		\
283bfa90b6Smrg  do {						\
293bfa90b6Smrg    (__item)->prev = (__list);			\
303bfa90b6Smrg    (__item)->next = (__list)->next;		\
313bfa90b6Smrg    (__list)->next->prev = (__item);		\
323bfa90b6Smrg    (__list)->next = (__item);			\
333bfa90b6Smrg  } while (0)
343bfa90b6Smrg
353bfa90b6Smrg#define WSBMLISTADDTAIL(__item, __list)		\
363bfa90b6Smrg  do {						\
373bfa90b6Smrg    (__item)->next = (__list);			\
383bfa90b6Smrg    (__item)->prev = (__list)->prev;		\
393bfa90b6Smrg    (__list)->prev->next = (__item);		\
403bfa90b6Smrg    (__list)->prev = (__item);			\
413bfa90b6Smrg  } while(0)
423bfa90b6Smrg
433bfa90b6Smrg#define WSBMLISTDEL(__item)			\
443bfa90b6Smrg  do {						\
453bfa90b6Smrg    (__item)->prev->next = (__item)->next;	\
463bfa90b6Smrg    (__item)->next->prev = (__item)->prev;	\
473bfa90b6Smrg  } while(0)
483bfa90b6Smrg
493bfa90b6Smrg#define WSBMLISTDELINIT(__item)			\
503bfa90b6Smrg  do {						\
513bfa90b6Smrg    (__item)->prev->next = (__item)->next;	\
523bfa90b6Smrg    (__item)->next->prev = (__item)->prev;	\
533bfa90b6Smrg    (__item)->next = (__item);			\
543bfa90b6Smrg    (__item)->prev = (__item);			\
553bfa90b6Smrg  } while(0)
563bfa90b6Smrg
573bfa90b6Smrg#define WSBMLISTFOREACH(__item, __list) \
583bfa90b6Smrg    for((__item) = (__list)->next; (__item) != (__list); (__item) = (__item)->next)
593bfa90b6Smrg
603bfa90b6Smrg#define WSBMLISTFOREACHPREV(__item, __list) \
613bfa90b6Smrg    for((__item) = (__list)->prev; (__item) != (__list); (__item) = (__item)->prev)
623bfa90b6Smrg
633bfa90b6Smrg#define WSBMLISTFOREACHSAFE(__item, __next, __list)		\
643bfa90b6Smrg        for((__item) = (__list)->next, (__next) = (__item)->next;	\
653bfa90b6Smrg	(__item) != (__list);					\
663bfa90b6Smrg	(__item) = (__next), (__next) = (__item)->next)
673bfa90b6Smrg
683bfa90b6Smrg#define WSBMLISTFOREACHPREVSAFE(__item, __prev, __list)		\
693bfa90b6Smrg    for((__item) = (__list)->prev, (__prev) = (__item->prev);	\
703bfa90b6Smrg	(__item) != (__list);					\
713bfa90b6Smrg	(__item) = (__prev), (__prev) = (__item)->prev)
723bfa90b6Smrg
733bfa90b6Smrg#define WSBMLISTENTRY(__item, __type, __field)			\
743bfa90b6Smrg    containerOf(__item, __type, __field)
753bfa90b6Smrg
763bfa90b6Smrg#define WSBMLISTEMPTY(__item)			\
773bfa90b6Smrg    ((__item)->next == (__item))
783bfa90b6Smrg
793bfa90b6Smrg#endif
80