list.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. static inline void dl_list_init(struct dl_list *list)
  18. {
  19. list->next = list;
  20. list->prev = list;
  21. }
  22. static inline void dl_list_add(struct dl_list *list, struct dl_list *item)
  23. {
  24. item->next = list->next;
  25. item->prev = list;
  26. list->next->prev = item;
  27. list->next = item;
  28. }
  29. static inline void dl_list_add_tail(struct dl_list *list, struct dl_list *item)
  30. {
  31. dl_list_add(list->prev, item);
  32. }
  33. static inline void dl_list_del(struct dl_list *item)
  34. {
  35. item->next->prev = item->prev;
  36. item->prev->next = item->next;
  37. item->next = NULL;
  38. item->prev = NULL;
  39. }
  40. static inline int dl_list_empty(struct dl_list *list)
  41. {
  42. return list->next == list;
  43. }
  44. static inline unsigned int dl_list_len(struct dl_list *list)
  45. {
  46. struct dl_list *item;
  47. int count = 0;
  48. for (item = list->next; item != list; item = item->next)
  49. count++;
  50. return count;
  51. }
  52. #ifndef offsetof
  53. #define offsetof(type, member) ((long) &((type *) 0)->member)
  54. #endif
  55. #define dl_list_entry(item, type, member) \
  56. ((type *) ((char *) item - offsetof(type, member)))
  57. #define dl_list_first(list, type, member) \
  58. (dl_list_empty((list)) ? NULL : \
  59. dl_list_entry((list)->next, type, member))
  60. #define dl_list_last(list, type, member) \
  61. (dl_list_empty((list)) ? NULL : \
  62. dl_list_entry((list)->prev, type, member))
  63. #define dl_list_for_each(item, list, type, member) \
  64. for (item = dl_list_entry((list)->next, type, member); \
  65. &item->member != (list); \
  66. item = dl_list_entry(item->member.next, type, member))
  67. #define dl_list_for_each_safe(item, n, list, type, member) \
  68. for (item = dl_list_entry((list)->next, type, member), \
  69. n = dl_list_entry(item->member.next, type, member); \
  70. &item->member != (list); \
  71. item = n, n = dl_list_entry(n->member.next, type, member))
  72. #define dl_list_for_each_reverse(item, list, type, member) \
  73. for (item = dl_list_entry((list)->prev, type, member); \
  74. &item->member != (list); \
  75. item = dl_list_entry(item->member.prev, type, member))
  76. #define DEFINE_DL_LIST(name) \
  77. struct dl_list name = { &(name), &(name) }
  78. #endif /* LIST_H */