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)}
|
#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
|
Initializes the head node of a doubly linked list, and returns the pointer to
|
||||||
the head node of the doubly linked list.
|
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.
|
Worker function that returns a bit field from Operand.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Linked List Library Functions.
|
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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -112,6 +112,70 @@ InternalBaseLibIsNodeInList (
|
||||||
return TRUE;
|
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
|
Initializes the head node of a doubly-linked list, and returns the pointer to
|
||||||
the head node of the doubly-linked list.
|
the head node of the doubly-linked list.
|
||||||
|
|
Loading…
Reference in New Issue