list.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #ifndef __GBLIBC_LIST_H_
  2. #define __GBLIBC_LIST_H_
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. struct list_node {
  7. struct list_node* prev;
  8. struct list_node* next;
  9. char data[];
  10. };
  11. typedef struct list_node list_node;
  12. typedef list_node list_head;
  13. #define NDDATA(node, type) (*((type*)((node).data)))
  14. #define NDPREV(node) ((node).prev)
  15. #define NDNEXT(node) ((node).next)
  16. #define NDISEND(node) (!((node).next))
  17. #define NEWNODE(type) ((struct list_node*)malloc(sizeof(list_node) + sizeof(type)))
  18. #define NDPTR(p_data) ((list_node*)((char*)p_data - sizeof(list_node)))
  19. #define NDINSERT(node, newnode) \
  20. NDNEXT(*newnode) = NDNEXT(node); \
  21. if (NDNEXT(node)) \
  22. NDPREV(*NDNEXT(node)) = newnode; \
  23. NDNEXT(node) = newnode; \
  24. NDPREV(*newnode) = &node
  25. #define NDERASE(p_node) \
  26. if (NDPREV(*p_node)) \
  27. NDNEXT(*NDPREV(*p_node)) = NDNEXT(*p_node); \
  28. if (NDNEXT(*p_node)) \
  29. NDPREV(*NDNEXT(*p_node)) = NDPREV(*p_node); \
  30. free(p_node)
  31. #ifdef __cplusplus
  32. }
  33. #endif
  34. #endif