|
|
@@ -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 |