4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for If and else shell level 1 function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UefiShellLevel1CommandsLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PrintLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PathLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndTagOr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndTagAnd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndTagThen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndTagMax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} END_TAG_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorGreaterThan,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorLessThan,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorNotEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorGreatorOrEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorLessOrEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorUnisgnedGreaterThan,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorUnsignedLessThan,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorUnsignedGreaterOrEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorUnsignedLessOrEqual,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperatorMax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} BIN_OPERATOR_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Extract the next fragment, if there is one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Statement The current remaining statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Fragment The current fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE There is not another fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE There is another fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsNextFragment (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CONST CHAR16 **Statement,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Fragment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Tester;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tester = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tester = StrnCatGrow(&Tester, NULL, *Statement, StrLen(Fragment));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Tester != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tester[StrLen(Fragment)] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)Fragment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tester) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // increment the string pointer to the end of what we found and then chop off spaces...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Statement+=StrLen(Fragment);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Statement[0] == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Statement)++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Tester);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Tester);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determine if String represents a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the string to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE String is a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE String is not a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsValidProfile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *ProfilesString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *TempLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProfilesString = ShellGetEnvironmentVariable(L"profiles");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ProfilesString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation = StrStr(ProfilesString, String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TempLocation != NULL) && (*(TempLocation-1) == L';') && (*(TempLocation+StrLen(String)) == L';')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Do a comparison between 2 things.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Compare1 The first item to compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Compare2 The second item to compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BinOp The type of comparison to perform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CaseInsensitive TRUE to do non-case comparison, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ForceStringCompare TRUE to force string comparison, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The result of the comparison.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTestOperation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Compare1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Compare2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BIN_OPERATOR_TYPE BinOp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN CaseInsensitive,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ForceStringCompare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Cmp1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Cmp2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // "Compare1 BinOp Compare2"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (BinOp) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorUnisgnedGreaterThan:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorGreaterThan:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) > 0) || (StringCompare(&Compare1, &Compare2) > 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BinOp == OperatorGreaterThan) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 > Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)Cmp1 > (UINTN)Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorUnsignedLessThan:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorLessThan:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) < 0) || (StringCompare(&Compare1, &Compare2) < 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BinOp == OperatorLessThan) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 < Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)Cmp1 < (UINTN)Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) == 0) || (StringCompare(&Compare1, &Compare2) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 == Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorNotEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) != 0) || (StringCompare(&Compare1, &Compare2) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 != Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorUnsignedGreaterOrEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorGreatorOrEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) >= 0) || (StringCompare(&Compare1, &Compare2) >= 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BinOp == OperatorGreatorOrEqual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 >= Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)Cmp1 >= (UINTN)Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorLessOrEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case OperatorUnsignedLessOrEqual:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) <= 0) || (StringCompare(&Compare1, &Compare2) <= 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = 0 - (INTN)ShellStrToUintn(Compare1+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp1 = (INTN)ShellStrToUintn(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare2[0] == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = 0 - (INTN)ShellStrToUintn(Compare2+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cmp2 = (INTN)ShellStrToUintn(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BinOp == OperatorLessOrEqual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cmp1 <= Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)Cmp1 <= (UINTN)Cmp2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Process an if statement and determine if its is valid or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] PassingState Opon entry, the current state. Upon exit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the new state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StartParameterNumber The number of the first parameter of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] EndParameterNumber The number of the final parameter of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OperatorToUse The type of termination operator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CaseInsensitive TRUE for case insensitive, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ForceStringCompare TRUE for all string based, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncProcessStatement (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT BOOLEAN *PassingState,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartParameterNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndParameterNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST END_TAG_TYPE OperatorToUse,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN CaseInsensitive,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ForceStringCompare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN OperationResult;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN NotPresent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StatementWalker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BIN_OPERATOR_TYPE BinOp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Compare1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Compare2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 HexString[20];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempSpot;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((END_TAG_TYPE)OperatorToUse != EndTagThen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"not")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NotPresent = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[++StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NotPresent = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now check for 'boolfunc' operators
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"isint")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && StatementWalker[StrLen(StatementWalker)-1] == L')') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker[StrLen(StatementWalker)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"isint");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"exists") || IsNextFragment((CONST CHAR16**)(&StatementWalker), L"exist")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && StatementWalker[StrLen(StatementWalker)-1] == L')') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker[StrLen(StatementWalker)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is what remains a file in CWD???
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = (BOOLEAN)(ShellFileExists(StatementWalker)==EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StatementWalker[0] == CHAR_NULL && StartParameterNumber+1 == EndParameterNumber) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = (BOOLEAN)(ShellFileExists(gEfiShellParametersProtocol->Argv[++StartParameterNumber])==EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"exist(s)");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"available")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && StatementWalker[StrLen(StatementWalker)-1] == L')') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker[StrLen(StatementWalker)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is what remains a file in the CWD or path???
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = (BOOLEAN)(ShellIsFileInPath(StatementWalker)==EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"available");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"profile")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && StatementWalker[StrLen(StatementWalker)-1] == L')') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Chop off that ')'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker[StrLen(StatementWalker)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = IsValidProfile(StatementWalker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"profile");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StartParameterNumber+1 >= EndParameterNumber) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be 'item binop item' style
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the first item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"efierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare1 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"pierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare1 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"oemerror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare1 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare1 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EndParameterNumber - StartParameterNumber > 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber+2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be a raw string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, StatementWalker, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the operator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(StartParameterNumber+1<EndParameterNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber+1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"gt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorGreaterThan;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"lt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorLessThan;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"eq")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ne")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorNotEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ge")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorGreatorOrEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"le")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorLessOrEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"==")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ugt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorUnisgnedGreaterThan;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ult")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorUnsignedLessThan;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"uge")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorUnsignedGreaterOrEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ule")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinOp = OperatorUnsignedLessOrEqual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_INVALID_BINOP), gShellLevel1HiiHandle, StatementWalker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the second item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(StartParameterNumber+2<=EndParameterNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber+2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"efierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare2 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // can this be collapsed into the above?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"pierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare2 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"oemerror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = StrStr(StatementWalker, L")");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempSpot = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare2 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker += StrLen(StatementWalker) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be a raw string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Compare2 == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, StatementWalker, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1 != NULL && Compare2 != NULL && BinOp != OperatorMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = TestOperation(Compare1, Compare2, BinOp, CaseInsensitive, ForceStringCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Compare1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Compare2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // done processing do result...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NotPresent) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = (BOOLEAN)(!OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch(OperatorToUse) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EndTagOr:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PassingState = (BOOLEAN)(*PassingState || OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EndTagAnd:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PassingState = (BOOLEAN)(*PassingState && OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EndTagMax:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PassingState = (BOOLEAN)(OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Break up the next part of the if statement (until the next 'and', 'or', or 'then').
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ParameterNumber The current parameter number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] EndParameter Upon successful return, will point to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter to start the next iteration with.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] EndTag Upon successful return, will point to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type that was found at the end of this statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE A valid statement was found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE A valid statement was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBuildNextStatement (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN ParameterNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *EndParameter,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT END_TAG_TYPE *EndTag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndTag = EndTagMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for(Buffer = NULL, BufferSize = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; ParameterNumber < gEfiShellParametersProtocol->Argc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; ParameterNumber++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"or") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndParameter = ParameterNumber - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndTag = EndTagOr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"and") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndParameter = ParameterNumber - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndTag = EndTagAnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"then") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndParameter = ParameterNumber - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndTag = EndTagThen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*EndTag == EndTagMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move the script file pointer to a different place in the script file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This one is special since it handles the if/else/endif syntax.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ScriptFile The script file from GetCurrnetScriptFile().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The move target was found and the move was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Something went wrong.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMoveToTagSpecial (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SCRIPT_FILE *ScriptFile
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_COMMAND_LIST *CommandNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TargetCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *CommandName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *CommandWalker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TargetCount = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ScriptFile == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (CommandNode = (SCRIPT_COMMAND_LIST *)GetNextNode(&ScriptFile->CommandList, &ScriptFile->CurrentCommand->Link), Found = FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&ScriptFile->CommandList, &CommandNode->Link) && !Found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CommandNode = (SCRIPT_COMMAND_LIST *)GetNextNode(&ScriptFile->CommandList, &CommandNode->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get just the first part of the command line...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandName = StrnCatGrow(&CommandName, NULL, CommandNode->Cl, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CommandName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandWalker = CommandName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (CommandWalker[0] == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandWalker++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation = StrStr(CommandWalker, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempLocation != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempLocation = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // did we find a nested item ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandWalker,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TargetCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (TargetCount == 1 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandWalker,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)L"else") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // else can only decrement the last part... not an nested if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // hence the TargetCount compare added
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TargetCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandWalker,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)L"endif") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TargetCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TargetCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)GetNextNode(&ScriptFile->CommandList, &CommandNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the memory for this loop...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(CommandName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Found);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Deal with the result of the if operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Result The result of the if.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The ending tag could not be found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPerformResultOperation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result || MoveToTagSpecial(ShellCommandGetCurrentScriptFile())) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'if' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunIf (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_STATUS ShellStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN CaseInsensitive;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN ForceString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CurrentParameter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN EndParameter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN CurrentValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_TAG_TYPE Ending;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_TAG_TYPE PreviousEnding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE *CurrentScriptFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CommandInit();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!gEfiShellProtocol->BatchIsActive()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"If");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol->Argc < 3) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure that an End exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"EnfIf",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the shell lib (we must be in non-auto-init...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellInitialize();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParameter = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndParameter = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[2],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gEfiShellParametersProtocol->Argc > 3 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[3],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CaseInsensitive = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParameter++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CaseInsensitive = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[2],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gEfiShellParametersProtocol->Argc > 3 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[3],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ForceString = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParameter++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ForceString = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ShellStatus = SHELL_SUCCESS, CurrentValue = FALSE, Ending = EndTagMax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentParameter < gEfiShellParametersProtocol->Argc && ShellStatus == SHELL_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentParameter++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[CurrentParameter],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"then") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we are at the then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParameter+1 != gEfiShellParametersProtocol->Argc) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TEXT_AFTER_THEN), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PerformResultOperation(CurrentValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousEnding = Ending;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // build up the next statement for analysis
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BuildNextStatement(CurrentParameter, &EndParameter, &Ending)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Then",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Analyze the statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessStatement(&CurrentValue, CurrentParameter, EndParameter, PreviousEnding, CaseInsensitive, ForceString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Optomize to get out of the loop early...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Ending == EndTagOr && CurrentValue) || (Ending == EndTagAnd && !CurrentValue)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PerformResultOperation(CurrentValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParameter = EndParameter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip over the or or and parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ending == EndTagOr || Ending == EndTagAnd) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParameter++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'else' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunElse (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE *CurrentScriptFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(CommandInit());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol->Argc > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!gEfiShellProtocol->BatchIsActive()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Else");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Else",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"else", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Else",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, FALSE, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"EndIf",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Else",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'endif' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunEndIf (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE *CurrentScriptFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(CommandInit());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol->Argc > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!gEfiShellProtocol->BatchIsActive()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Endif");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"EndIf",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && CurrentScriptFile->CurrentCommand!=NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ? CurrentScriptFile->CurrentCommand->Line:0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}