123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #ifndef __GBLIBC_LIST_H_
- #define __GBLIBC_LIST_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- struct list_node {
- struct list_node* prev;
- struct list_node* next;
- char data[];
- };
- typedef struct list_node list_node;
- typedef list_node list_head;
- #define NDDATA(node, type) (*((type*)((node).data)))
- #define NDPREV(node) ((node).prev)
- #define NDNEXT(node) ((node).next)
- #define NDISEND(node) (!((node).next))
- #define NEWNODE(type) ((struct list_node*)malloc(sizeof(list_node) + sizeof(type)))
- #define NDPTR(p_data) ((list_node*)((char*)p_data - sizeof(list_node)))
- #define NDINSERT(node, newnode) \
- NDNEXT(*newnode) = NDNEXT(node); \
- if (NDNEXT(node)) \
- NDPREV(*NDNEXT(node)) = newnode; \
- NDNEXT(node) = newnode; \
- NDPREV(*newnode) = &node
- #define NDERASE(p_node) \
- if (NDPREV(*p_node)) \
- NDNEXT(*NDPREV(*p_node)) = NDNEXT(*p_node); \
- if (NDNEXT(*p_node)) \
- NDPREV(*NDNEXT(*p_node)) = NDPREV(*p_node); \
- free(p_node)
- #ifdef __cplusplus
- }
- #endif
- #endif
|