2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef foolisthfoo
# define foolisthfoo
/* The head of the linked list. Use this in the structure that shall
* contain the head of the linked list */
# define LIST_HEAD(t,name) \
2010-01-26 06:18:44 +03:00
t * name
2009-11-18 02:42:52 +03:00
/* The pointers in the linked list's items. Use this in the item structure */
2010-01-26 06:18:44 +03:00
# define LIST_FIELDS(t,name) \
t * name # # _next , * name # # _prev
2009-11-18 02:42:52 +03:00
/* Initialize the list's head */
2010-01-26 06:18:44 +03:00
# define LIST_HEAD_INIT(t,head) \
2009-11-18 02:42:52 +03:00
do { \
2010-01-26 06:18:44 +03:00
( head ) = NULL ; } \
2009-11-18 02:42:52 +03:00
while ( false )
/* Initialize a list item */
2010-01-26 06:18:44 +03:00
# define LIST_INIT(t,name,item) \
2009-11-18 02:42:52 +03:00
do { \
t * _item = ( item ) ; \
assert ( _item ) ; \
2010-01-26 06:18:44 +03:00
_item - > name # # _prev = _item - > name # # _next = NULL ; \
2009-11-18 02:42:52 +03:00
} while ( false )
/* Prepend an item to the list */
2010-01-26 06:18:44 +03:00
# define LIST_PREPEND(t,name,head,item) \
2009-11-18 02:42:52 +03:00
do { \
t * * _head = & ( head ) , * _item = ( item ) ; \
assert ( _item ) ; \
2010-01-26 06:18:44 +03:00
if ( ( _item - > name # # _next = * _head ) ) \
_item - > name # # _next - > name # # _prev = _item ; \
_item - > name # # _prev = NULL ; \
2009-11-18 02:42:52 +03:00
* _head = _item ; \
} while ( false )
/* Remove an item from the list */
2010-01-26 06:18:44 +03:00
# define LIST_REMOVE(t,name,head,item) \
2009-11-18 02:42:52 +03:00
do { \
t * * _head = & ( head ) , * _item = ( item ) ; \
assert ( _item ) ; \
2010-01-26 06:18:44 +03:00
if ( _item - > name # # _next ) \
_item - > name # # _next - > name # # _prev = _item - > name # # _prev ; \
if ( _item - > name # # _prev ) \
_item - > name # # _prev - > name # # _next = _item - > name # # _next ; \
2009-11-18 02:42:52 +03:00
else { \
assert ( * _head = = _item ) ; \
2010-01-26 06:18:44 +03:00
* _head = _item - > name # # _next ; \
2009-11-18 02:42:52 +03:00
} \
2010-01-26 06:18:44 +03:00
_item - > name # # _next = _item - > name # # _prev = NULL ; \
2009-11-18 02:42:52 +03:00
} while ( false )
/* Find the head of the list */
2010-01-26 06:18:44 +03:00
# define LIST_FIND_HEAD(t,name,item,head) \
2009-11-18 02:42:52 +03:00
do { \
2010-01-26 06:18:44 +03:00
t * _item = ( item ) ; \
assert ( _item ) ; \
while ( ( _item - > name # # _prev ) \
_item = _item - > name # # _prev ; \
( head ) = _item ; \
} while ( false )
/* Find the head of the list */
# define LIST_FIND_TAIL(t,name,item,tail) \
do { \
t * _item = ( item ) ; \
assert ( _item ) ; \
while ( _item - > name # # _next ) \
_item = _item - > name # # _next ; \
( tail ) = _item ; \
2009-11-18 02:42:52 +03:00
} while ( false )
/* Insert an item after another one (a = where, b = what) */
2010-01-26 06:18:44 +03:00
# define LIST_INSERT_AFTER(t,name,head,a,b) \
2009-11-18 02:42:52 +03:00
do { \
t * * _head = & ( head ) , * _a = ( a ) , * _b = ( b ) ; \
assert ( _b ) ; \
if ( ! _a ) { \
2010-01-26 06:18:44 +03:00
if ( ( _b - > name # # _next = * _head ) ) \
_b - > name # # _next - > name # # _prev = _b ; \
_b - > name # # _prev = NULL ; \
2009-11-18 02:42:52 +03:00
* _head = _b ; \
} else { \
2010-01-26 06:18:44 +03:00
if ( ( _b - > name # # _next = _a - > name # # _next ) ) \
_b - > name # # _next - > name # # _prev = _b ; \
_b - > name # # _prev = _a ; \
_a - > name # # _next = _b ; \
2009-11-18 02:42:52 +03:00
} \
} while ( false )
2010-01-26 06:18:44 +03:00
# define LIST_FOREACH(name,i,head) \
for ( ( i ) = ( head ) ; ( i ) ; ( i ) = ( i ) - > name # # _next )
2009-11-18 02:42:52 +03:00
2010-01-26 06:18:44 +03:00
# define LIST_FOREACH_SAFE(name,i,n,head) \
for ( ( i ) = ( head ) ; ( i ) & & ( ( ( n ) = ( i ) - > name # # _next ) , 1 ) ; ( i ) = ( n ) )
2009-11-18 02:42:52 +03:00
# endif