/* Calisto (c) 1998-1999 Peter Howkins, Matthew Howkins, Simon Howkins $Id: dllist.h,v 1.1 1999/12/21 20:29:26 peter Exp $ $Log: dllist.h,v $ Revision 1.1 1999/12/21 20:29:26 peter Initial revision */ #ifndef dllist_h #define dllist_h #ifndef OFFSETOF #define OFFSETOF(pstructcast, linkfield) \ ((char *) &(((pstructcast) 0)->linkfield)) #endif typedef struct listnode listnode; struct listnode { listnode *prev; listnode *next; }; typedef struct listhead listhead; struct listhead { listnode head; listnode tail; }; #define LIST_INIT(listhead) ( \ (listhead).head.next = &(listhead).tail, \ (listhead).tail.prev = &(listhead).head, \ (listhead).head.prev = (listhead).tail.next = NULL ) /* listnode is a pointer to a listnode */ #define LIST_UNLINK_NODE(listnode) ( \ (listnode)->next->prev = (listnode)->prev, \ (listnode)->prev->next = (listnode)->next ) #define LIST_IS_EMPTY(listhead) ((listhead).head.next = &(listhead).tail) #define LIST_LINK_NODE_AT_END(listhead,listnode) \ ((listnode)->next = &(listhead).tail, \ (listnode)->prev = (listhead).tail.prev, \ (listhead).tail.prev->next = (listnode), \ (listhead).tail.prev = (listnode)) #define LIST_NODE_IS_REAL(listnode) ((listnode)->prev && (listnode)->next) #define LIST_GET_DATA(listnode,pstructcast,linkfield) \ ((pstructcast) ((char *) listnode - OFFSETOF(pstructcast, linkfield))) #endif /* dllist_h */