1
2#ifndef _DBLLISTS_H
3#define _DBLLISTS_H
4
5
6
7#define DBL_LIST_HEAD_INIT(name)        { &(name), &(name) }
8
9#define DBL_LIST_HEAD(name)             struct list_head name = DBL_LIST_HEAD_INIT(name)
10
11#define DBL_INIT_LIST_HEAD(ptr) \
12do { \
13    (ptr)->pNext = (ptr)->pPrev = (ptr); \
14} while (0)
15
16#define DBL_LIST_ADD(newi, prev, next) \
17do { \
18    struct list_head *pPrev = prev; \
19    struct list_head *pNext = next; \
20    (pNext)->pPrev = newi; \
21    (newi)->pNext = pNext; \
22    (newi)->pPrev = pPrev; \
23    (pPrev)->pNext = newi; \
24} while (0)
25
26#define DBL_LIST_ADDH(new, head)        DBL_LIST_ADD(new, head, (head)->pNext)
27
28#define DBL_LIST_ADDT(new, head)        DBL_LIST_ADD(new, (head)->pPrev, head)
29
30#define DBL_LIST_UNLINK(prev, next) \
31do { \
32    struct list_head *pPrev = prev; \
33    struct list_head *pNext = next; \
34    (next)->pPrev = pPrev; \
35    (prev)->pNext = pNext; \
36} while (0)
37
38#define DBL_LIST_DEL(entry) \
39do { \
40    DBL_LIST_UNLINK((entry)->pPrev, (entry)->pNext); \
41    DBL_INIT_LIST_HEAD(entry); \
42} while (0)
43
44#define DBL_LIST_EMTPY(head)            ((head)->pNext == head)
45
46#define DBL_LIST_SPLICE(list, head) \
47do { \
48    struct list_head *    first = (list)->pNext; \
49    if (first != list) { \
50        struct list_head *	last = (list)->pPrev; \
51        struct list_head *	at = (head)->pNext; \
52        (first)->pPrev = head; \
53        (head)->pNext = first; \
54        (last)->pNext = at; \
55        (at)->pPrev = last; \
56    } \
57} while (0)
58
59#define DBL_HEAD_COPY(oldh, newh) \
60do { \
61    *(oldh) = (*newh); \
62    (newh)->pNext->pPrev = (oldh); \
63    (newh)->pPrev->pNext = (oldh); \
64} while (0)
65
66#define DBL_ITEM_IN_LIST(ptr)           (((ptr)->pPrev != (ptr)) && ((ptr)->pNext != (ptr)))
67
68#define DBL_LIST_FIRST(head)            (((head)->pNext != (head)) ? (head)->pNext: NULL)
69
70#define DBL_LIST_LAST(head)             (((head)->pPrev != (head)) ? (head)->pPrev: NULL)
71
72#define DBL_LIST_ENTRY(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
73
74#define DBL_LIST_FOR_EACH(pos, head)    for (pos = (head)->pNext; pos != (head); pos = (pos)->pNext)
75
76#define DBL_END_OF_LIST(pos, head)      ((pos) == (head))
77
78#define DBL_LIST_NEXT(pos, head)        (((pos)->pNext != (head)) ? (pos)->pNext: NULL)
79
80#define DBL_LIST_PREV(pos, head)        (((pos)->pPrev != (head)) ? (pos)->pPrev: NULL)
81
82
83
84
85
86
87
88struct list_head
89{
90    struct list_head *pNext;
91    struct list_head *pPrev;
92};
93
94
95
96
97
98#endif
99