linklist.h

来自「wince下的源代码集合打包」· C头文件 代码 · 共 554 行

H
554
字号
/*******************************************************************************  Copyright (c) 1993-2000 Microsoft Corporation.  All rights reserved.**  @doc		EXTERNAL LINKLIST**  @module	LinkList.h | **  @comm	This file defines the LinkList functions used by the*			Communications team.**  @topic	Linked Listed Functions Overview |**		The Linked List functions provide a standard way to use*		Linked Lists.**		<f InitializeListHead>		Initialize a list head**		<f IsListEmpty>			Check if list is empty**		<f RemoveHeadList>		Remove the first entry in a list**		<f RemoveHeadLockedList>	Remove the first entry from a locked list**		<f RemoveEntryList>		Remove an entry from a list**		<f RemoveEntryLockedList>	Remove an entry from a locked list**		<f RemoveTailList>		Remove the last entry from a list**		<f RemoveTailLockedList>	Remove the last entry from a locked list**		<f InsertTailList>			Insert at the tail of a list**		<f InsertTailLockedList>		Insert at the tail of a locked list**		<f InsertHeadList>		Insert at the head of a list**		<f InsertHeadLockedList>		Insert at the head of a locked list***//*    linklist.h    Macros for linked-list manipulation.*/#ifndef _LINKLIST_H_#define _LINKLIST_H_// Since this is in multiple modules it needs to be defined outside of// the DEBUG Zone stuff.  Otherwise each would have to have// a zone dedicated to debugging linked lists#ifndef DEBUG_LINK_LIST#define DEBUG_LINK_LIST	0#endif/*NOINC*/#if !defined(WIN32)/********************************************************************************	@struct	LIST_ENTRY	| The Linked List Structure**	@comm	This is the List Entry structure.*	@ex		An example of how to use this function follows |*			No Example**/typedef struct _LIST_ENTRY {    struct _LIST_ENTRY FAR * Flink;	//@field	The Pointer to next    struct _LIST_ENTRY FAR * Blink;	//@field	The Pointer to the previous} LIST_ENTRY;typedef LIST_ENTRY FAR * PLIST_ENTRY; #endif  // !WIN32//// Linked List Manipulation Functions - from NDIS.H//// Calculate the address of the base of the structure given its type, and an// address of a field within the structure. - from NDIS.H#ifndef CONTAINING_RECORD#if defined(WIN32) || defined(UNDER_CE)#define CONTAINING_RECORD(address, type, field) ((type *)( \                          (LPBYTE)(address) - \                          (LPBYTE)(&((type *)0)->field)))#else   // !WIN32#define CONTAINING_RECORD(address, type, field) ((type FAR *)( \                          MAKELONG( \                              ((LPBYTE)(address) - \                               (LPBYTE)(&((type FAR *)0)->field)), \                              SELECTOROF(address))))#endif  // WIN32#endif  // CONTAINING_RECORD//  Doubly-linked list manipulation routines.  Implemented as macros/********************************************************************************	@func	void 	|	InitializeListHead | Initialize a Linked List Head**	@rdesc	No return**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list**	@comm*			This will initialize the list head.**	@ex		An example of how to use this function follows |*			No Example**/#define InitializeListHead(ListHead) \    ((ListHead)->Flink = (ListHead)->Blink = (ListHead) )/********************************************************************************	@func	BOOL 	|	IsListEmpty	|	Is the list Emtpy?**	@rdesc	Boolean TRUE if the list is empty, FALSE if not empty.**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list**	@comm*			This function will test if the list is empty.**	@ex		An example of how to use this function follows |*			No Example**/#define IsListEmpty(ListHead) \    (( ((ListHead)->Flink == (ListHead)) ? TRUE : FALSE ) )/********************************************************************************	@func	PLIST_ENTRY	|	RemoveHeadList	|*			Remove the head of the list**	@rdesc	Returns the entry from the head of the list.**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list**	@comm*			If this is called on an empty list it will return a pointer to*			the list head (probably not what you wanted).**	@ex		An example of how to use this function follows |*			No Example**/_inlinePLIST_ENTRYRemoveHeadList(PLIST_ENTRY ListHead){	PLIST_ENTRY	FirstEntry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+RemoveHeadList: Head=%x(%x,%x)\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink));	FirstEntry               = ListHead->Flink;	FirstEntry->Flink->Blink = (ListHead);	ListHead->Flink          = FirstEntry->Flink;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-RemoveHeadList: %x Head=%x(%x,%x)\r\n"),			  FirstEntry, ListHead, ListHead->Flink, ListHead->Blink));	return FirstEntry;}/********************************************************************************	@func	PLIST_ENTRY	|	RemoveHeadLockedList	|*			Remove the first entry of a locked list**	@rdesc	Returns the entry from the head of the list.**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list*	@parm	LPCRITICAL_SECTION	|	CS	| The critical section**	@comm*			If this is called on an empty list it will return a pointer to*			the list head (probably not what you wanted).**	@ex		An example of how to use this function follows |*			No Example**/_inlinePLIST_ENTRYRemoveHeadLockedList(PLIST_ENTRY ListHead, LPCRITICAL_SECTION CS){	PLIST_ENTRY	FirstEntry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+RemoveHeadLockedList: Head=%x(%x,%x) CS=%x\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, CS));	EnterCriticalSection(CS);	FirstEntry               = ListHead->Flink;	FirstEntry->Flink->Blink = (ListHead);	ListHead->Flink          = FirstEntry->Flink;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-RemoveHeadLockedList: %x Head=%x(%x,%x)\r\n"),			  FirstEntry, ListHead, ListHead->Flink, ListHead->Blink));	LeaveCriticalSection(CS);	return FirstEntry;}/********************************************************************************	@func	void	|	RemoveEntryList | Removes an entry from the list**	@rdesc	No return**	@parm	PLIST_ENTRY	|	Entry	| The entry to remove**	@comm*			This function will remove the specified entry from a list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidRemoveEntryList(PLIST_ENTRY Entry){	PLIST_ENTRY EX_Entry;		DEBUGMSG(DEBUG_LINK_LIST, (TEXT("+RemoveEntryList: Entry=%x(%x,%x)\r\n"),                               Entry, Entry->Flink, Entry->Blink));    EX_Entry = (Entry);    EX_Entry->Blink->Flink = EX_Entry->Flink;    EX_Entry->Flink->Blink = EX_Entry->Blink;	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("-RemoveEntryList: \r\n")));}/********************************************************************************	@func	void	|	RemoveEntryLockedList | Removes an entry from the list**	@rdesc	No return**	@parm	PLIST_ENTRY			|	Entry	| The entry to remove*	@parm	LPCRITICAL_SECTION	|	CS		| The critical section to lock**	@comm*			This function will remove the specified entry from a list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidRemoveEntryLockedList(PLIST_ENTRY Entry, LPCRITICAL_SECTION CS){	PLIST_ENTRY EX_Entry;		DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+RemoveEntryLockedList: Entry=%x(%x,%x) CS=%x\r\n"),			  Entry, Entry->Flink, Entry->Blink, CS));	EnterCriticalSection(CS);    EX_Entry               = (Entry);    EX_Entry->Blink->Flink = EX_Entry->Flink;    EX_Entry->Flink->Blink = EX_Entry->Blink;	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("-RemoveEntryLockedList: \r\n")));	LeaveCriticalSection(CS);}/********************************************************************************	@func	PLIST_ENTRY	|	RemoveTailList	|*			This function will remove the entry from the end of a list.**	@rdesc	Returns a pointer to the tail entry.**	@parm	PLIST_ENTRY	|	ListHead	| The List Head**	@comm*			Don't call this with a null list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinePLIST_ENTRYRemoveTailList(PLIST_ENTRY ListHead){	PLIST_ENTRY _EX_Entry;	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("+RemoveTailList: ListHead=%x(%x,%x)\r\n"),                               ListHead, ListHead->Flink, ListHead->Blink));	_EX_Entry = ListHead->Blink;	RemoveEntryList(_EX_Entry);	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("-RemoveTailList: ListHead=%x(%x,%x)\r\n"),				 ListHead, ListHead->Flink, ListHead->Blink));	return _EX_Entry;}/********************************************************************************	@func	PLIST_ENTRY	|	RemoveTailLockedList	|*			This function will remove the entry from the end of a list.**	@rdesc	Returns a pointer to the tail entry.**	@parm	PLIST_ENTRY	|	ListHead	| The List Head*	@parm	LPCRITICAL_SECTION	|	CS			| Pointer to a Critical Section**	@comm*			Don't call this with a null list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinePLIST_ENTRYRemoveTailLockedList(PLIST_ENTRY ListHead, LPCRITICAL_SECTION CS){	PLIST_ENTRY _EX_Entry;	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("+RemoveTailList: ListHead=%x(%x,%x)\r\n"),				 ListHead, ListHead->Flink, ListHead->Blink));	EnterCriticalSection(CS);	_EX_Entry = ListHead->Blink;	RemoveEntryList(_EX_Entry);	DEBUGMSG(DEBUG_LINK_LIST, (TEXT("-RemoveTailList: ListHead=%x(%x,%x)\r\n"),				 ListHead, ListHead->Flink, ListHead->Blink));	LeaveCriticalSection(CS);	return _EX_Entry;}/********************************************************************************	@func	void	|	InsertTailList	|*			Insert at the end of a list**	@rdesc	No return**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list*	@parm	PLIST_ENTRY	|	Entry		| The Entry to add to the list**	@comm*			Inserts an entry at the tail of a list**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidInsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry){	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+InsertTailList: Head=%x(%x,%x) Entry=%x\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, Entry));    Entry->Flink           = ListHead;    Entry->Blink           = ListHead->Blink;    ListHead->Blink->Flink = Entry;    ListHead->Blink        = Entry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-InsertTailList: Head=%x(%x,%x) Entry=%x(%x,%x)\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, Entry,			  Entry->Flink, Entry->Blink));	return;}/********************************************************************************	@func	void	|	InsertTailLockedList	|*			Insert at the end of a list**	@rdesc	No return**	@parm	PLIST_ENTRY			|	ListHead	| The head of the list*	@parm	PLIST_ENTRY			|	Entry		| The Entry to add to the list*	@parm	LPCRITICAL_SECTION	|	CS			| Pointer to a Critical Section**	@comm*			Inserts an entry at the tail of a list**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidInsertTailLockedList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry,					 LPCRITICAL_SECTION CS){	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+InsertTailList: Head=%x(%x,%x) CS=%x Entry=%x\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, CS, Entry));	EnterCriticalSection(CS);    Entry->Flink           = ListHead;    Entry->Blink           = ListHead->Blink;    ListHead->Blink->Flink = Entry;    ListHead->Blink        = Entry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-InsertTailList: Head=%x(%x,%x) Entry=%x(%x,%x)\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, Entry,			  Entry->Flink, Entry->Blink));	LeaveCriticalSection(CS);	return;}/********************************************************************************	@func	void	|	InsertHeadList	|*			Insert an entry at the head of a list**	@rdesc	No return.**	@parm	PLIST_ENTRY	|	ListHead	| The head of the list*	@parm	PLIST_ENTRY	|	Entry		| The Entry to add to the list**	@comm*			This will add an entry to the head of a list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidInsertHeadList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry){	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+InsertHeadList: Head=%x(%x,%x) Entry=%x\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, Entry));    Entry->Flink           = ListHead->Flink;    Entry->Blink           = ListHead;    ListHead->Flink->Blink = Entry;    ListHead->Flink        = Entry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-InsertHeadList: Head=%x(%x,%x) Entry=%x(%x,%x)\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink,			  Entry, Entry->Flink, Entry->Blink));}/********************************************************************************	@func	void	|	InsertHeadLockedList	|*			Insert an entry at the head of a critcal section locked list**	@rdesc	No return.**	@parm	PLIST_ENTRY			|	ListHead	| The head of the list*	@parm	PLIST_ENTRY			|	Entry		| The Entry to add to the list*	@parm	LPCRITICAL_SECTION	|	CS			| Pointer to a Critical Section**	@comm*			This will add an entry to the head of a list.**	@ex		An example of how to use this function follows |*			No Example**/_inlinevoidInsertHeadLockedList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry,					 LPCRITICAL_SECTION CS){	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("+InsertHeadLockedList: Head=%x(%x,%x) CS=%x Entry=%x\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink, CS, Entry));	EnterCriticalSection (CS);    Entry->Flink           = ListHead->Flink;    Entry->Blink           = ListHead;    ListHead->Flink->Blink = Entry;    ListHead->Flink        = Entry;	DEBUGMSG(DEBUG_LINK_LIST,			 (TEXT("-InsertHeadLockedList: Head=%x(%x,%x) Entry=%x(%x,%x)\r\n"),			  ListHead, ListHead->Flink, ListHead->Blink,			  Entry, Entry->Flink, Entry->Blink));	LeaveCriticalSection (CS);}/*INC*/#endif  // _LINKLIST_H_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?