tools/firewire: add userspace front-end of nosy
[sfrench/cifs-2.6.git] / tools / firewire / list.h
diff --git a/tools/firewire/list.h b/tools/firewire/list.h
new file mode 100644 (file)
index 0000000..fa119dd
--- /dev/null
@@ -0,0 +1,62 @@
+struct list {
+  struct list *next, *prev;
+};
+
+static inline void
+list_init(struct list *list)
+{
+  list->next = list;
+  list->prev = list;
+}
+
+static inline int
+list_empty(struct list *list)
+{
+  return list->next == list;
+}
+
+static inline void
+list_insert(struct list *link, struct list *new_link)
+{
+  new_link->prev       = link->prev;
+  new_link->next       = link;
+  new_link->prev->next = new_link;
+  new_link->next->prev = new_link;
+}
+
+static inline void
+list_append(struct list *list, struct list *new_link)
+{
+  list_insert((struct list *)list, new_link);
+}
+
+static inline void
+list_prepend(struct list *list, struct list *new_link)
+{
+  list_insert(list->next, new_link);
+}
+
+static inline void
+list_remove(struct list *link)
+{
+  link->prev->next = link->next;
+  link->next->prev = link->prev;
+}
+
+#define list_entry(link, type, member) \
+       ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
+
+#define list_head(list, type, member)          \
+       list_entry((list)->next, type, member)
+
+#define list_tail(list, type, member)          \
+       list_entry((list)->prev, type, member)
+
+#define list_next(elm, member)                                 \
+       list_entry((elm)->member.next, typeof(*elm), member)
+
+#define list_for_each_entry(pos, list, member)                 \
+       for (pos = list_head(list, typeof(*pos), member);       \
+            &pos->member != (list);                            \
+            pos = list_next(pos, member))
+