/*     
 * $RCSfile: dlist.h,v $
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 *
 * $Log: dlist.h,v $
 * Revision 1.2  1996/01/29 20:25:55  slm
 * Updated copyright and version.
 *
 * Revision 1.1  1995/07/28  21:29:10  slm
 * Initial revision
 *
 * Revision 1.1.1.1  1994/10/27  20:47:46  hkaram
 * New branch
 *
 * Revision 1.1  1994/07/08  05:02:46  menze
 * Initial revision
 */

/* A doubly-linked list type */

typedef struct dlist {
    struct dlist *next;
    struct dlist *prev;
} *dlist_t, *dlist_elem_t;

#define dlist_empty(dl) ((dl)->next == (dl))

#define dlist_init(dl) do {         \
    (dl)->next = (dl)->prev = (dl); \
} while (0)

/* 
 * insert a after pred
 */
#define dlist_insert(a, pred) do {                            \
    ((dlist_elem_t)(a))->next = ((dlist_elem_t)(pred))->next; \
    ((dlist_elem_t)(a))->prev = (dlist_elem_t)(pred);         \
    ((dlist_elem_t)(pred))->next = (dlist_elem_t)(a);         \
    ((dlist_elem_t)(a))->next->prev = (dlist_elem_t)(a);      \
} while (0)

#define dlist_remove(a) do {                                     \
    ((dlist_elem_t)(a))->prev->next = ((dlist_elem_t)(a))->next; \
    ((dlist_elem_t)(a))->next->prev = ((dlist_elem_t)(a))->prev; \
} while (0)

#define dlist_first(dl) (dlist_empty(dl) ? 0 : (dl)->next)
