list.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Doubly-linked list
  3. * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #ifndef LIST_H
  9. #define LIST_H
  10. /**
  11. * struct dl_list - Doubly-linked list
  12. */
  13. struct dl_list {
  14. struct dl_list *next;
  15. struct dl_list *prev;
  16. };
  17. #define DL_LIST_HEAD_INIT(l) { &(l), &(l) }
  18. static inline void dl_list_init(struct dl_list *list)
  19. {
  20. list->next = list;
  21. list->prev = list;
  22. }
  23. static inline void dl_list_add(struct dl_list *list, struct dl_list *item)
  24. {
  25. item->next = list->next;
  26. item->prev = list;
  27. list->next->prev = item;
  28. list->next = item;
  29. }
  30. static inline void dl_list_add_tail(struct dl_list *list, struct dl_list *item)
  31. {
  32. dl_list_add(list->prev, item);
  33. }
  34. static inline void dl_list_del(struct dl_list *item)
  35. {
  36. item->next->prev = item->prev;
  37. item->prev->next = item->next;
  38. item->next = NULL;
  39. item->prev = NULL;
  40. }
  41. static inline int dl_list_empty(struct dl_list *list)
  42. {
  43. return list->next == list;
  44. }
  45. static inline unsigned int dl_list_len(struct dl_list *list)
  46. {
  47. struct dl_list *item;
  48. int count = 0;
  49. for (item = list->next; item != list; item = item->next)
  50. count++;
  51. return count;
  52. }
  53. #ifndef offsetof
  54. #define offsetof(type, member) ((long) &((type *) 0)->member)
  55. #endif
  56. #define dl_list_entry(item, type, member) \
  57. ((type *) ((char *) item - offsetof(type, member)))
  58. #define dl_list_first(list, type, member) \
  59. (dl_list_empty((list)) ? NULL : \
  60. dl_list_entry((list)->next, type, member))
  61. #define dl_list_last(list, type, member) \
  62. (dl_list_empty((list)) ? NULL : \
  63. dl_list_entry((list)->prev, type, member))
  64. #define dl_list_for_each(item, list, type, member) \
  65. for (item = dl_list_entry((list)->next, type, member); \
  66. &item->member != (list); \
  67. item = dl_list_entry(item->member.next, type, member))
  68. #define dl_list_for_each_safe(item, n, list, type, member) \
  69. for (item = dl_list_entry((list)->next, type, member), \
  70. n = dl_list_entry(item->member.next, type, member); \
  71. &item->member != (list); \
  72. item = n, n = dl_list_entry(n->member.next, type, member))
  73. #define dl_list_for_each_reverse(item, list, type, member) \
  74. for (item = dl_list_entry((list)->prev, type, member); \
  75. &item->member != (list); \
  76. item = dl_list_entry(item->member.prev, type, member))
  77. #define DEFINE_DL_LIST(name) \
  78. struct dl_list name = { &(name), &(name) }
  79. #endif /* LIST_H */