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
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
|