list.h 2.5 KB

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