#ifndef _DBLLISTS_H #define _DBLLISTS_H #define DBL_LIST_HEAD_INIT(name) { &(name), &(name) } #define DBL_LIST_HEAD(name) struct list_head name = DBL_LIST_HEAD_INIT(name) #define DBL_INIT_LIST_HEAD(ptr) \ do { \ (ptr)->pNext = (ptr)->pPrev = (ptr); \ } while (0) #define DBL_LIST_ADD(newi, prev, next) \ do { \ struct list_head *pPrev = prev; \ struct list_head *pNext = next; \ (pNext)->pPrev = newi; \ (newi)->pNext = pNext; \ (newi)->pPrev = pPrev; \ (pPrev)->pNext = newi; \ } while (0) #define DBL_LIST_ADDH(new, head) DBL_LIST_ADD(new, head, (head)->pNext) #define DBL_LIST_ADDT(new, head) DBL_LIST_ADD(new, (head)->pPrev, head) #define DBL_LIST_UNLINK(prev, next) \ do { \ struct list_head *pPrev = prev; \ struct list_head *pNext = next; \ (next)->pPrev = pPrev; \ (prev)->pNext = pNext; \ } while (0) #define DBL_LIST_DEL(entry) \ do { \ DBL_LIST_UNLINK((entry)->pPrev, (entry)->pNext); \ DBL_INIT_LIST_HEAD(entry); \ } while (0) #define DBL_LIST_EMTPY(head) ((head)->pNext == head) #define DBL_LIST_SPLICE(list, head) \ do { \ struct list_head * first = (list)->pNext; \ if (first != list) { \ struct list_head * last = (list)->pPrev; \ struct list_head * at = (head)->pNext; \ (first)->pPrev = head; \ (head)->pNext = first; \ (last)->pNext = at; \ (at)->pPrev = last; \ } \ } while (0) #define DBL_HEAD_COPY(oldh, newh) \ do { \ *(oldh) = (*newh); \ (newh)->pNext->pPrev = (oldh); \ (newh)->pPrev->pNext = (oldh); \ } while (0) #define DBL_ITEM_IN_LIST(ptr) (((ptr)->pPrev != (ptr)) && ((ptr)->pNext != (ptr))) #define DBL_LIST_FIRST(head) (((head)->pNext != (head)) ? (head)->pNext: NULL) #define DBL_LIST_LAST(head) (((head)->pPrev != (head)) ? (head)->pPrev: NULL) #define DBL_LIST_ENTRY(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) #define DBL_LIST_FOR_EACH(pos, head) for (pos = (head)->pNext; pos != (head); pos = (pos)->pNext) #define DBL_END_OF_LIST(pos, head) ((pos) == (head)) #define DBL_LIST_NEXT(pos, head) (((pos)->pNext != (head)) ? (pos)->pNext: NULL) #define DBL_LIST_PREV(pos, head) (((pos)->pPrev != (head)) ? (pos)->pPrev: NULL) struct list_head { struct list_head *pNext; struct list_head *pPrev; }; #endif