diff options
Diffstat (limited to 'libqueue/queue/sl.h')
| -rw-r--r-- | libqueue/queue/sl.h | 42 |
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*/ |
