4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for If and else shell level 1 function.
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 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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Extract the next fragment, if there is one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Statement The current remaining statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Fragment The current fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE There is not another fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE There is another fragment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tester = StrnCatGrow(&Tester, NULL, *Statement, StrLen(Fragment));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // increment the string pointer to the end of what we found and then chop off spaces...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determine if String represents a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the string to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE String is a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE String is not a valid profile.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProfilesString = ShellGetEnvironmentVariable(L"profiles");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TempLocation != NULL) && (*(TempLocation-1) == L';') && (*(TempLocation+StrLen(String)) == L';')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Do a comparison between 2 things.
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 @return The result of the comparison.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // "Compare1 BinOp Compare2"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) > 0) || (StringCompare(&Compare1, &Compare2) > 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) < 0) || (StringCompare(&Compare1, &Compare2) < 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) == 0) || (StringCompare(&Compare1, &Compare2) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) != 0) || (StringCompare(&Compare1, &Compare2) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) >= 0) || (StringCompare(&Compare1, &Compare2) >= 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ForceStringCompare || !ShellIsHexOrDecimalNumber(Compare1, FALSE, FALSE) || !ShellIsHexOrDecimalNumber(Compare2, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // string compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CaseInsensitive && StringNoCaseCompare(&Compare1, &Compare2) <= 0) || (StringCompare(&Compare1, &Compare2) <= 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numeric compare
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Process an if statement and determine if its is valid or not.
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 @retval EFI_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"not")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[++StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now check for 'boolfunc' operators
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 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"isint");
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 // is what remains a file in CWD???
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 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"exist(s)");
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 // is what remains a file in the CWD or path???
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = (BOOLEAN)(ShellIsFileInPath(StatementWalker)==EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"available");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"profile")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && StatementWalker[StrLen(StatementWalker)-1] == L')') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Chop off that ')'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker[StrLen(StatementWalker)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"profile");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StartParameterNumber+1 >= EndParameterNumber) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be 'item binop item' style
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the first item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"efierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"pierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"oemerror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EndParameterNumber - StartParameterNumber > 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber+2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be a raw string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare1 = StrnCatGrow(&Compare1, NULL, StatementWalker, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the operator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber+1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"gt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"lt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"eq")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ne")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ge")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"le")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"==")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ugt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ult")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"uge")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"ule")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_INVALID_BINOP), gShellLevel1HiiHandle, StatementWalker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the second item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(StartParameterNumber+2<=EndParameterNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementWalker = gEfiShellParametersProtocol->Argv[StartParameterNumber+2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"efierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // can this be collapsed into the above?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"pierror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"oemerror")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNextFragment((CONST CHAR16**)(&StatementWalker), L"(") && TempSpot != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsHexOrDecimalNumber(StatementWalker, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(HexString, sizeof(HexString), L"0x%x", ShellStrToUintn(StatementWalker)|MAX_BIT|(MAX_BIT>>1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, HexString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must be a raw string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compare2 = StrnCatGrow(&Compare2, NULL, StatementWalker, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Compare1 != NULL && Compare2 != NULL && BinOp != OperatorMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OperationResult = TestOperation(Compare1, Compare2, BinOp, CaseInsensitive, ForceStringCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // done processing do result...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PassingState = (BOOLEAN)(*PassingState || OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PassingState = (BOOLEAN)(*PassingState && OperationResult);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Break up the next part of the if statement (until the next 'and', 'or', or 'then').
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 @retval TRUE A valid statement was found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE A valid statement was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; ParameterNumber < gEfiShellParametersProtocol->Argc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"or") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"and") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[ParameterNumber],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"then") == 0) {
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 @param[in] ScriptFile The script file from GetCurrnetScriptFile().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The move target was found and the move was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Something went wrong.
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 // get just the first part of the command line...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandName = StrnCatGrow(&CommandName, NULL, CommandNode->Cl, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // did we find a nested item ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"If") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (TargetCount == 1 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // else can only decrement the last part... not an nested if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // hence the TargetCount compare added
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)GetNextNode(&ScriptFile->CommandList, &CommandNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the memory for this loop...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Deal with the result of the if operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Result The result of the if.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The ending tag could not be found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result || MoveToTagSpecial(ShellCommandGetCurrentScriptFile())) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'if' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"If");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure that an End exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the shell lib (we must be in non-auto-init...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gEfiShellParametersProtocol->Argc > 3 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/i") == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gEfiShellParametersProtocol->Argc > 3 && gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"/s") == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ShellStatus = SHELL_SUCCESS, CurrentValue = FALSE, Ending = EndTagMax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentParameter < gEfiShellParametersProtocol->Argc && ShellStatus == SHELL_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argv[CurrentParameter],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"then") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we are at the then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParameter+1 != gEfiShellParametersProtocol->Argc) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TEXT_AFTER_THEN), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // build up the next statement for analysis
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BuildNextStatement(CurrentParameter, &EndParameter, &Ending)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Analyze the statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessStatement(&CurrentValue, CurrentParameter, EndParameter, PreviousEnding, CaseInsensitive, ForceString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Optomize to get out of the loop early...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Ending == EndTagOr && CurrentValue) || (Ending == EndTagAnd && !CurrentValue)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip over the or or and parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'else' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Else");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"else", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, FALSE, FALSE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'endif' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Endif");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentScriptFile = ShellCommandGetCurrentScriptFile();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MoveToTag(GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) {