]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel1CommandsLib / Goto.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for goto shell level 1 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 7\r
8**/\r
9\r
10#include "UefiShellLevel1CommandsLib.h"\r
11\r
12/**\r
13 Function for 'goto' command.\r
14\r
15 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
16 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
17**/\r
18SHELL_STATUS\r
19EFIAPI\r
20ShellCommandRunGoto (\r
21 IN EFI_HANDLE ImageHandle,\r
22 IN EFI_SYSTEM_TABLE *SystemTable\r
23 )\r
24{\r
47d20b54
MK
25 EFI_STATUS Status;\r
26 LIST_ENTRY *Package;\r
27 CHAR16 *ProblemParam;\r
28 SHELL_STATUS ShellStatus;\r
29 CHAR16 *CompareString;\r
30 UINTN Size;\r
31 SCRIPT_FILE *CurrentScriptFile;\r
a405b86d 32\r
47d20b54
MK
33 ShellStatus = SHELL_SUCCESS;\r
34 CompareString = NULL;\r
a405b86d 35\r
36 //\r
37 // initialize the shell lib (we must be in non-auto-init...)\r
38 //\r
47d20b54
MK
39 Status = ShellInitialize ();\r
40 ASSERT_EFI_ERROR (Status);\r
a405b86d 41\r
47d20b54
MK
42 Status = CommandInit ();\r
43 ASSERT_EFI_ERROR (Status);\r
a405b86d 44\r
47d20b54
MK
45 if (!gEfiShellProtocol->BatchIsActive ()) {\r
46 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Goto");\r
a405b86d 47 return (SHELL_UNSUPPORTED);\r
48 }\r
49\r
50 //\r
51 // parse the command line\r
52 //\r
53 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
54 if (EFI_ERROR (Status)) {\r
55 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
56 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"goto", ProblemParam);\r
57 FreePool (ProblemParam);\r
a405b86d 58 ShellStatus = SHELL_INVALID_PARAMETER;\r
59 } else {\r
47d20b54 60 ASSERT (FALSE);\r
a405b86d 61 }\r
62 } else {\r
47d20b54
MK
63 if (ShellCommandLineGetRawValue (Package, 2) != NULL) {\r
64 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"goto");\r
a405b86d 65 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
66 } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) {\r
67 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"goto");\r
a405b86d 68 ShellStatus = SHELL_INVALID_PARAMETER;\r
69 } else {\r
70 Size = 0;\r
47d20b54
MK
71 ASSERT ((CompareString == NULL && Size == 0) || (CompareString != NULL));\r
72 CompareString = StrnCatGrow (&CompareString, &Size, L":", 0);\r
73 CompareString = StrnCatGrow (&CompareString, &Size, ShellCommandLineGetRawValue (Package, 1), 0);\r
a405b86d 74 //\r
75 // Check forwards and then backwards for a label...\r
76 //\r
47d20b54
MK
77 if (!MoveToTag (GetNextNode, L"endfor", L"for", CompareString, ShellCommandGetCurrentScriptFile (), FALSE, FALSE, TRUE)) {\r
78 CurrentScriptFile = ShellCommandGetCurrentScriptFile ();\r
79 ShellPrintHiiEx (\r
ba0014b9
LG
80 -1,\r
81 -1,\r
82 NULL,\r
83 STRING_TOKEN (STR_SYNTAX_NO_MATCHING),\r
84 gShellLevel1HiiHandle,\r
85 CompareString,\r
86 L"Goto",\r
47d20b54
MK
87 CurrentScriptFile != NULL\r
88 && CurrentScriptFile->CurrentCommand != NULL\r
89 ? CurrentScriptFile->CurrentCommand->Line : 0\r
90 );\r
a405b86d 91 ShellStatus = SHELL_NOT_FOUND;\r
92 }\r
47d20b54
MK
93\r
94 FreePool (CompareString);\r
a405b86d 95 }\r
47d20b54 96\r
a405b86d 97 ShellCommandLineFreeVarList (Package);\r
98 }\r
99\r
100 return (ShellStatus);\r
101}\r