Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / seabios / src / list.h
diff --git a/qemu/roms/seabios/src/list.h b/qemu/roms/seabios/src/list.h
new file mode 100644 (file)
index 0000000..de656b9
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef __LIST_H
+#define __LIST_H
+
+#include "types.h" // container_of
+
+
+/****************************************************************
+ * hlist - Double linked lists with a single pointer list head
+ ****************************************************************/
+
+struct hlist_node {
+    struct hlist_node *next, **pprev;
+};
+
+struct hlist_head {
+    struct hlist_node *first;
+};
+
+static inline int
+hlist_empty(const struct hlist_head *h)
+{
+    return !h->first;
+}
+
+static inline void
+hlist_del(struct hlist_node *n)
+{
+    struct hlist_node *next = n->next;
+    struct hlist_node **pprev = n->pprev;
+    *pprev = next;
+    if (next)
+        next->pprev = pprev;
+}
+
+static inline void
+hlist_add(struct hlist_node *n, struct hlist_node **pprev)
+{
+    struct hlist_node *next = *pprev;
+    n->pprev = pprev;
+    n->next = next;
+    if (next)
+        next->pprev = &n->next;
+    *pprev = n;
+}
+
+static inline void
+hlist_add_head(struct hlist_node *n, struct hlist_head *h)
+{
+    hlist_add(n, &h->first);
+}
+
+static inline void
+hlist_add_before(struct hlist_node *n, struct hlist_node *next)
+{
+    hlist_add(n, next->pprev);
+}
+
+static inline void
+hlist_add_after(struct hlist_node *n, struct hlist_node *prev)
+{
+    hlist_add(n, &prev->next);
+}
+
+#define hlist_for_each_entry(pos, head, member)                         \
+    for (pos = container_of((head)->first, typeof(*pos), member)        \
+         ; pos != container_of(NULL, typeof(*pos), member)              \
+         ; pos = container_of(pos->member.next, typeof(*pos), member))
+
+#define hlist_for_each_entry_safe(pos, n, head, member)                 \
+    for (pos = container_of((head)->first, typeof(*pos), member)        \
+         ; pos != container_of(NULL, typeof(*pos), member)              \
+             && ({ n = pos->member.next; 1; })                          \
+         ; pos = container_of(n, typeof(*pos), member))
+
+#define hlist_for_each_entry_pprev(pos, pprev, head, member)            \
+    for (pprev = &(head)->first                                         \
+         ; *pprev && ({ pos=container_of(*pprev, typeof(*pos), member); 1; }) \
+         ; pprev = &(*pprev)->next)
+
+
+#endif // list.h