1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/* A set of doubly linked list utilities, implimented as macros. */
/* Copyright 1995, 2000 Graeme W. Gill */
#ifndef _LLIST_H_
#ifdef __cplusplus
extern "C" {
#endif
/* A doubly link list structure */
#define LINKSTRUCT(obj) \
struct { \
obj *fwd; /* Forward link */ \
obj *bwd; /* Backwards link */ \
} _llistp
/* Initialize the linked list */
#define INIT_LIST(head) \
((head) = NULL)
/* test if the list is empty */
#define IS_LIST_EMPTY(head) \
((head) == NULL)
/* Add an item to the top of a list */
#define ADD_ITEM_TO_TOP(head,objp) \
(IS_LIST_EMPTY(head) ? (INIT_LINK(objp), (head) = objp) : \
(ADD_LINK_BWD((head),(objp)), (head) = objp))
/* Add an item to the bottom of a list */
#define ADD_ITEM_TO_BOT(head,objp) \
(IS_LIST_EMPTY(head) ? (INIT_LINK(objp), (head) = objp) : \
(ADD_LINK_BWD((head),(objp))))
/* Insert a new item forward of the old one in linked list */
#define ADD_LINK_FWD(oob,nob) \
((nob)->_llistp.fwd = (oob)->_llistp.fwd, \
(nob)->_llistp.bwd = (oob), \
(oob)->_llistp.fwd->_llistp.bwd = (nob), \
(oob)->_llistp.fwd = (nob))
/* Insert a new item backward of the old one in linked list */
#define ADD_LINK_BWD(oob,nob) \
((nob)->_llistp.bwd = (oob)->_llistp.bwd, \
(nob)->_llistp.fwd = (oob), \
(oob)->_llistp.bwd->_llistp.fwd = (nob), \
(oob)->_llistp.bwd = (nob))
/* Delete an object from the list. */
#define DEL_LINK(head,objp) \
(IS_ONE_ITEM(objp) ? (head) = NULL : \
((objp) == (head) ? (head) = (head)->_llistp.fwd : 0, \
(objp)->_llistp.fwd->_llistp.bwd = (objp)->_llistp.bwd, \
(objp)->_llistp.bwd->_llistp.fwd = (objp)->_llistp.fwd, \
(objp)->_llistp.fwd = (objp)->_llistp.bwd = (objp)))
/* Combine two linked lists. Doesn't fix parent/child stuff */
/* Breaks lists backward of oob, and forward of nob */
#define MERGE_LINK(oob,nob) \
(((nob)->_llistp.fwd)->_llistp.bwd = (oob)->_llistp.bwd, \
((oob)->_llistp.bwd)->_llistp.fwd = (nob)->_llistp.fwd, \
(nob)->_llistp.fwd = (oob), \
(oob)->_llistp.bwd = (nob))
/* Scan through all of the items in a linked list */
/* (Robust version, copes with deleting the items) */
#define FOR_ALL_ITEMS(objtype, objp) \
if (objp != NULL) \
{ \
objtype *_end, *_next; \
_end = objp->_llistp.bwd; \
_next = objp->_llistp.fwd; \
do {
#define END_FOR_ALL_ITEMS(objp) \
} while (objp == _end ? 0 : \
(objp = _next, _next = objp->_llistp.fwd, 1)); \
}
#define NEXT_FWD(objp) \
(objp == NULL ? NULL : objp->_llistp.fwd)
/* ----------------------------- */
/* initialise a list to have only one entry */
#define INIT_LINK(objp) \
((objp)->_llistp.fwd = (objp)->_llistp.bwd = (objp))
/* test if the given object is the only one */
#define IS_ONE_ITEM(objp) \
((objp) == (objp)->_llistp.fwd)
#ifdef __cplusplus
}
#endif
#define _LLIST_H_
#endif /* _LLIST_H_ */
|