2025-04-27 07:49:33 -04:00

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_*/