summaryrefslogtreecommitdiff
path: root/libqueue/queue/sl.h
diff options
context:
space:
mode:
Diffstat (limited to 'libqueue/queue/sl.h')
-rw-r--r--libqueue/queue/sl.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/libqueue/queue/sl.h b/libqueue/queue/sl.h
new file mode 100644
index 0000000..168107a
--- /dev/null
+++ b/libqueue/queue/sl.h
@@ -0,0 +1,42 @@
+/* vim: set ts=4 sw=4 ai:
+ * sl.h -- singly linked list implementation derived from NetBSD's queue.h
+ */
+
+#ifndef SL_H
+#define SL_H
+
+struct sle {
+ void *data;
+ struct sle *next;
+};
+
+struct slh {
+ struct sle *first;
+};
+
+#define sl_first(hd) ((hd)->first)
+#define sl_next(e) ((e)->next)
+#define sl_empty(hd) (((hd)->first) == NULL)
+#define sl_init(hd) ((hd)->first = NULL)
+
+#define sl_foreach(var,head) \
+ for ((var) = ((head)->first); \
+ (var) != NULL; \
+ (var) = ((var)->next))
+
+#define sl_foreach_safe(var,head,vnext) \
+ for ((var) = ((head)->first); \
+ (var) != NULL && ((vnext) = sl_next((var)), 1); \
+ (var) = (vnext))
+
+struct slh *sl_new(void);
+struct sle *sl_elem_new(void *);
+void sl_insert_after(struct sle *, struct sle *);
+void sl_insert_head(struct slh *, struct sle *);
+void sl_remove_after(struct sle *);
+void sl_remove_head(struct slh *);
+void sl_remove(struct slh *, struct sle *);
+void sl_cleanup(struct slh *, void (*)(void *));
+struct sle *sl_find_from_data(struct slh *, const void *, int (*)(const void *, const void *));
+
+#endif/*!SL_H*/