ShellPkg: Fixes and updates for the 'parse' command

- Fix SFO file parsing to match UEFI Shell 2.1 spec
- Update help output for easier viewing

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chris Phillips <chrisp@hp.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15873 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chris Phillips
2014-08-21 20:28:32 +00:00
committed by jcarsey
parent 73768087c4
commit 78d42190ce
2 changed files with 42 additions and 34 deletions

View File

@ -1,6 +1,7 @@
/** @file /** @file
Main file for Parse shell level 2 function. Main file for Parse shell level 2 function.
(C) Copyright 2013-2014, Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -56,13 +57,22 @@ PerformParsing(
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, FileName); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, FileName);
ShellStatus = SHELL_NOT_FOUND; ShellStatus = SHELL_NOT_FOUND;
} else if (!EFI_ERROR (FileHandleIsDirectory (FileHandle))) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_FILE), gShellLevel2HiiHandle, FileName);
ShellStatus = SHELL_NOT_FOUND;
} else { } else {
for (LoopVariable = 0 ; LoopVariable < ShellCommandInstance && !ShellFileHandleEof(FileHandle);) { for (LoopVariable = 0 ; LoopVariable < ShellCommandInstance && !ShellFileHandleEof(FileHandle);) {
TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii); TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii);
if (TempLine == NULL) { if (TempLine == NULL) {
break; break;
} }
if (StrStr(TempLine, L"ShellCommand, \"") == TempLine) {
//
// Search for "ShellCommand," in the file to start the SFO table
// for a given ShellCommand. The UEFI Shell spec does not specify
// a space after the comma.
//
if (StrStr (TempLine, L"ShellCommand,") == TempLine) {
LoopVariable++; LoopVariable++;
} }
SHELL_FREE_NON_NULL(TempLine); SHELL_FREE_NON_NULL(TempLine);
@ -71,45 +81,43 @@ PerformParsing(
LoopVariable = 0; LoopVariable = 0;
while(1) { while(1) {
TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii); TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii);
if ( TempLine == NULL if (TempLine == NULL
|| *TempLine == CHAR_NULL || *TempLine == CHAR_NULL
|| StrStr(TempLine, L"ShellCommand, \"") == TempLine || StrStr (TempLine, L"ShellCommand,") == TempLine) {
){
SHELL_FREE_NON_NULL(TempLine); SHELL_FREE_NON_NULL(TempLine);
break; break;
} }
if (StrStr(TempLine, TableName) == TempLine) { if (StrStr (TempLine, TableName) == TempLine) {
LoopVariable++; LoopVariable++;
} if (LoopVariable == TableNameInstance
if ( LoopVariable == TableNameInstance || (TableNameInstance == (UINTN)-1)) {
|| (TableNameInstance == (UINTN)-1 && StrStr(TempLine, TableName) == TempLine) for (ColumnLoop = 1, ColumnPointer = TempLine; ColumnLoop < ColumnIndex && ColumnPointer != NULL && *ColumnPointer != CHAR_NULL; ColumnLoop++) {
){ ColumnPointer = StrStr (ColumnPointer, L",");
for (ColumnLoop = 1, ColumnPointer = TempLine; ColumnLoop < ColumnIndex && ColumnPointer != NULL && *ColumnPointer != CHAR_NULL; ColumnLoop++) { if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL){
ColumnPointer = StrStr(ColumnPointer, L","); ColumnPointer++;
if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL){ }
ColumnPointer++;
} }
} if (ColumnLoop == ColumnIndex) {
if (ColumnLoop == ColumnIndex) { if (ColumnPointer == NULL) {
if (ColumnPointer == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"Column Index");
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"Column Index"); ShellStatus = SHELL_INVALID_PARAMETER;
ShellStatus = SHELL_INVALID_PARAMETER; } else {
} else { TempSpot = StrStr (ColumnPointer, L",");
TempSpot = StrStr(ColumnPointer, L","); if (TempSpot != NULL) {
if (TempSpot != NULL) { *TempSpot = CHAR_NULL;
*TempSpot = CHAR_NULL; }
} while (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L' '){
while (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L' '){ ColumnPointer++;
ColumnPointer++; }
} if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L'\"'){
if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L'\"'){ ColumnPointer++;
ColumnPointer++; }
} if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen (ColumnPointer) - 1] == L'\"'){
if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen(ColumnPointer)-1] == L'\"'){ ColumnPointer[StrLen (ColumnPointer) - 1] = CHAR_NULL;
ColumnPointer[StrLen(ColumnPointer)-1] = CHAR_NULL; }
}
ShellPrintEx(-1, -1, L"%s\r\n", ColumnPointer); ShellPrintEx (-1, -1, L"%s\r\n", ColumnPointer);
}
} }
} }
} }