Fixed: - Removed unused variables - Function does not return value. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14796 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			355 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			355 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2004, 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        
 | 
						|
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 *Entry1BackLink;
 | 
						|
  EFI_LIST_ENTRY *Entry2ForwardLink;
 | 
						|
  EFI_LIST_ENTRY *Entry2BackLink;
 | 
						|
 | 
						|
  Entry2ForwardLink           = Entry2->ForwardLink;          
 | 
						|
  Entry2BackLink              = Entry2->BackLink;                
 | 
						|
  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);
 | 
						|
}
 | 
						|
 |