linux/tools/firewire/list.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2struct list {
   3        struct list *next, *prev;
   4};
   5
   6static inline void
   7list_init(struct list *list)
   8{
   9        list->next = list;
  10        list->prev = list;
  11}
  12
  13static inline int
  14list_empty(struct list *list)
  15{
  16        return list->next == list;
  17}
  18
  19static inline void
  20list_insert(struct list *link, struct list *new_link)
  21{
  22        new_link->prev          = link->prev;
  23        new_link->next          = link;
  24        new_link->prev->next    = new_link;
  25        new_link->next->prev    = new_link;
  26}
  27
  28static inline void
  29list_append(struct list *list, struct list *new_link)
  30{
  31        list_insert((struct list *)list, new_link);
  32}
  33
  34static inline void
  35list_prepend(struct list *list, struct list *new_link)
  36{
  37        list_insert(list->next, new_link);
  38}
  39
  40static inline void
  41list_remove(struct list *link)
  42{
  43        link->prev->next = link->next;
  44        link->next->prev = link->prev;
  45}
  46
  47#define list_entry(link, type, member) \
  48        ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
  49
  50#define list_head(list, type, member)           \
  51        list_entry((list)->next, type, member)
  52
  53#define list_tail(list, type, member)           \
  54        list_entry((list)->prev, type, member)
  55
  56#define list_next(elm, member)                                  \
  57        list_entry((elm)->member.next, typeof(*elm), member)
  58
  59#define list_for_each_entry(pos, list, member)                  \
  60        for (pos = list_head(list, typeof(*pos), member);       \
  61             &pos->member != (list);                            \
  62             pos = list_next(pos, member))
  63
  64