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.
 
 
 
 
 
 

220 lines
3.1 KiB

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
list.c
Abstract:
List Entry manipulation functions
Author:
Based on code by Mike Tsang (MikeTs)
Stephane Plante (Splante)
Environment:
User mode only
Revision History:
--*/
#include "pch.h"
VOID
LOCAL
ListRemoveEntry(
PLIST List,
PPLIST ListHead
)
/*++
Routine Description:
Remove an Entry from the list
Arguments:
List - Entry to be removed
ListHead - List to be removed from
Return Value:
None
--*/
{
ASSERT(ListHead);
ASSERT(List != NULL);
if (List->ListNext == List) {
//
// This is the only object in the list, it must be the head too.
//
ASSERT(List == *ListHead);
*ListHead = NULL;
} else {
if (List == *ListHead) {
//
// The entry is at the head, so the next one becomes the new
// head.
//
*ListHead = (*ListHead)->ListNext;
}
List->ListNext->ListPrev = List->ListPrev;
List->ListPrev->ListNext = List->ListNext;
}
}
PLIST
LOCAL
ListRemoveHead(
PPLIST ListHead
)
/*++
Routine Description:
Remove the head entry of the list
Arguments:
ListHead - List to remove entry from
Return Value:
PLIST - Removed Item
--*/
{
PLIST list;
list = *ListHead;
if ( list != NULL) {
ListRemoveEntry(list, ListHead);
}
return list;
}
PLIST
LOCAL
ListRemoveTail(
PPLIST ListHead
)
/*++
Routine Description:
Remove the tail entry from the list
Arguments:
ListHead - List to remove entry from
Return Value:
PLIST - Removed Item
--*/
{
PLIST list;
if (*ListHead == NULL) {
list = NULL;
} else {
//
// List is not empty, so find the tail.
//
list = (*ListHead)->ListPrev;
ListRemoveEntry(list, ListHead);
}
return list;
}
VOID
LOCAL
ListInsertHead(
PLIST List,
PPLIST ListHead
)
/*++
Routine Description:
Insert an Entry at the head of the list
Arguments:
List List object to be inserted
ListHead The list where to insert the object
Return Value:
None
--*/
{
ListInsertTail(List, ListHead);
*ListHead = List;
}
VOID
LOCAL
ListInsertTail(
PLIST List,
PPLIST ListHead
)
/*++
Routine Description:
Insert an Entry at the tail of the list
Arguments:
List List object to be inserted
ListHead The list where to insert the object
Return Value:
None
--*/
{
if (*ListHead == NULL) {
//
// List is empty, so this becomes the head.
//
*ListHead = List;
List->ListPrev = List->ListNext = List;
} else {
List->ListNext = *ListHead;
List->ListPrev = (*ListHead)->ListPrev;
(*ListHead)->ListPrev->ListNext = List;
(*ListHead)->ListPrev = List;
}
}