Trailing spaces create issue/warning when generating/applying patches. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ronald Cron <ronald.cron@arm.com> Reviewed-By: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15833 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Glue code that contains the EFI entry point and converts it to an EBL
 | 
						|
  ASCII Argc, Argv sytle entry point
 | 
						|
 | 
						|
 | 
						|
  Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
 | 
						|
  Portions copyright (c) 2008 - 2009, Apple Inc. 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 "Ebl.h"
 | 
						|
 | 
						|
#define CMD_SEPARATOR     ';'
 | 
						|
#define MAX_ARGS          32
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EblMain (
 | 
						|
  IN UINTN  Argc,
 | 
						|
  IN CHAR8  **Argv
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
///
 | 
						|
/// EdkExternCmdEntry() & ParseArguments() convert the standard EFI entry point
 | 
						|
/// into Argc, Argv form that calls EblMain().
 | 
						|
///
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Parse the CmdLine and break it up into Argc (arg count) and Argv (array of
 | 
						|
  pointers to each argument). The Cmd buffer is altered and separators are
 | 
						|
  converted to string terminators. This allows Argv to point into CmdLine.
 | 
						|
  A CmdLine can support multiple commands. The next command in the command line
 | 
						|
  is returned if it exists.
 | 
						|
 | 
						|
  @param  CmdLine     String to parse for a set of commands
 | 
						|
  @param  CmdLineSize Size of CmdLine in bytes
 | 
						|
  @param  Argc        Returns the number of arguments in the CmdLine current command
 | 
						|
  @param  Argv        Argc pointers to each string in CmdLine
 | 
						|
 | 
						|
  @return Next Command in the command line or NULL if non exists
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ParseArguments (
 | 
						|
  IN  CHAR8  *CmdLine,
 | 
						|
  IN  UINTN  CmdLineSize,
 | 
						|
  OUT UINTN  *Argc,
 | 
						|
  OUT CHAR8  **Argv
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN   Arg;
 | 
						|
  CHAR8   *Char;
 | 
						|
  BOOLEAN LookingForArg;
 | 
						|
  BOOLEAN InQuote;
 | 
						|
  UINTN   Index;
 | 
						|
 | 
						|
  *Argc = 0;
 | 
						|
  if ((CmdLineSize == 0) || (AsciiStrLen (CmdLine) == 0)) {
 | 
						|
    // basic error checking failed on the arguments
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // Walk a single command line. A CMD_SEPARATOR allows multiple commands on a single line
 | 
						|
  InQuote       = FALSE;
 | 
						|
  LookingForArg = TRUE;
 | 
						|
  for (Char = CmdLine, Arg = 0, Index = 0; *Char != '\0' && *Char != CMD_SEPARATOR; Char++, Index++) {
 | 
						|
    // Perform any text conversion here
 | 
						|
    if (*Char == '\t') {
 | 
						|
      // TAB to space
 | 
						|
      *Char = ' ';
 | 
						|
    }
 | 
						|
 | 
						|
    if (LookingForArg) {
 | 
						|
      // Look for the beginning of an Argv[] entry
 | 
						|
      if (*Char == '"') {
 | 
						|
        Argv[Arg++] = ++Char;
 | 
						|
        LookingForArg = FALSE;
 | 
						|
        InQuote = TRUE;
 | 
						|
      } else if (*Char != ' ') {
 | 
						|
        Argv[Arg++] = Char;
 | 
						|
        LookingForArg = FALSE;
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      // Looking for the terminator of an Argv[] entry
 | 
						|
      if ((InQuote && (*Char == '"')) || (!InQuote && (*Char == ' '))) {
 | 
						|
        *Char = '\0';
 | 
						|
        LookingForArg = TRUE;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if ((Arg >= MAX_ARGS) || (Index > CmdLineSize)) {
 | 
						|
      // Error check buffer and exit since it does not look valid
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  *Argc = Arg;
 | 
						|
 | 
						|
  if (*Char == CMD_SEPARATOR) {
 | 
						|
    // Replace the command delimiter with null
 | 
						|
    *Char = '\0';
 | 
						|
  }
 | 
						|
 | 
						|
  return;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Embedded Boot Loader (EBL) - A simple EFI command line application for embedded
 | 
						|
  devices. PcdEmbeddedAutomaticBootCommand is a complied in command line that
 | 
						|
  gets executed automatically. The ; separator allows multiple commands
 | 
						|
  for each command line.
 | 
						|
 | 
						|
  @param  ImageHandle   EFI ImageHandle for this application.
 | 
						|
  @param  SystemTable   EFI system table
 | 
						|
 | 
						|
  @return EFI status of the application
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
EdkExternCmdEntry (
 | 
						|
  IN EFI_HANDLE                            ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE                      *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                  Status;
 | 
						|
  EFI_LOADED_IMAGE_PROTOCOL   *ImageInfo;
 | 
						|
  UINTN                       Argc;
 | 
						|
  CHAR8                       *Argv[MAX_ARGS];
 | 
						|
 | 
						|
  Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&ImageInfo);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    Argc = 0;
 | 
						|
  } else {
 | 
						|
    // Looks like valid commands were passed in.
 | 
						|
    ParseArguments (ImageInfo->LoadOptions, ImageInfo->LoadOptionsSize, &Argc, Argv);
 | 
						|
  }
 | 
						|
 | 
						|
  return EblMain (Argc, Argv);
 | 
						|
}
 | 
						|
 | 
						|
 |