mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +01:00 
			
		
		
		
	Cc: Liming Gao <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			212 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
Helper functions for parsing GuidedSectionTools.txt
 | 
						|
 | 
						|
Copyright (c) 2007 - 2016, 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.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <string.h>
 | 
						|
#include <ctype.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include "MemoryFile.h"
 | 
						|
#include "CommonLib.h"
 | 
						|
#include "EfiUtilityMsgs.h"
 | 
						|
#include "ParseInf.h"
 | 
						|
#include "ParseGuidedSectionTools.h"
 | 
						|
#include "StringFuncs.h"
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// Local types / structures
 | 
						|
//
 | 
						|
 | 
						|
typedef struct _GUID_SEC_TOOL_ENTRY {
 | 
						|
  EFI_GUID   Guid;
 | 
						|
  CHAR8*     Name;
 | 
						|
  CHAR8*     Path;
 | 
						|
  struct _GUID_SEC_TOOL_ENTRY *Next;
 | 
						|
} GUID_SEC_TOOL_ENTRY;
 | 
						|
 | 
						|
//
 | 
						|
// Functin Implementation
 | 
						|
//
 | 
						|
 | 
						|
EFI_HANDLE
 | 
						|
ParseGuidedSectionToolsFile (
 | 
						|
  IN CHAR8    *InputFile
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  This function parses the tools_def.txt file.  It returns a
 | 
						|
  EFI_HANDLE object which can be used for the other library
 | 
						|
  functions and should be passed to FreeParsedGuidedSectionToolsHandle
 | 
						|
  to free resources when the tools_def.txt information is no
 | 
						|
  longer needed.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  InputFile     Path name of file to read
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  NULL if error parsing
 | 
						|
  A non-NULL EFI_HANDLE otherwise
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS Status;
 | 
						|
  EFI_HANDLE MemoryFile;
 | 
						|
  EFI_HANDLE ParsedGuidedSectionTools;
 | 
						|
 | 
						|
  Status = GetMemoryFile (InputFile, &MemoryFile);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  ParsedGuidedSectionTools = ParseGuidedSectionToolsMemoryFile (MemoryFile);
 | 
						|
 | 
						|
  FreeMemoryFile (MemoryFile);
 | 
						|
  
 | 
						|
  return ParsedGuidedSectionTools;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_HANDLE
 | 
						|
ParseGuidedSectionToolsMemoryFile (
 | 
						|
  IN EFI_HANDLE    InputFile
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  This function parses the tools_def.txt file.  It returns a
 | 
						|
  EFI_HANDLE object which can be used for the other library
 | 
						|
  functions and should be passed to FreeParsedGuidedSectionToolsHandle
 | 
						|
  to free resources when the tools_def.txt information is no
 | 
						|
  longer needed.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  InputFile     Memory file image.
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  NULL if error or EOF
 | 
						|
  InputBuffer otherwise
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
  CHAR8       *NextLine;
 | 
						|
  STRING_LIST *Tool;
 | 
						|
  EFI_GUID    Guid;
 | 
						|
  GUID_SEC_TOOL_ENTRY *FirstGuidTool;
 | 
						|
  GUID_SEC_TOOL_ENTRY *LastGuidTool;
 | 
						|
  GUID_SEC_TOOL_ENTRY *NewGuidTool;
 | 
						|
 | 
						|
  FirstGuidTool = NULL;
 | 
						|
  LastGuidTool  = NULL;
 | 
						|
 | 
						|
  while (TRUE) {
 | 
						|
    NextLine = ReadMemoryFileLine (InputFile);
 | 
						|
    if (NextLine == NULL) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    
 | 
						|
    Status = StripInfDscStringInPlace (NextLine);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      free (NextLine);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    if (NextLine[0] == '\0') {
 | 
						|
      free (NextLine);
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    Tool = SplitStringByWhitespace (NextLine);
 | 
						|
    if ((Tool != NULL) &&
 | 
						|
        (Tool->Count == 3)
 | 
						|
       ) {
 | 
						|
      Status = StringToGuid (Tool->Strings[0], &Guid);
 | 
						|
      if (!EFI_ERROR (Status)) {
 | 
						|
        NewGuidTool = malloc (sizeof (GUID_SEC_TOOL_ENTRY));
 | 
						|
        if (NewGuidTool != NULL) {
 | 
						|
          memcpy (&(NewGuidTool->Guid), &Guid, sizeof (Guid));
 | 
						|
          NewGuidTool->Name = CloneString(Tool->Strings[1]);
 | 
						|
          NewGuidTool->Path = CloneString(Tool->Strings[2]);
 | 
						|
          NewGuidTool->Next = NULL;
 | 
						|
 | 
						|
          if (FirstGuidTool == NULL) {
 | 
						|
            FirstGuidTool = NewGuidTool;
 | 
						|
          } else {
 | 
						|
            LastGuidTool->Next = NewGuidTool;
 | 
						|
          }
 | 
						|
          LastGuidTool = NewGuidTool;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (Tool != NULL) {
 | 
						|
      FreeStringList (Tool);
 | 
						|
    }
 | 
						|
    free (NextLine);
 | 
						|
  }
 | 
						|
 | 
						|
  return FirstGuidTool;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
CHAR8*
 | 
						|
LookupGuidedSectionToolPath (
 | 
						|
  IN EFI_HANDLE ParsedGuidedSectionToolsHandle,
 | 
						|
  IN EFI_GUID   *SectionGuid
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  This function looks up the appropriate tool to use for extracting
 | 
						|
  a GUID defined FV section.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  ParsedGuidedSectionToolsHandle    A parsed GUID section tools handle.
 | 
						|
  SectionGuid                       The GUID for the section.
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  NULL     - if no tool is found or there is another error
 | 
						|
  Non-NULL - The tool to use to access the section contents.  (The caller
 | 
						|
             must free the memory associated with this string.)
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  GUID_SEC_TOOL_ENTRY *GuidTool;
 | 
						|
 | 
						|
  GuidTool = (GUID_SEC_TOOL_ENTRY*)ParsedGuidedSectionToolsHandle;
 | 
						|
  if (GuidTool == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  for ( ; GuidTool != NULL; GuidTool = GuidTool->Next) {
 | 
						|
    if (CompareGuid (&(GuidTool->Guid), SectionGuid) == 0) {
 | 
						|
      return CloneString (GuidTool->Path);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
 |