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