home *** CD-ROM | disk | FTP | other *** search
- /* ============================== dl.h ============================== */
- #ifndef DL_H
- #define DL_H /* so it isn't included more than once */
-
- #ifndef TRUE
- #define TRUE 1
- #define FALSE 0
- #endif
-
- /*
- * Template for other "derived" node types. We assume a struct dl_node is at
- * the front of the derived type. Thus dl.c knows nothing about user data.
- */
- typedef struct dl_node {
- struct dl_node *next;
- struct dl_node *prev;
- int size; /* number of bytes of data following */
- } DL_NODE;
-
- /*
- * Structure to refer to a doubly-linked list.
- */
- typedef struct dl {
- DL_NODE *head;
- DL_NODE *tail;
- DL_NODE *curr;
- int size; /* number of nodes in list */
- int flags;
- } *DLIST;
-
- char *getnode();
- DLIST dl_create(), dl_copy();
- DL_NODE **dl_l2a();
-
- #define dl_head(dl) ((void *) ((dl)->head))
- #define dl_tail(dl) ((void *) ((dl)->tail))
- #define dl_curr(dl) ((void *) ((dl)->curr))
- #define dl_size(dl) ((dl)->size)
- #define dl_flags(dl) ((dl)->flags)
- #define dl_prev(dl) ((void *) ((dl)->curr->prev))
- #define dl_next(dl) ((void *) ((dl)->curr->next))
- #define dl_set(dl, n) ((void *) ((dl)->curr = (DL_NODE *) (n)))
- #define dl_shead(dl) ((void *) (dl_set(dl, dl_head(dl))))
- #define dl_stail(dl) ((void *) (dl_set(dl, dl_tail(dl))))
- #define dl_snext(dl) ((void *) (dl_set(dl, dl_next(dl))))
- #define dl_sprev(dl) ((void *) (dl_set(dl, dl_prev(dl))))
- #define dl_nextof(n) ((void *) (((DL_NODE *)(n))->next))
- #define dl_prevof(n) ((void *) (((DL_NODE *)(n))->prev))
- #define dl_sflags(dl,f) ((dl)->flags = (f))
- #define dl_searchlist(l,key,func) (dl_lsearch(l, dl_head(l), NULL, key, func))
- #define dl_delete(l) (dl_delete_node(l, dl_curr(l)))
- #define dl_detach(l) (dl_detach_node(l, dl_curr(l)))
- #define dl_ins_after(l, n) (dl_ins_after_node(l, dl_curr(l), n))
- #define dl_ins_before(l, n) (dl_ins_before_node(l, dl_curr(l), n))
- #define dl_append(l, n) (dl_ins_after_node(l, dl_tail(l), n))
- #define dl_prepend(l, n) (dl_ins_before_node(l, dl_head(l), n))
- #define dl_split(l, n) (dl_split_at_node(l, dl_curr(l)))
-
- /* Whether to free() nodes upon deletion or not. */
- #define DL_FREE 1
- #define DL_NOFREE 0
-
- #ifndef NULL
- #define NULL (0)
- #endif
-
- #define NIL ((void *) 0) /* for passing as param */
-
- #define foreach(l) for (dl_shead(l); dl_curr(l); dl_snext(l))
- #define foreachnode(l,p) for ((p)=dl_shead(l); (p); (p)=dl_snext(l))
- #endif
-