]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c
ShellPkg: Replace BSD License with BSD+Patent License
[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
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
ae724571 31 SCRIPT_FILE *CurrentScriptFile;\r
a405b86d 32\r
33 ShellStatus = SHELL_SUCCESS;\r
34 CompareString = NULL;\r
35\r
36 //\r
37 // initialize the shell lib (we must be in non-auto-init...)\r
38 //\r
39 Status = ShellInitialize();\r
40 ASSERT_EFI_ERROR(Status);\r
41\r
42 Status = CommandInit();\r
43 ASSERT_EFI_ERROR(Status);\r
44\r
45 if (!gEfiShellProtocol->BatchIsActive()) {\r
46 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Goto");\r
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
54 if (EFI_ERROR(Status)) {\r
55 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
0861edab 56 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"goto", ProblemParam);\r
a405b86d 57 FreePool(ProblemParam);\r
58 ShellStatus = SHELL_INVALID_PARAMETER;\r
59 } else {\r
60 ASSERT(FALSE);\r
61 }\r
62 } else {\r
63 if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
0861edab 64 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"goto");\r
a405b86d 65 ShellStatus = SHELL_INVALID_PARAMETER;\r
66 } else if (ShellCommandLineGetRawValue(Package, 1) == NULL) {\r
0861edab 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
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
74 //\r
75 // Check forwards and then backwards for a label...\r
76 //\r
77 if (!MoveToTag(GetNextNode, L"endfor", L"for", CompareString, ShellCommandGetCurrentScriptFile(), FALSE, FALSE, TRUE)) {\r
ae724571 78 CurrentScriptFile = ShellCommandGetCurrentScriptFile();\r
33c031ee 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
87 CurrentScriptFile!=NULL\r
ae724571 88 && CurrentScriptFile->CurrentCommand!=NULL\r
89 ? CurrentScriptFile->CurrentCommand->Line:0);\r
a405b86d 90 ShellStatus = SHELL_NOT_FOUND;\r
91 }\r
92 FreePool(CompareString);\r
93 }\r
94 ShellCommandLineFreeVarList (Package);\r
95 }\r
96\r
97 return (ShellStatus);\r
98}\r
99\r