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.
 
 
 
 
 
 

200 lines
4.7 KiB

/*** list.c - Miscellaneous functions
*
* Copyright (c) 1996,1997 Microsoft Corporation
* Author: Michael Tsang (MikeTs)
* Created 09/13/96
*
* MODIFICATION HISTORY
*/
#include "pch.h"
#ifdef LOCKABLE_PRAGMA
#pragma ACPI_LOCKABLE_DATA
#pragma ACPI_LOCKABLE_CODE
#endif
/***LP ListRemoveEntry - Remove an entry from the list
*
* ENTRY
* plist -> list object to be removed
* pplistHead -> list head pointer
*
* EXIT
* None
*/
VOID EXPORT ListRemoveEntry(PLIST plist, PPLIST pplistHead)
{
TRACENAME("LISTREMOVEENTRY")
ASSERT(pplistHead);
ENTER(4, ("ListRemoveEntry(plist=%x,plistHead=%x)\n", plist, *pplistHead));
ASSERT(plist != NULL);
if (plist->plistNext == plist)
{
//
// This is the only object in the list, it must be the head too.
//
ASSERT(plist == *pplistHead);
*pplistHead = NULL;
}
else
{
if (plist == *pplistHead)
{
//
// The entry is at the head, so the next one becomes the new
// head.
//
*pplistHead = (*pplistHead)->plistNext;
}
plist->plistNext->plistPrev = plist->plistPrev;
plist->plistPrev->plistNext = plist->plistNext;
}
EXIT(4, ("ListRemoveEntry! (plistHead=%x)\n", *pplistHead));
} //ListRemoveEntry
/***LP ListRemoveHead - Remove the head entry of the list
*
* ENTRY
* pplistHead -> list head pointer
*
* EXIT
* returns the removed entry
*/
PLIST EXPORT ListRemoveHead(PPLIST pplistHead)
{
TRACENAME("LISTREMOVEHEAD")
PLIST plist;
ASSERT(pplistHead);
ENTER(4, ("ListRemoveHead(plistHead=%x)\n", *pplistHead));
if ((plist = *pplistHead) != NULL)
ListRemoveEntry(plist, pplistHead);
EXIT(4, ("ListRemoveHead=%x (plistHead=%x)\n", plist, *pplistHead));
return plist;
} //ListRemoveHead
/***LP ListRemoveTail - Remove the tail entry of the list
*
* ENTRY
* pplistHead -> list head pointer
*
* EXIT
* returns the removed entry
*/
PLIST EXPORT ListRemoveTail(PPLIST pplistHead)
{
TRACENAME("LISTREMOVETAIL")
PLIST plist;
ASSERT(pplistHead);
ENTER(4, ("ListRemoveTail(plistHead=%x)\n", *pplistHead));
if (*pplistHead == NULL)
plist = NULL;
else
{
//
// List is not empty, so find the tail.
//
plist = (*pplistHead)->plistPrev;
ListRemoveEntry(plist, pplistHead);
}
EXIT(4, ("ListRemoveTail=%x (plistHead=%x)\n", plist, *pplistHead));
return plist;
} //ListRemoveTail
/***LP ListRemoveAll - Remove all elements in the list
*
* ENTRY
* pplistHead -> list head pointer
*
* EXIT
* None
*/
VOID EXPORT ListRemoveAll(PPLIST pplistHead)
{
TRACENAME("LISTREMOVEALL")
ASSERT(pplistHead);
ENTER(4, ("ListRemoveAll(plistHead=%x)\n", *pplistHead));
while (*pplistHead != NULL)
{
ListRemoveTail(pplistHead);
}
EXIT(4, ("ListRemoveAll! (plistHead=%x)\n", *pplistHead));
} //ListRemoveAll
/***LP ListInsertHead - Insert an entry at the head of the list
*
* ENTRY
* plist -> list object to be inserted
* pplistHead -> list head pointer
*
* EXIT
* None
*/
VOID EXPORT ListInsertHead(PLIST plist, PPLIST pplistHead)
{
TRACENAME("LISTINSERTHEAD")
ASSERT(pplistHead != NULL);
ENTER(4, ("ListInsertHead(plist=%x,plistHead=%x)\n", plist, *pplistHead));
ASSERT(plist != NULL);
ListInsertTail(plist, pplistHead);
*pplistHead = plist;
EXIT(4, ("ListInsertHead! (plistHead=%x)\n", *pplistHead));
} //ListInsertHead
/***LP ListInsertTail - Insert an entry at the tail of the list
*
* ENTRY
* plist -> list object to be inserted
* pplistHead -> list head pointer
*
* EXIT
* None
*/
VOID EXPORT ListInsertTail(PLIST plist, PPLIST pplistHead)
{
TRACENAME("LISTINSERTTAIL")
ASSERT(pplistHead != NULL);
ENTER(4, ("ListInsertTail(plist=%x,plistHead=%x)\n", plist, *pplistHead));
ASSERT(plist != NULL);
if (*pplistHead == NULL)
{
//
// List is empty, so this becomes the head.
//
*pplistHead = plist;
plist->plistPrev = plist->plistNext = plist;
}
else
{
plist->plistNext = *pplistHead;
plist->plistPrev = (*pplistHead)->plistPrev;
(*pplistHead)->plistPrev->plistNext = plist;
(*pplistHead)->plistPrev = plist;
}
EXIT(4, ("ListInsertTail! (plistHead=%x)\n", *pplistHead));
} //ListInsertTail