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