80 lines
3.6 KiB
C
80 lines
3.6 KiB
C
/*****************************************************************************
|
|
* Utility Library
|
|
*
|
|
* Singly linked-list utilities header file
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef _UTL_LINKED_LIST_INCLUDED
|
|
#define _UTL_LINKED_LIST_INCLUDED
|
|
|
|
|
|
/*--- Data Types ------------------------------------------------------------*/
|
|
|
|
typedef struct utlLinkedListNode_S *utlLinkedListNode_P;
|
|
typedef struct utlLinkedListNode_S {
|
|
utlLinkedListNode_P next_p;
|
|
unsigned char data[0]; /* variable-sized array */
|
|
} utlLinkedListNode_T;
|
|
typedef const utlLinkedListNode_T *utlLinkedListNode_P2c;
|
|
|
|
#define utlNULL_LINKED_LIST_NODE {NULL, {0}}
|
|
|
|
|
|
typedef unsigned int utlNodeCount_T;
|
|
|
|
typedef struct utlLinkedList_S {
|
|
utlLinkedListNode_P head_p;
|
|
utlLinkedListNode_P tail_p;
|
|
utlNodeCount_T node_count;
|
|
} utlLinkedList_T, *utlLinkedList_P;
|
|
typedef const utlLinkedList_T *utlLinkedList_P2c;
|
|
|
|
#define utlEMPTY_LINKED_LIST {NULL, NULL, 0}
|
|
|
|
|
|
/*--- Macros ----------------------------------------------------------------*/
|
|
|
|
#define utlIsListEmpty(list) ((list).head_p == (utlLinkedListNode_P) NULL)
|
|
|
|
#define utlQueryPrevNode(list_p, node_type, node_p) (node_type *) utlDoQueryPrevNode(list_p, (utlLinkedListNode_P) node_p)
|
|
#define utlGetHeadNode(list_p, node_type) (node_type *) utlDoGetHeadNode (list_p)
|
|
#define utlGetNode(list_p, node_type, prev_p, node_p) (node_type *) utlDoGetNode (list_p, (utlLinkedListNode_P) prev_p, (utlLinkedListNode_P) node_p)
|
|
#define utlGetTailNode(list_p, node_type) (node_type *) utlDoGetTailNode (list_p)
|
|
#define utlPutHeadNode(list_p, node_type, node_p) utlDoPutHeadNode (list_p, (utlLinkedListNode_P) node_p)
|
|
#define utlPutNode(list_p, node_type, here_p, node_p) utlDoPutNode (list_p, (utlLinkedListNode_P) here_p, (utlLinkedListNode_P) node_p)
|
|
#define utlPutTailNode(list_p, node_type, node_p) utlDoPutTailNode (list_p, (utlLinkedListNode_P) node_p)
|
|
|
|
/*--- Prototypes ------------------------------------------------------------*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern void utlInitLinkedList (const utlLinkedList_P list_p);
|
|
extern utlLinkedListNode_P utlDoQueryPrevNode(const utlLinkedList_P list_p,
|
|
const utlLinkedListNode_P node_p);
|
|
extern utlLinkedListNode_P utlDoGetHeadNode (const utlLinkedList_P list_p);
|
|
extern utlLinkedListNode_P utlDoGetNode (const utlLinkedList_P list_p,
|
|
const utlLinkedListNode_P prev_p,
|
|
const utlLinkedListNode_P node_p);
|
|
extern utlLinkedListNode_P utlDoGetTailNode (const utlLinkedList_P list_p);
|
|
extern void utlDoPutHeadNode (const utlLinkedList_P list_p,
|
|
const utlLinkedListNode_P node_p);
|
|
extern void utlDoPutNode (const utlLinkedList_P list_p,
|
|
const utlLinkedListNode_P here_p,
|
|
const utlLinkedListNode_P node_p);
|
|
extern void utlDoPutTailNode (const utlLinkedList_P list_p,
|
|
const utlLinkedListNode_P node_p);
|
|
extern void utlPutHeadList (const utlLinkedList_P list1_p,
|
|
const utlLinkedList_P list2_p);
|
|
extern void utlPutTailList (const utlLinkedList_P list1_p,
|
|
const utlLinkedList_P list2_p);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _UTL_LINKED_LIST_INCLUDED */
|
|
|