00001
00012 #ifndef LIST_H
00013 #define LIST_H
00014
00015
00016
00018 #define LIST_ENTRY(type) struct { type *_next, **_prev; }
00019
00021 #define LIST_HEAD(headname, type) headname { type *_head; }
00022
00024 #define LIST_INIT(head) ((head)->_head=NULL)
00025
00027 #define LIST_ENTRY_INIT(elm, name) do { (elm)->name._next=NULL; (elm)->name._prev=NULL; } while(0)
00028
00030 #define LIST_TOP(head) ((head)._head)
00031
00033 #define LIST_NEXT(elm, name) ((elm)->name._next)
00034
00036 #define LIST_PREVPTR(elm, name) ((elm)->name._prev)
00037
00039 #define LIST_INSERT_ATPTR(prevptr, elm, name) do { \
00040 (elm)->name._prev=(prevptr); \
00041 if(((elm)->name._next=*(prevptr))!=NULL) \
00042 (elm)->name._next->name._prev=&(elm)->name._next; \
00043 *(prevptr)=(elm); \
00044 } while(0)
00045
00047 #define LIST_INSERT_AFTER(where, elm, name) do { \
00048 assert(where != NULL && elm != NULL); \
00049 (elm)->name._prev=&(where)->name._next; \
00050 if(((elm)->name._next=(where)->name._next)!=NULL) \
00051 (where)->name._next->name._prev=&(elm)->name._next; \
00052 *(elm)->name._prev=(elm); \
00053 } while(0)
00054
00056 #define LIST_INSERT_HEAD(head, elm, name) do { \
00057 assert(head != NULL && elm != NULL); \
00058 (elm)->name._prev=&(head)->_head; \
00059 if(((elm)->name._next=(head)->_head)!=NULL) \
00060 (head)->_head->name._prev=&(elm)->name._next; \
00061 (head)->_head=(elm); \
00062 } while(0)
00063
00065 #define LIST_REMOVE(elm, name) do { \
00066 assert(elm != NULL); \
00067 if((elm)->name._next!=NULL) \
00068 (elm)->name._next->name._prev=(elm)->name._prev; \
00069 if((elm)->name._prev) \
00070 *(elm)->name._prev=(elm)->name._next; \
00071 } while(0)
00072
00074 #define LIST_TAIL_ADD(tailptr, elm, name) do { \
00075 assert(tailptr != NULL && elm != NULL); \
00076 (elm)->name._prev=(tailptr); \
00077 *(tailptr)=(elm); \
00078 (tailptr)=&(elm)->name._next; \
00079 } while(0)
00080
00082 #define LIST_TAIL_INIT(head, tailptr) (tailptr)=&LIST_TOP(head)
00083
00084
00085 #endif