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