Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

282 lines
6.9 KiB

/*++
Copyright (c) Microsoft 1998, All Rights Reserved
Module Name:
list.h
Abstract:
This module contains the code for manipulating list structures.
Environment:
User mode
Revision History:
Nov-97 : Created
--*/
#ifndef __LIST_H__
#define __LIST_H__
#include <windows.h>
typedef LIST_ENTRY LIST_NODE_HDR, *PLIST_NODE_HDR;
typedef LIST_NODE_HDR LIST, *PLIST;
typedef VOID PLIST_CALLBACK(PLIST_NODE_HDR);
VOID
InitializeList(
IN PLIST NewList
);
VOID
InsertHead(
IN PLIST List,
IN PLIST_NODE_HDR ListNode
);
VOID
InsertTail(
IN PLIST List,
IN PLIST_NODE_HDR ListNode
);
VOID
RemoveNode(
IN PLIST_NODE_HDR ListNode
);
PLIST_NODE_HDR
RemoveHead(
IN PLIST List
);
PLIST_NODE_HDR
RemoveTail(
IN PLIST List
);
BOOL
IsListEmpty(
IN PLIST List
);
PLIST_NODE_HDR
GetListHead(
IN PLIST List
);
PLIST_NODE_HDR
GetListTail(
IN PLIST List
);
PLIST_NODE_HDR
GetNextEntry(
IN PLIST_NODE_HDR ListNode
);
PLIST_NODE_HDR
GetPrevEntry(
IN PLIST_NODE_HDR ListNode
);
VOID
DestroyListNoCallback(
IN PLIST List
);
VOID
DestroyListWithCallback(
IN PLIST List,
IN PLIST_CALLBACK Callback
);
/*****************************************************************************
/* Macro definitions of list functions
/*****************************************************************************/
/*
// VOID
// InitializeList(
// IN PLIST NewList
// );
*/
#define InitializeList(nl) \
{ ((PLIST)(nl)) -> Flink = ((PLIST)(nl)) -> Blink = nl; }
/*
// VOID
// InsertHead(
/ IN PLIST List,
// IN PLIST_NODE_HDR ListNode
// );
*/
#define InsertHead(List, Node) { \
PLIST_NODE_HDR _EX_Flink; \
PLIST_NODE_HDR _EX_List; \
\
_EX_List = ((PLIST_NODE_HDR) (List)); \
_EX_Flink = _EX_List -> Flink; \
((PLIST_NODE_HDR) (Node))->Blink = _EX_List; \
((PLIST_NODE_HDR) (Node))->Flink = _EX_Flink; \
_EX_Flink->Blink = (((PLIST_NODE_HDR) (Node))); \
_EX_List->Flink = ((PLIST_NODE_HDR) (Node)); \
}
/*
// VOID
// InsertTail(
// IN PLIST List,
// IN PLIST_NODE_HDR ListNode
// );
*/
#define InsertTail(List, Node) { \
PLIST_NODE_HDR _EX_Blink; \
PLIST_NODE_HDR _EX_List; \
\
_EX_List = ((PLIST_NODE_HDR) (List)); \
_EX_Blink = _EX_List->Blink; \
((PLIST_NODE_HDR) (Node))->Flink = _EX_List; \
((PLIST_NODE_HDR) (Node))->Blink = _EX_Blink; \
_EX_Blink->Flink = (((PLIST_NODE_HDR) (Node))); \
_EX_List->Blink = ((PLIST_NODE_HDR) (Node)); \
}
/*
// VOID
// RemoveNode(
// IN PLIST_NODE_HDR ListNode
// );
*/
#define RemoveNode(node) { \
PLIST_NODE_HDR _EX_Blink; \
PLIST_NODE_HDR _EX_Flink; \
\
_EX_Flink = ((PLIST_NODE_HDR) (node))->Flink; \
_EX_Blink = ((PLIST_NODE_HDR) (node))->Blink; \
_EX_Blink->Flink = _EX_Flink; \
_EX_Flink->Blink = _EX_Blink; \
}
/*
// PLIST_NODE_HDR
// RemoveHead(
// IN PLIST List
// );
*/
#define RemoveHead(List) \
GetListHead((List)); \
RemoveNode(((PLIST_NODE_HDR) (List))->Flink)
/*
// PLIST_NODE_HDR
// RemoveTail(
// IN PLIST List
// );
*/
#define RemoveTail(List) \
GetListTail((List)); \
RemoveNode(((PLIST_NODE_HDR) (List))->Blink)
/*
// BOOL
// IsListEmpty(
// IN PLIST List
// );
*/
#define IsListEmpty(List) \
(((PLIST_NODE_HDR) (List))->Flink == ((PLIST_NODE_HDR) (List)))
/*
// PLIST_NODE_HDR
// GetListHead(
// IN PLIST List
// );
*/
#define GetListHead(List) \
(((PLIST_NODE_HDR) (List))->Flink)
/*
// PLIST_NODE_HDR
// GetListTail(
// IN PLIST List
// );
*/
#define GetListTail(List) \
(((PLIST_NODE_HDR) (List))->Blink)
/*
// PLIST_NODE_HDR
// GetNextEntry(
// IN PLIST_NODE_HDR ListNode
// );
*/
#define GetNextEntry(ListNode) \
(((PLIST_NODE_HDR) (ListNode)) -> Flink);
/*
// PLIST_NODE_HDR
// GetPrevEntry(
// IN PLIST_NODE_HDR ListNode
// );
*/
#define GetPrevEntry(ListNode) \
(((PLIST_NODE_HDR) (ListNode)) -> Blink);
/*
// VOID
// DestroyListNoCallback(
// IN PLIST List,
// IN PLIST_CALLBACK Callback
// );
*/
#define DestroyListNoCallback(list) \
PLIST_NODE_HDR currNode; \
\
while (!IsListEmpty((list))) { \
currNode = RemoveHead((list)); \
} \
}
/*
// VOID
// DestroyListWithCallback(
// IN PLIST List,
// IN PLIST_CALLBACK Callback
// );
*/
#define DestroyListWithCallback(list, cb) { \
PLIST_NODE_HDR currNode; \
\
while (!IsListEmpty((list))) { \
currNode = RemoveHead((list)); \
(cb)(currNode); \
} \
}
#endif