]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.c
Refine code to make code follow the coding style.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel1CommandsLib / UefiShellLevel1CommandsLib.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for NULL named library for level 1 shell command functions.\r
3\r
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellLevel1CommandsLib.h"\r
16\r
17STATIC CONST CHAR16 mFileName[] = L"ShellCommands";\r
18EFI_HANDLE gShellLevel1HiiHandle = NULL;\r
19CONST EFI_GUID gShellLevel1HiiGuid = \\r
20 { \\r
21 0xdec5daa4, 0x6781, 0x4820, { 0x9c, 0x63, 0xa7, 0xb0, 0xe4, 0xf1, 0xdb, 0x31 }\r
22 };\r
23\r
24\r
25CONST CHAR16*\r
26EFIAPI\r
27ShellCommandGetManFileNameLevel1 (\r
28 VOID\r
29 )\r
30{\r
31 return (mFileName);\r
32}\r
33\r
34/**\r
35 Constructor for the Shell Level 1 Commands library.\r
36\r
37 Install the handlers for level 1 UEFI Shell 2.0 commands.\r
38\r
39 @param ImageHandle the image handle of the process\r
40 @param SystemTable the EFI System Table pointer\r
41\r
42 @retval EFI_SUCCESS the shell command handlers were installed sucessfully\r
43 @retval EFI_UNSUPPORTED the shell level required was not found.\r
44**/\r
45EFI_STATUS\r
46EFIAPI\r
47ShellLevel1CommandsLibConstructor (\r
48 IN EFI_HANDLE ImageHandle,\r
49 IN EFI_SYSTEM_TABLE *SystemTable\r
50 )\r
51{\r
52 //\r
53 // if shell level is less than 2 do nothing\r
54 //\r
55 if (PcdGet8(PcdShellSupportLevel) < 1) {\r
56 return (EFI_UNSUPPORTED);\r
57 }\r
58\r
59 gShellLevel1HiiHandle = HiiAddPackages (&gShellLevel1HiiGuid, gImageHandle, UefiShellLevel1CommandsLibStrings, NULL);\r
60 if (gShellLevel1HiiHandle == NULL) {\r
61 return (EFI_DEVICE_ERROR);\r
62 }\r
63\r
64 //\r
65 // install our shell command handlers that are always installed\r
66 //\r
67 ShellCommandRegisterCommandName(L"for", ShellCommandRunFor , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_FOR) ));\r
68 ShellCommandRegisterCommandName(L"goto", ShellCommandRunGoto , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_GOTO) ));\r
69 ShellCommandRegisterCommandName(L"if", ShellCommandRunIf , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_IF) ));\r
70 ShellCommandRegisterCommandName(L"shift", ShellCommandRunShift , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_SHIFT) ));\r
71 ShellCommandRegisterCommandName(L"exit", ShellCommandRunExit , ShellCommandGetManFileNameLevel1, 1, L"", TRUE , gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_EXIT) ));\r
72 ShellCommandRegisterCommandName(L"else", ShellCommandRunElse , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_ELSE) ));\r
73 ShellCommandRegisterCommandName(L"endif", ShellCommandRunEndIf , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_ENDIF) ));\r
74 ShellCommandRegisterCommandName(L"endfor", ShellCommandRunEndFor , ShellCommandGetManFileNameLevel1, 1, L"", FALSE, gShellLevel1HiiHandle, (EFI_STRING_ID)(PcdGet8(PcdShellSupportLevel) < 3 ? 0 : STRING_TOKEN(STR_GET_HELP_ENDFOR)));\r
75\r
76 return (EFI_SUCCESS);\r
77}\r
78\r
79/**\r
80 Destructor for the library. free any resources.\r
81**/\r
82EFI_STATUS\r
83EFIAPI\r
84ShellLevel1CommandsLibDestructor (\r
85 IN EFI_HANDLE ImageHandle,\r
86 IN EFI_SYSTEM_TABLE *SystemTable\r
87 )\r
88{\r
89 if (gShellLevel1HiiHandle != NULL) {\r
90 HiiRemovePackages(gShellLevel1HiiHandle);\r
91 }\r
92 return (EFI_SUCCESS);\r
93}\r
94\r
95BOOLEAN\r
96EFIAPI\r
97TestNodeForMove (\r
98 IN CONST LIST_MANIP_FUNC Function,\r
99 IN CONST CHAR16 *DecrementerTag,\r
100 IN CONST CHAR16 *IncrementerTag,\r
101 IN CONST CHAR16 *Label OPTIONAL,\r
102 IN SCRIPT_FILE *ScriptFile,\r
103 IN CONST BOOLEAN MovePast,\r
104 IN CONST BOOLEAN FindOnly,\r
105 IN CONST SCRIPT_COMMAND_LIST *CommandNode,\r
106 IN UINTN *TargetCount\r
107 )\r
108{\r
109 BOOLEAN Found;\r
110 CHAR16 *CommandName;\r
111 CHAR16 *CommandNameWalker;\r
112 CHAR16 *TempLocation;\r
113\r
114 Found = FALSE;\r
115\r
116 //\r
117 // get just the first part of the command line...\r
118 //\r
119 CommandName = NULL;\r
120 CommandName = StrnCatGrow(&CommandName, NULL, CommandNode->Cl, 0);\r
121 CommandNameWalker = CommandName;\r
122 while(CommandNameWalker[0] == L' ') {\r
123 CommandNameWalker++;\r
124 }\r
125 TempLocation = StrStr(CommandNameWalker, L" ");\r
126\r
127 if (TempLocation != NULL) {\r
128 *TempLocation = CHAR_NULL;\r
129 }\r
130\r
131 //\r
132 // did we find a nested item ?\r
133 //\r
134 if (gUnicodeCollation->StriColl(\r
135 gUnicodeCollation,\r
136 (CHAR16*)CommandNameWalker,\r
137 (CHAR16*)IncrementerTag) == 0) {\r
138 (*TargetCount)++;\r
139 } else if (gUnicodeCollation->StriColl(\r
140 gUnicodeCollation,\r
141 (CHAR16*)CommandNameWalker,\r
142 (CHAR16*)DecrementerTag) == 0) {\r
143 if (*TargetCount > 0) {\r
144 (*TargetCount)--;\r
145 }\r
146 }\r
147\r
148 //\r
149 // did we find the matching one...\r
150 //\r
151 if (Label == NULL) {\r
152 if (*TargetCount == 0) {\r
153 Found = TRUE;\r
154 if (!FindOnly) {\r
155 if (MovePast) {\r
156 ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)(*Function)(&ScriptFile->CommandList, &CommandNode->Link);\r
157 } else {\r
158 ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)CommandNode;\r
159 }\r
160 }\r
161 }\r
162 } else {\r
163 if (gUnicodeCollation->StriColl(\r
164 gUnicodeCollation,\r
165 (CHAR16*)CommandNameWalker,\r
166 (CHAR16*)Label) == 0\r
167 && (*TargetCount) == 0) {\r
168 Found = TRUE;\r
169 if (!FindOnly) {\r
170 //\r
171 // we found the target label without loops\r
172 //\r
173 if (MovePast) {\r
174 ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)(*Function)(&ScriptFile->CommandList, &CommandNode->Link);\r
175 } else {\r
176 ScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)CommandNode;\r
177 }\r
178 }\r
179 }\r
180 }\r
181\r
182 //\r
183 // Free the memory for this loop...\r
184 //\r
185 FreePool(CommandName);\r
186 return (Found);\r
187}\r
188\r
189BOOLEAN\r
190EFIAPI\r
191MoveToTag (\r
192 IN CONST LIST_MANIP_FUNC Function,\r
193 IN CONST CHAR16 *DecrementerTag,\r
194 IN CONST CHAR16 *IncrementerTag,\r
195 IN CONST CHAR16 *Label OPTIONAL,\r
196 IN SCRIPT_FILE *ScriptFile,\r
197 IN CONST BOOLEAN MovePast,\r
198 IN CONST BOOLEAN FindOnly,\r
199 IN CONST BOOLEAN WrapAroundScript\r
200 )\r
201{\r
202 SCRIPT_COMMAND_LIST *CommandNode;\r
203 BOOLEAN Found;\r
204 UINTN TargetCount;\r
205\r
206 if (Label == NULL) {\r
207 TargetCount = 1;\r
208 } else {\r
209 TargetCount = 0;\r
210 }\r
211\r
212 if (ScriptFile == NULL) {\r
213 return FALSE;\r
214 }\r
215\r
216 for (CommandNode = (SCRIPT_COMMAND_LIST *)(*Function)(&ScriptFile->CommandList, &ScriptFile->CurrentCommand->Link), Found = FALSE\r
217 ; !IsNull(&ScriptFile->CommandList, &CommandNode->Link)&& !Found\r
218 ; CommandNode = (SCRIPT_COMMAND_LIST *)(*Function)(&ScriptFile->CommandList, &CommandNode->Link)\r
219 ){\r
220 Found = TestNodeForMove(\r
221 Function,\r
222 DecrementerTag,\r
223 IncrementerTag,\r
224 Label,\r
225 ScriptFile,\r
226 MovePast,\r
227 FindOnly,\r
228 CommandNode,\r
229 &TargetCount);\r
230 }\r
231\r
232 if (WrapAroundScript && !Found) {\r
233 for (CommandNode = (SCRIPT_COMMAND_LIST *)GetFirstNode(&ScriptFile->CommandList), Found = FALSE\r
234 ; CommandNode != ScriptFile->CurrentCommand && !Found\r
235 ; CommandNode = (SCRIPT_COMMAND_LIST *)(*Function)(&ScriptFile->CommandList, &CommandNode->Link)\r
236 ){\r
237 Found = TestNodeForMove(\r
238 Function,\r
239 DecrementerTag,\r
240 IncrementerTag,\r
241 Label,\r
242 ScriptFile,\r
243 MovePast,\r
244 FindOnly,\r
245 CommandNode,\r
246 &TargetCount);\r
247 }\r
248 }\r
249 return (Found);\r
250}\r
251\r