summary refs log tree commit diff
path: root/misc
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-09-12 08:58:09 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-09-12 08:58:09 +0000
commitc41c08adca9bc3dbdc8662df944bcfcf0c4096a5 (patch)
treed0b0929d12558bc77ba0b645f059c4e114c20674 /misc
parenta27913a47d81b61ca176d927cd5d43e64c11def9 (diff)
downloadbtpd-c41c08adca9bc3dbdc8662df944bcfcf0c4096a5.tar.gz
btpd-c41c08adca9bc3dbdc8662df944bcfcf0c4096a5.zip
Moved from ../btpd/queue.h
Diffstat (limited to 'misc')
-rw-r--r--misc/queue.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/misc/queue.h b/misc/queue.h
new file mode 100644
index 0000000..0149729
--- /dev/null
+++ b/misc/queue.h
@@ -0,0 +1,99 @@
+/*
+ *      @(#)queue.h     8.5 (Berkeley) 8/20/94
+ * $FreeBSD: src/sys/sys/queue.h,v 1.58.2.1 2005/01/31 23:26:57 imp Exp $
+ */
+
+#ifndef BTPD_QUEUE_H
+#define BTPD_QUEUE_H
+
+/*
+ * Tail queue declarations.
+ */
+#define BTPDQ_HEAD(name, type)                                          \
+struct name {                                                           \
+        struct type *tqh_first; /* first element */                     \
+        struct type **tqh_last; /* addr of last next element */         \
+}
+
+#define BTPDQ_HEAD_INITIALIZER(head)                                    \
+        { NULL, &(head).tqh_first }
+
+#define BTPDQ_ENTRY(type)                                               \
+struct {                                                                \
+        struct type *tqe_next;  /* next element */                      \
+        struct type **tqe_prev; /* address of previous next element */  \
+}
+
+#define BTPDQ_EMPTY(head)       ((head)->tqh_first == NULL)
+
+#define BTPDQ_FIRST(head)       ((head)->tqh_first)
+
+#define BTPDQ_LAST(head, headname)                                      \
+        (*(((struct headname *)((head)->tqh_last))->tqh_last))
+
+#define BTPDQ_NEXT(elm, field) ((elm)->field.tqe_next)
+
+#define BTPDQ_PREV(elm, headname, field)                                \
+        (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+
+#define BTPDQ_FOREACH(var, head, field)                                 \
+        for ((var) = BTPDQ_FIRST((head));                               \
+            (var);                                                      \
+            (var) = BTPDQ_NEXT((var), field))
+
+#define BTPDQ_FOREACH_MUTABLE(var, head, field, nvar)                   \
+        for ((var) = BTPDQ_FIRST((head));                               \
+             (var) && ((nvar) = BTPDQ_NEXT((var), field), (var));       \
+             (var) = (nvar))
+
+#define BTPDQ_INIT(head) do {                                           \
+        BTPDQ_FIRST((head)) = NULL;                                     \
+        (head)->tqh_last = &BTPDQ_FIRST((head));                        \
+} while (0)
+
+#define BTPDQ_INSERT_AFTER(head, listelm, elm, field) do {              \
+        if ((BTPDQ_NEXT((elm), field) = BTPDQ_NEXT((listelm), field)) != NULL)\
+                BTPDQ_NEXT((elm), field)->field.tqe_prev =              \
+                    &BTPDQ_NEXT((elm), field);                          \
+        else {                                                          \
+                (head)->tqh_last = &BTPDQ_NEXT((elm), field);           \
+        }                                                               \
+        BTPDQ_NEXT((listelm), field) = (elm);                           \
+        (elm)->field.tqe_prev = &BTPDQ_NEXT((listelm), field);          \
+} while (0)
+
+#define BTPDQ_INSERT_BEFORE(listelm, elm, field) do {                   \
+        (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
+        BTPDQ_NEXT((elm), field) = (listelm);                           \
+        *(listelm)->field.tqe_prev = (elm);                             \
+        (listelm)->field.tqe_prev = &BTPDQ_NEXT((elm), field);          \
+} while (0)
+
+#define BTPDQ_INSERT_HEAD(head, elm, field) do {                        \
+        if ((BTPDQ_NEXT((elm), field) = BTPDQ_FIRST((head))) != NULL)   \
+                BTPDQ_FIRST((head))->field.tqe_prev =                   \
+                    &BTPDQ_NEXT((elm), field);                          \
+        else                                                            \
+                (head)->tqh_last = &BTPDQ_NEXT((elm), field);           \
+        BTPDQ_FIRST((head)) = (elm);                                    \
+        (elm)->field.tqe_prev = &BTPDQ_FIRST((head));                   \
+} while (0)
+
+#define BTPDQ_INSERT_TAIL(head, elm, field) do {                        \
+        BTPDQ_NEXT((elm), field) = NULL;                                \
+        (elm)->field.tqe_prev = (head)->tqh_last;                       \
+        *(head)->tqh_last = (elm);                                      \
+        (head)->tqh_last = &BTPDQ_NEXT((elm), field);                   \
+} while (0)
+
+#define BTPDQ_REMOVE(head, elm, field) do {                             \
+        if ((BTPDQ_NEXT((elm), field)) != NULL)                         \
+                BTPDQ_NEXT((elm), field)->field.tqe_prev =              \
+                    (elm)->field.tqe_prev;                              \
+        else {                                                          \
+                (head)->tqh_last = (elm)->field.tqe_prev;               \
+        }                                                               \
+        *(elm)->field.tqe_prev = BTPDQ_NEXT((elm), field);              \
+} while (0)
+
+#endif