mirror of https://github.com/acidanthera/audk.git
MdePkg/BaseLib: Add IsNodeInList() function.
This patch adds IsNodeInList() to BaseLib, which verifies the given Node is part of the doubly-linked List provided. V2: - Rename "List" to "FirstEntry" and "Node" to "SecondEntry" to clarify that "FirstEntry" does not need to be the doubly-linked list's head node. V3: - Remove ASSERTs from IsNodeInList() which are present in InternalBaseLibIsListValid(). Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Marvin Haeuser <Marvin.Haeuser@outlook.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
8a765da2a3
commit
d0aef615ac
|
@ -2868,6 +2868,33 @@ PathCleanUpDirectories(
|
|||
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&(ListHead), &(ListHead)}
|
||||
|
||||
|
||||
/**
|
||||
Checks whether FirstEntry and SecondEntry are part of the same doubly-linked
|
||||
list.
|
||||
|
||||
If FirstEntry is NULL, then ASSERT().
|
||||
If FirstEntry->ForwardLink is NULL, then ASSERT().
|
||||
If FirstEntry->BackLink is NULL, then ASSERT().
|
||||
If SecondEntry is NULL, then ASSERT();
|
||||
If PcdMaximumLinkedListLength is not zero, and List contains more than
|
||||
PcdMaximumLinkedListLength nodes, then ASSERT().
|
||||
|
||||
@param FirstEntry A pointer to a node in a linked list.
|
||||
@param SecondEntry A pointer to the node to locate.
|
||||
|
||||
@retval TRUE SecondEntry is in the same doubly-linked list as FirstEntry.
|
||||
@retval FALSE SecondEntry isn't in the same doubly-linked list as FirstEntry,
|
||||
or FirstEntry is invalid.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsNodeInList (
|
||||
IN CONST LIST_ENTRY *FirstEntry,
|
||||
IN CONST LIST_ENTRY *SecondEntry
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Initializes the head node of a doubly linked list, and returns the pointer to
|
||||
the head node of the doubly linked list.
|
||||
|
|
|
@ -339,34 +339,6 @@ InternalSwitchStack (
|
|||
);
|
||||
|
||||
|
||||
/**
|
||||
Worker function that locates the Node in the List.
|
||||
|
||||
By searching the List, finds the location of the Node in List. At the same time,
|
||||
verifies the validity of this list.
|
||||
|
||||
If List is NULL, then ASSERT().
|
||||
If List->ForwardLink is NULL, then ASSERT().
|
||||
If List->backLink is NULL, then ASSERT().
|
||||
If Node is NULL, then ASSERT();
|
||||
If PcdMaximumLinkedListLength is not zero, and prior to insertion the number
|
||||
of nodes in ListHead, including the ListHead node, is greater than or
|
||||
equal to PcdMaximumLinkedListLength, then ASSERT().
|
||||
|
||||
@param List A pointer to a node in a linked list.
|
||||
@param Node A pointer to one nod.
|
||||
|
||||
@retval TRUE Node is in List.
|
||||
@retval FALSE Node isn't in List, or List is invalid.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsNodeInList (
|
||||
IN CONST LIST_ENTRY *List,
|
||||
IN CONST LIST_ENTRY *Node
|
||||
);
|
||||
|
||||
/**
|
||||
Worker function that returns a bit field from Operand.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Linked List Library Functions.
|
||||
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||
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
|
||||
|
@ -112,6 +112,70 @@ InternalBaseLibIsNodeInList (
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Checks whether FirstEntry and SecondEntry are part of the same doubly-linked
|
||||
list.
|
||||
|
||||
If FirstEntry is NULL, then ASSERT().
|
||||
If FirstEntry->ForwardLink is NULL, then ASSERT().
|
||||
If FirstEntry->BackLink is NULL, then ASSERT().
|
||||
If SecondEntry is NULL, then ASSERT();
|
||||
If PcdMaximumLinkedListLength is not zero, and List contains more than
|
||||
PcdMaximumLinkedListLength nodes, then ASSERT().
|
||||
|
||||
@param FirstEntry A pointer to a node in a linked list.
|
||||
@param SecondEntry A pointer to the node to locate.
|
||||
|
||||
@retval TRUE SecondEntry is in the same doubly-linked list as FirstEntry.
|
||||
@retval FALSE SecondEntry isn't in the same doubly-linked list as FirstEntry,
|
||||
or FirstEntry is invalid.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsNodeInList (
|
||||
IN CONST LIST_ENTRY *FirstEntry,
|
||||
IN CONST LIST_ENTRY *SecondEntry
|
||||
)
|
||||
{
|
||||
UINTN Count;
|
||||
CONST LIST_ENTRY *Ptr;
|
||||
|
||||
//
|
||||
// ASSERT List not too long
|
||||
//
|
||||
ASSERT (InternalBaseLibIsListValid (FirstEntry));
|
||||
|
||||
ASSERT (SecondEntry != NULL);
|
||||
|
||||
Count = 0;
|
||||
Ptr = FirstEntry;
|
||||
|
||||
//
|
||||
// Check to see if SecondEntry is a member of FirstEntry.
|
||||
// Exit early if the number of nodes in List >= PcdMaximumLinkedListLength
|
||||
//
|
||||
do {
|
||||
Ptr = Ptr->ForwardLink;
|
||||
if (PcdGet32 (PcdMaximumLinkedListLength) > 0) {
|
||||
Count++;
|
||||
|
||||
//
|
||||
// Return if the linked list is too long
|
||||
//
|
||||
if (Count == PcdGet32 (PcdMaximumLinkedListLength)) {
|
||||
return (BOOLEAN)(Ptr == SecondEntry);
|
||||
}
|
||||
}
|
||||
|
||||
if (Ptr == SecondEntry) {
|
||||
return TRUE;
|
||||
}
|
||||
} while (Ptr != FirstEntry);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
Initializes the head node of a doubly-linked list, and returns the pointer to
|
||||
the head node of the doubly-linked list.
|
||||
|
|
Loading…
Reference in New Issue