From cbca8de5884ff62614e78076dffc093e8373e492 Mon Sep 17 00:00:00 2001 From: mdkinney Date: Sat, 21 Nov 2009 21:57:11 +0000 Subject: [PATCH] 1) Add new BaseLib API GetPreviousNode() 2) Clarify comment for the value returned from GetNextNode() if the end of list is reached. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9464 6f19259b-4bc3-4df7-8a09-765794883524 --- MdePkg/Include/Library/BaseLib.h | 32 +++++++++++++++++++++-- MdePkg/Library/BaseLib/LinkedList.c | 39 +++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index 05014a3b6d..e63831e059 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -1383,8 +1383,7 @@ GetFirstNode ( @param List A pointer to the head node of a doubly linked list. @param Node A pointer to a node in the doubly linked list. - @return Pointer to the next node if one exists. Otherwise a null value which - is actually List is returned. + @return Pointer to the next node if one exists. Otherwise List is returned. **/ LIST_ENTRY * @@ -1394,7 +1393,36 @@ GetNextNode ( IN CONST LIST_ENTRY *Node ); + +/** + Retrieves the previous node of a doubly linked list. + + Returns the node of a doubly linked list that precedes Node. + List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + or InitializeListHead(). If List is empty, then List is returned. + + If List is NULL, then ASSERT(). + If Node is NULL, then ASSERT(). + If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + InitializeListHead(), then ASSERT(). + If PcdMaximumLinkedListLenth is not zero, and List contains more than + PcdMaximumLinkedListLenth nodes, then ASSERT(). + If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT(). + + @param List A pointer to the head node of a doubly linked list. + @param Node A pointer to a node in the doubly linked list. + + @return Pointer to the previous node if one exists. Otherwise List is returned. + +**/ +LIST_ENTRY * +EFIAPI +GetPreviousNode ( + IN CONST LIST_ENTRY *List, + IN CONST LIST_ENTRY *Node + ); + /** Checks to see if a doubly linked list is empty or not. diff --git a/MdePkg/Library/BaseLib/LinkedList.c b/MdePkg/Library/BaseLib/LinkedList.c index 3ff582a978..0c811b0bff 100644 --- a/MdePkg/Library/BaseLib/LinkedList.c +++ b/MdePkg/Library/BaseLib/LinkedList.c @@ -276,8 +276,7 @@ GetFirstNode ( @param List A pointer to the head node of a doubly linked list. @param Node A pointer to a node in the doubly linked list. - @return Pointer to the next node if one exists. Otherwise a null value which - is actually List is returned. + @return Pointer to the next node if one exists. Otherwise List is returned. **/ LIST_ENTRY * @@ -295,6 +294,42 @@ GetNextNode ( return Node->ForwardLink; } +/** + Retrieves the previous node of a doubly linked list. + + Returns the node of a doubly linked list that precedes Node. + List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + or InitializeListHead(). If List is empty, then List is returned. + + If List is NULL, then ASSERT(). + If Node is NULL, then ASSERT(). + If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + InitializeListHead(), then ASSERT(). + If PcdMaximumLinkedListLenth is not zero, and List contains more than + PcdMaximumLinkedListLenth nodes, then ASSERT(). + If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT(). + + @param List A pointer to the head node of a doubly linked list. + @param Node A pointer to a node in the doubly linked list. + + @return Pointer to the previous node if one exists. Otherwise List is returned. + +**/ +LIST_ENTRY * +EFIAPI +GetPreviousNode ( + IN CONST LIST_ENTRY *List, + IN CONST LIST_ENTRY *Node + ) +{ + // + // ASSERT List not too long and Node is one of the nodes of List + // + ASSERT (InternalBaseLibIsNodeInList (List, Node, TRUE)); + + return Node->BackLink; +} + /** Checks to see if a doubly linked list is empty or not. -- 2.39.2