#ifndef __QUEUE_H__
#define __QUEUE_H__
struct queue_entry {
struct queue_entry *next;
struct queue_entry *prev;
};
typedef struct queue_entry *queue_t;
typedef struct queue_entry queue_head_t;
typedef struct queue_entry queue_chain_t;
typedef struct queue_entry *queue_entry_t;
#define queue_init(q) ((q)->next = (q)->prev = q)
#define queue_first(q) ((q)->next)
#define queue_next(qc) ((qc)->next)
#define queue_end(q, qe) ((q) == (qe))
#define queue_empty(q) queue_end((q), queue_first(q))
#define queue_enter(head, elt, type, field) \
do { \
if (queue_empty((head))) { \
(head)->next = (queue_entry_t) elt; \
(head)->prev = (queue_entry_t) elt; \
(elt)->field.next = head; \
(elt)->field.prev = head; \
} else { \
register queue_entry_t prev; \
\
prev = (head)->prev; \
(elt)->field.prev = prev; \
(elt)->field.next = head; \
(head)->prev = (queue_entry_t)(elt); \
((type)prev)->field.next = (queue_entry_t)(elt); \
} \
} while(0)
#define queue_field(head, thing, type, field) \
(((head) == (thing)) ? (head) : &((type)(thing))->field)
#define queue_remove(head, elt, type, field) \
do { \
register queue_entry_t next, prev; \
\
next = (elt)->field.next; \
prev = (elt)->field.prev; \
\
queue_field((head), next, type, field)->prev = prev; \
queue_field((head), prev, type, field)->next = next; \
} while(0)
#endif __QUEUE_H__