/* vim: set ts=4 sw=4 ai: * sq.h -- singly linked queue implementation derived from NetBSD's queue.h */ #ifndef SQ_H #define SQ_H struct sqe { void *data; struct sqe *next; }; struct sqh { struct sqe *first; struct sqe **last; }; #define sq_first(hd) ((hd)->first) #define sq_last(hd) (*(((struct sqh *)(void *)((hd)->last))->last)) #define sq_next(e) ((e)->next) #define sq_empty(hd) (((hd)->first) == NULL) #define sq_init(hd) do { \ (hd)->first = NULL; \ (hd)->last = &(hd)->first; \ } while (0) #define sq_foreach(var,head) \ for ((var) = ((head)->first); \ (var) != NULL; \ (var) = ((var)->next)) #define sq_foreach_safe(var,head,vnext) \ for ((var) = ((head)->first); \ (var) != NULL && ((vnext) = sq_next((var)), 1); \ (var) = (vnext)) struct sqh *sq_new(void); struct sqe *sq_elem_new(void *); void sq_insert_head(struct sqh *, struct sqe *); void sq_insert_tail(struct sqh *, struct sqe *); void sq_insert_after(struct sqh *, struct sqe *, struct sqe *); void sq_remove_head(struct sqh *); void sq_remove_after(struct sqh *, struct sqe *); void sq_remove(struct sqh *, struct sqe *); void sq_concat(struct sqh *, struct sqh *); void sq_cleanup(struct sqh *, void (*)(void *)); struct sqe *sq_find_from_data(struct sqh *, const void *, int (*)(const void *, const void *)); #endif/*!SQ_H*/