91 lines
3.0 KiB
C
91 lines
3.0 KiB
C
/* Copyright (c) 1992, Microsoft Corporation, all rights reserved
|
|
**
|
|
** dtl.h
|
|
** Double-threaded linked list header
|
|
**
|
|
** 06/28/92 Steve Cobb
|
|
*/
|
|
|
|
#ifndef _DTL_H_
|
|
#define _DTL_H_
|
|
|
|
|
|
#include <nouiutil.h> // Heap definitions
|
|
|
|
|
|
/* Double-threaded linked list node control block. There is one node for each
|
|
** entry in a list.
|
|
**
|
|
** Applications should not access this structure directly.
|
|
*/
|
|
#define DTLNODE struct tagDTLNODE
|
|
DTLNODE
|
|
{
|
|
DTLNODE* pdtlnodePrev; /* Address of previous node or NULL if none */
|
|
DTLNODE* pdtlnodeNext; /* Address of next node or NULL if none */
|
|
VOID* pData; /* Address of user's data */
|
|
LONG lNodeId; /* User-defined node identification code */
|
|
};
|
|
|
|
|
|
/* Double-threaded linked list control block. There is one for each list.
|
|
**
|
|
** Applications should not access this structure directly.
|
|
*/
|
|
#define DTLLIST struct tagDTLLIST
|
|
DTLLIST
|
|
{
|
|
DTLNODE* pdtlnodeFirst; /* Address of first node or NULL if none */
|
|
DTLNODE* pdtlnodeLast; /* Address of last node or NULL if none */
|
|
LONG lNodes; /* Number of nodes in list */
|
|
LONG lListId; /* User-defined list identification code */
|
|
};
|
|
|
|
|
|
/* List node duplication function. See DuplicateList.
|
|
*/
|
|
typedef DTLNODE* (*PDUPNODE)( IN DTLNODE* );
|
|
|
|
/* List node free function. See FreeList.
|
|
*/
|
|
typedef VOID (*PDESTROYNODE)( IN DTLNODE* );
|
|
|
|
/* List node comparison function. See MergeSort.
|
|
*/
|
|
typedef IN (*PCOMPARENODE)( IN DTLNODE*, IN DTLNODE* );
|
|
|
|
|
|
|
|
/* Macros and function prototypes.
|
|
*/
|
|
#define DtlGetData( pdtlnode ) ((pdtlnode)->pData)
|
|
#define DtlGetNodeId( pdtlnode ) ((pdtlnode)->lNodeId)
|
|
#define DtlGetFirstNode( pdtllist ) ((pdtllist)->pdtlnodeFirst)
|
|
#define DtlGetListId( pdtllist ) ((pdtllist)->lListId)
|
|
#define DtlGetNextNode( pdtlnode ) ((pdtlnode)->pdtlnodeNext)
|
|
#define DtlGetNodes( pdtllist ) ((pdtllist)->lNodes)
|
|
#define DtlGetPrevNode( pdtlnode ) ((pdtlnode)->pdtlnodePrev)
|
|
#define DtlGetLastNode( pdtllist ) ((pdtllist)->pdtlnodeLast)
|
|
#define DtlPutData( pdtlnode, p ) ((pdtlnode)->pData = (p))
|
|
#define DtlPutNodeId( pdtlnode, l ) ((pdtlnode)->lNodeId = (LONG )(l))
|
|
#define DtlPutListCode( pdtllist, l ) ((pdtllist)->lListId = (LONG )(l))
|
|
|
|
DTLNODE* DtlAddNodeAfter( DTLLIST*, DTLNODE*, DTLNODE* );
|
|
DTLNODE* DtlAddNodeBefore( DTLLIST*, DTLNODE*, DTLNODE* );
|
|
DTLNODE* DtlAddNodeFirst( DTLLIST*, DTLNODE* );
|
|
DTLNODE* DtlAddNodeLast( DTLLIST*, DTLNODE* );
|
|
DTLLIST* DtlCreateList( LONG );
|
|
DTLNODE* DtlCreateNode( VOID*, LONG );
|
|
DTLNODE* DtlCreateSizedNode( LONG, LONG );
|
|
VOID DtlDestroyList( DTLLIST*, PDESTROYNODE );
|
|
VOID DtlDestroyNode( DTLNODE* );
|
|
DTLNODE* DtlDeleteNode( DTLLIST*, DTLNODE* );
|
|
DTLLIST* DtlDuplicateList( DTLLIST*, PDUPNODE, PDESTROYNODE );
|
|
VOID DtlMergeSort( DTLLIST*, PCOMPARENODE );
|
|
|
|
DTLNODE* DtlNodeFromIndex( DTLLIST*, LONG );
|
|
DTLNODE* DtlRemoveNode( DTLLIST*, DTLNODE* );
|
|
|
|
|
|
#endif /*_DTL_H_*/
|