list.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Doubly-linked list
  3. * Copyright (c) 2009-2019, 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. }
  52. return count;
  53. }
  54. #ifndef offsetof
  55. #define offsetof(type, member) ((long) &((type *) 0)->member)
  56. #endif
  57. #define dl_list_entry(item, type, member) \
  58. ((type *) ((char *) item - offsetof(type, member)))
  59. #define dl_list_first(list, type, member) \
  60. (dl_list_empty((list)) ? NULL : \
  61. dl_list_entry((list)->next, type, member))
  62. #define dl_list_last(list, type, member) \
  63. (dl_list_empty((list)) ? NULL : \
  64. dl_list_entry((list)->prev, type, member))
  65. #define dl_list_for_each(item, list, type, member) \
  66. for (item = dl_list_first((list), type, member); \
  67. item && item != dl_list_entry((list), type, member); \
  68. item = dl_list_entry(item->member.next, type, member))
  69. #define dl_list_for_each_safe(item, n, list, type, member) \
  70. for (item = dl_list_entry((list)->next, type, member), \
  71. n = dl_list_entry(item->member.next, type, member); \
  72. &item->member != (list); \
  73. item = n, n = dl_list_entry(n->member.next, type, member))
  74. #define dl_list_for_each_reverse(item, list, type, member) \
  75. for (item = dl_list_entry((list)->prev, type, member); \
  76. &item->member != (list); \
  77. item = dl_list_entry(item->member.prev, type, member))
  78. #define DEFINE_DL_LIST(name) \
  79. struct dl_list name = { &(name), &(name) }
  80. #endif /* LIST_H */