1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /*
- * Copyright (c) 2004-2005 Sergey Lyubka <valenok@gmail.com>
- * All rights reserved
- *
- * "THE BEER-WARE LICENSE" (Revision 42):
- * Sergey Lyubka wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return.
- */
- #ifndef LLIST_HEADER_INCLUDED
- #define LLIST_HEADER_INCLUDED
- /*
- * Linked list macros.
- */
- struct llhead {
- struct llhead *prev;
- struct llhead *next;
- };
- #define LL_INIT(N) ((N)->next = (N)->prev = (N))
- #define LL_HEAD(H) struct llhead H = { &H, &H }
- #define LL_ENTRY(P,T,N) ((T *)((char *)(P) - offsetof(T, N)))
- #define LL_ADD(H, N) \
- do { \
- ((H)->next)->prev = (N); \
- (N)->next = ((H)->next); \
- (N)->prev = (H); \
- (H)->next = (N); \
- } while (0)
- #define LL_TAIL(H, N) \
- do { \
- ((H)->prev)->next = (N); \
- (N)->prev = ((H)->prev); \
- (N)->next = (H); \
- (H)->prev = (N); \
- } while (0)
- #define LL_DEL(N) \
- do { \
- ((N)->next)->prev = ((N)->prev); \
- ((N)->prev)->next = ((N)->next); \
- LL_INIT(N); \
- } while (0)
- #define LL_EMPTY(N) ((N)->next == (N))
- #define LL_FOREACH(H,N) for (N = (H)->next; N != (H); N = (N)->next)
- #define LL_FOREACH_SAFE(H,N,T) \
- for (N = (H)->next, T = (N)->next; N != (H); \
- N = (T), T = (N)->next)
- #endif /* LLIST_HEADER_INCLUDED */
|