diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/llist.h | 118 | 
1 files changed, 62 insertions, 56 deletions
| diff --git a/src/llist.h b/src/llist.h index 3d42218..f2a5e96 100644 --- a/src/llist.h +++ b/src/llist.h @@ -1,70 +1,76 @@  #ifndef foosydneyllistfoo  #define foosydneyllistfoo -  #include "macro.h" -#define SA_LLIST_HEAD(t,head) t* head - -#define SA_LLIST_ITEM(t,name) t* name##_prev, *name##_next +#define SA_LLIST_HEAD(t,head)                                           \ +    t* head -#define SA_LLIST_HEAD_INIT(t,head) (head) = (t*) NULL +#define SA_LLIST_ITEM(t,name)                                           \ +    t* name##_prev, *name##_next -#define SA_LLIST_ITEM_INIT(t,name,item) do { \ -                               t *_item = (item); \ -                               sa_assert(_item); \ -                               _item->name##_prev = _item->name##_next = NULL; \ -                               } while(0) +#define SA_LLIST_HEAD_INIT(t,head)                                      \ +    (head) = (t*) NULL -#define SA_LLIST_PREPEND(t,name,head,item) do { \ -                                        t **_head = &(head), *_item = (item); \ -                                        sa_assert(_item); \ -                                        if ((_item->name##_next = *_head)) \ -                                            _item->name##_next->name##_prev = _item; \ -                                        _item->name##_prev = NULL; \ -                                        *_head = _item; \ -                                        } while (0) +#define SA_LLIST_ITEM_INIT(t,name,item)                                 \ +    do {                                                                \ +        t *_item = (item);                                              \ +        sa_assert(_item);                                               \ +        _item->name##_prev = _item->name##_next = NULL;                 \ +    } while(0) -#define SA_LLIST_INSERT_BEFORE(t,name,head,at,item) do { \ -                                        t **_head = &(head), *_item = (item), *_at = (at); \ -                                        sa_assert(_item); \ -                                        sa_assert(_at); \ -                                        if ((_item->name##_prev = _at->name##_prev)) { \ -                                            sa_assert(_item->name##_prev->name##_next == _at); \ -                                            _item->name##_prev->name##_next = _item; \ -                                        } else {\ -                                            sa_assert(*_head == _at); \ -                                            *_head = _item; \ -                                        }  \ -                                        _item->name##_next = _at; \ -                                        _at->name##_prev = _item; \ -                                        } while (0) +#define SA_LLIST_PREPEND(t,name,head,item)                              \ +    do {                                                                \ +        t **_head = &(head), *_item = (item);                           \ +        sa_assert(_item);                                               \ +        if ((_item->name##_next = *_head))                              \ +            _item->name##_next->name##_prev = _item;                    \ +        _item->name##_prev = NULL;                                      \ +        *_head = _item;                                                 \ +    } while (0) -#define SA_LLIST_INSERT_AFTER(t,name,head,at,item) do { \ -                                        t *_item = (item), *_at = (at); \ -                                        sa_assert(_item); \ -                                        sa_assert(_at); \ -                                        if ((_item->name##_next = _at->name##_next)) { \ -                                            sa_assert(_item->name##_next->name##_prev == _at); \ -                                            _item->name##_next->name##_prev = _item; \ -                                        } \ -                                        _item->name##_prev = _at; \ -                                        _at->name##_next = _item; \ -                                        } while (0) +#define SA_LLIST_INSERT_BEFORE(t,name,head,at,item)                     \ +    do {                                                                \ +        t **_head = &(head), *_item = (item), *_at = (at);              \ +        sa_assert(_item);                                               \ +        sa_assert(_at);                                                 \ +        if ((_item->name##_prev = _at->name##_prev)) {                  \ +            sa_assert(_item->name##_prev->name##_next == _at);          \ +            _item->name##_prev->name##_next = _item;                    \ +        } else {                                                        \ +            sa_assert(*_head == _at);                                   \ +            *_head = _item;                                             \ +        }                                                               \ +        _item->name##_next = _at;                                       \ +        _at->name##_prev = _item;                                       \ +    } while (0) -#define SA_LLIST_REMOVE(t,name,head,item) do { \ -                                    t **_head = &(head), *_item = (item); \ -                                    sa_assert(_item); \ -                                    if (_item->name##_next) \ -                                        _item->name##_next->name##_prev = _item->name##_prev; \ -                                    if (_item->name##_prev) \ -                                        _item->name##_prev->name##_next = _item->name##_next; \ -                                    else {\ -                                        sa_assert(*_head == _item); \ -                                        *_head = _item->name##_next; \ -                                    } \ -                                    _item->name##_next = _item->name##_prev = NULL; \ -                                    } while(0) +#define SA_LLIST_INSERT_AFTER(t,name,head,at,item)                      \ +    do {                                                                \ +        t *_item = (item), *_at = (at);                                 \ +        sa_assert(_item);                                               \ +        sa_assert(_at);                                                 \ +        if ((_item->name##_next = _at->name##_next)) {                  \ +            sa_assert(_item->name##_next->name##_prev == _at);          \ +            _item->name##_next->name##_prev = _item;                    \ +        }                                                               \ +        _item->name##_prev = _at;                                       \ +        _at->name##_next = _item;                                       \ +    } while (0) +#define SA_LLIST_REMOVE(t,name,head,item)                               \ +    do {                                                                \ +        t **_head = &(head), *_item = (item);                           \ +        sa_assert(_item);                                               \ +        if (_item->name##_next)                                         \ +            _item->name##_next->name##_prev = _item->name##_prev;       \ +        if (_item->name##_prev)                                         \ +            _item->name##_prev->name##_next = _item->name##_next;       \ +        else {                                                          \ +            sa_assert(*_head == _item);                                 \ +            *_head = _item->name##_next;                                \ +        }                                                               \ +        _item->name##_next = _item->name##_prev = NULL;                 \ +    } while(0)  #endif | 
