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