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);
 | |
| }
 | |
| 
 | |
| 
 |