Renamed to match filename naming recommendations.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4882 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
356
EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/LinkedList.c
Normal file
356
EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/LinkedList.c
Normal file
@@ -0,0 +1,356 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2004, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
LinkedList.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Linked List Library Functions
|
||||
|
||||
--*/
|
||||
|
||||
#include "Tiano.h"
|
||||
#include "EfiDriverLib.h"
|
||||
|
||||
|
||||
VOID
|
||||
InitializeListHead (
|
||||
EFI_LIST_ENTRY *List
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Initialize the head of the List. The caller must allocate the memory
|
||||
for the EFI_LIST. This function must be called before the other linked
|
||||
list macros can be used.
|
||||
|
||||
Arguments:
|
||||
|
||||
List - Pointer to list head to initialize
|
||||
|
||||
Returns:
|
||||
|
||||
None.
|
||||
|
||||
--*/
|
||||
|
||||
{
|
||||
List->ForwardLink = List;
|
||||
List->BackLink = List;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
IsListEmpty (
|
||||
EFI_LIST_ENTRY *List
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Return TRUE is the list contains zero nodes. Otherzise return FALSE.
|
||||
The list must have been initialized with InitializeListHead () before using
|
||||
this function.
|
||||
|
||||
Arguments:
|
||||
|
||||
List - Pointer to list head to test
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
Return TRUE is the list contains zero nodes. Otherzise return FALSE.
|
||||
|
||||
--*/
|
||||
{
|
||||
return (BOOLEAN)(List->ForwardLink == List);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
RemoveEntryList (
|
||||
EFI_LIST_ENTRY *Entry
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Remove Node from the doubly linked list. It is the caller's responsibility
|
||||
to free any memory used by the entry if needed. The list must have been
|
||||
initialized with InitializeListHead () before using this function.
|
||||
|
||||
Arguments:
|
||||
|
||||
Entry - Element to remove from the list.
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_LIST_ENTRY *_ForwardLink;
|
||||
EFI_LIST_ENTRY *_BackLink;
|
||||
|
||||
_ForwardLink = Entry->ForwardLink;
|
||||
_BackLink = Entry->BackLink;
|
||||
_BackLink->ForwardLink = _ForwardLink;
|
||||
_ForwardLink->BackLink = _BackLink;
|
||||
|
||||
DEBUG_CODE (
|
||||
Entry->ForwardLink = (EFI_LIST_ENTRY *) EFI_BAD_POINTER;
|
||||
Entry->BackLink = (EFI_LIST_ENTRY *) EFI_BAD_POINTER;
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
InsertTailList (
|
||||
EFI_LIST_ENTRY *ListHead,
|
||||
EFI_LIST_ENTRY *Entry
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Insert a Node into the end of a doubly linked list. The list must have
|
||||
been initialized with InitializeListHead () before using this function.
|
||||
|
||||
Arguments:
|
||||
|
||||
ListHead - Head of doubly linked list
|
||||
|
||||
Entry - Element to insert at the end of the list.
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_LIST_ENTRY *_ListHead;
|
||||
EFI_LIST_ENTRY *_BackLink;
|
||||
|
||||
_ListHead = ListHead;
|
||||
_BackLink = _ListHead->BackLink;
|
||||
Entry->ForwardLink = _ListHead;
|
||||
Entry->BackLink = _BackLink;
|
||||
_BackLink->ForwardLink = Entry;
|
||||
_ListHead->BackLink = Entry;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
InsertHeadList (
|
||||
EFI_LIST_ENTRY *ListHead,
|
||||
EFI_LIST_ENTRY *Entry
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Insert a Node into the start of a doubly linked list. The list must have
|
||||
been initialized with InitializeListHead () before using this function.
|
||||
|
||||
Arguments:
|
||||
|
||||
ListHead - Head of doubly linked list
|
||||
|
||||
Entry - Element to insert to beginning of list
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_LIST_ENTRY *_ListHead;
|
||||
EFI_LIST_ENTRY *_ForwardLink;
|
||||
|
||||
_ListHead = ListHead;
|
||||
_ForwardLink = _ListHead->ForwardLink;
|
||||
Entry->ForwardLink = _ForwardLink;
|
||||
Entry->BackLink = _ListHead;
|
||||
_ForwardLink->BackLink = Entry;
|
||||
_ListHead->ForwardLink = Entry;
|
||||
}
|
||||
|
||||
VOID
|
||||
SwapListEntries (
|
||||
EFI_LIST_ENTRY *Entry1,
|
||||
EFI_LIST_ENTRY *Entry2
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Swap the location of the two elements of a doubly linked list. Node2
|
||||
is placed in front of Node1. The list must have been initialized with
|
||||
InitializeListHead () before using this function.
|
||||
|
||||
Arguments:
|
||||
|
||||
Entry1 - Element in the doubly linked list in front of Node2.
|
||||
|
||||
Entry2 - Element in the doubly linked list behind Node1.
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_LIST_ENTRY *Entry1ForwardLink;
|
||||
EFI_LIST_ENTRY *Entry1BackLink;
|
||||
EFI_LIST_ENTRY *Entry2ForwardLink;
|
||||
EFI_LIST_ENTRY *Entry2BackLink;
|
||||
|
||||
Entry2ForwardLink = Entry2->ForwardLink;
|
||||
Entry2BackLink = Entry2->BackLink;
|
||||
Entry1ForwardLink = Entry1->ForwardLink;
|
||||
Entry1BackLink = Entry1->BackLink;
|
||||
Entry2BackLink->ForwardLink = Entry2ForwardLink;
|
||||
Entry2ForwardLink->BackLink = Entry2BackLink;
|
||||
Entry2->ForwardLink = Entry1;
|
||||
Entry2->BackLink = Entry1BackLink;
|
||||
Entry1BackLink->ForwardLink = Entry2;
|
||||
Entry1->BackLink = Entry2;
|
||||
}
|
||||
|
||||
|
||||
EFI_LIST_ENTRY *
|
||||
GetFirstNode (
|
||||
EFI_LIST_ENTRY *List
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Return the first node pointed to by the list head. The list must
|
||||
have been initialized with InitializeListHead () before using this
|
||||
function and must contain data.
|
||||
|
||||
Arguments:
|
||||
|
||||
List - The head of the doubly linked list.
|
||||
|
||||
Returns:
|
||||
|
||||
Pointer to the first node, if the list contains nodes. The list will
|
||||
return a null value--that is, the value of List--when the list is empty.
|
||||
See the description of IsNull for more information.
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
return List->ForwardLink;
|
||||
}
|
||||
|
||||
|
||||
EFI_LIST_ENTRY *
|
||||
GetNextNode (
|
||||
EFI_LIST_ENTRY *List,
|
||||
EFI_LIST_ENTRY *Node
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Returns the node following Node in the list. The list must
|
||||
have been initialized with InitializeListHead () before using this
|
||||
function and must contain data.
|
||||
|
||||
Arguments:
|
||||
|
||||
List - The head of the list. MUST NOT be the literal value NULL.
|
||||
Node - The node in the list. This value MUST NOT be the literal value NULL.
|
||||
See the description of IsNull for more information.
|
||||
|
||||
Returns:
|
||||
|
||||
Pointer to the next node, if one exists. Otherwise, returns a null value,
|
||||
which is actually a pointer to List.
|
||||
See the description of IsNull for more information.
|
||||
|
||||
--*/
|
||||
{
|
||||
if (Node == List) {
|
||||
return List;
|
||||
}
|
||||
return Node->ForwardLink;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
IsNull (
|
||||
EFI_LIST_ENTRY *List,
|
||||
EFI_LIST_ENTRY *Node
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Determines whether the given node is null. Note that Node is null
|
||||
when its value is equal to the value of List. It is an error for
|
||||
Node to be the literal value NULL [(VOID*)0x0].
|
||||
|
||||
Arguments:
|
||||
|
||||
List - The head of the list. MUST NOT be the literal value NULL.
|
||||
Node - The node to test. MUST NOT be the literal value NULL. See
|
||||
the description above.
|
||||
|
||||
Returns:
|
||||
|
||||
Returns true if the node is null.
|
||||
|
||||
--*/
|
||||
{
|
||||
return (BOOLEAN)(Node == List);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
IsNodeAtEnd (
|
||||
EFI_LIST_ENTRY *List,
|
||||
EFI_LIST_ENTRY *Node
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Determines whether the given node is at the end of the list. Used
|
||||
to walk the list. The list must have been initialized with
|
||||
InitializeListHead () before using this function and must contain
|
||||
data.
|
||||
|
||||
Arguments:
|
||||
|
||||
List - The head of the list. MUST NOT be the literal value NULL.
|
||||
Node - The node to test. MUST NOT be the literal value NULL.
|
||||
See the description of IsNull for more information.
|
||||
|
||||
Returns:
|
||||
|
||||
Returns true if the list is the tail.
|
||||
|
||||
--*/
|
||||
{
|
||||
if (IsNull (List, Node)) {
|
||||
return FALSE;
|
||||
}
|
||||
return (BOOLEAN)(List->BackLink == Node);
|
||||
}
|
||||
|
Reference in New Issue
Block a user