]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c
ShellPkg: Refine the fomat in INF/DEC files to follow spec.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Help.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for Help shell level 3 function.\r
3\r
cab102c3 4 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>\r
710db4e8 5 Copyright (c) 2014, ARM Limited. All rights reserved. <BR>\r
a405b86d 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellLevel3CommandsLib.h"\r
17\r
18#include <Library/ShellLib.h>\r
cab102c3
JC
19#include <Library/HandleParsingLib.h>\r
20\r
21#include <Protocol/EfiShellDynamicCommand.h>\r
22\r
23/**\r
24 Attempt to print help from a dynamically added command.\r
25\r
710db4e8
HL
26 @param[in] CommandToGetHelpOn The unicode name of the command that help is\r
27 requested on.\r
28 @param[in] SectionToGetHelpOn Pointer to the section specifier(s).\r
29 @param[in] PrintCommandText Print the command followed by the help content\r
30 or just help.\r
cab102c3
JC
31\r
32 @retval EFI_SUCCESS The help was displayed\r
710db4e8
HL
33 @retval EFI_NOT_FOUND The command name could not be found\r
34 @retval EFI_DEVICE_ERROR The help data format was incorrect.\r
cab102c3 35**/\r
cab102c3
JC
36EFI_STATUS\r
37EFIAPI\r
38PrintDynamicCommandHelp(\r
710db4e8
HL
39 IN CHAR16 *CommandToGetHelpOn,\r
40 IN CHAR16 *SectionToGetHelpOn,\r
41 IN BOOLEAN PrintCommandText\r
42 )\r
cab102c3
JC
43{\r
44 EFI_STATUS Status;\r
f5ba4007
QS
45 BOOLEAN Found;\r
46 EFI_HANDLE *CommandHandleList;\r
cab102c3
JC
47 EFI_HANDLE *NextCommand;\r
48 EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *DynamicCommand;\r
710db4e8
HL
49\r
50 Status = EFI_NOT_FOUND;\r
f5ba4007
QS
51 Found = FALSE;\r
52 CommandHandleList = NULL;\r
cab102c3
JC
53\r
54 CommandHandleList = GetHandleListByProtocol(&gEfiShellDynamicCommandProtocolGuid);\r
55\r
56 if (CommandHandleList == NULL) {\r
57 //\r
58 // not found or out of resources\r
59 //\r
710db4e8 60 return Status;\r
cab102c3
JC
61 }\r
62\r
63 for (NextCommand = CommandHandleList; *NextCommand != NULL; NextCommand++) {\r
64 Status = gBS->HandleProtocol(\r
65 *NextCommand,\r
66 &gEfiShellDynamicCommandProtocolGuid,\r
67 (VOID **)&DynamicCommand\r
68 );\r
69\r
70 if (EFI_ERROR(Status)) {\r
71 continue;\r
72 }\r
73\r
710db4e8
HL
74 //\r
75 // Check execution break flag when printing multiple command help information.\r
76 //\r
77 if (ShellGetExecutionBreakFlag ()) {\r
cab102c3
JC
78 break;\r
79 }\r
80\r
710db4e8
HL
81 if ((gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, CommandToGetHelpOn)) ||\r
82 (gEfiShellProtocol->GetAlias (CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
83 // Print as Shell Help if in ManPage format.\r
84 Status = ShellPrintHelp (DynamicCommand->CommandName, SectionToGetHelpOn,\r
85 PrintCommandText);\r
86 if (Status == EFI_DEVICE_ERROR) {\r
87 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV),\r
88 gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
89 } else if (EFI_ERROR(Status)) {\r
90 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF),\r
91 gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
92 } else {\r
93 Found = TRUE;\r
94 }\r
95 }\r
cab102c3
JC
96 }\r
97\r
710db4e8 98 return (Found ? EFI_SUCCESS : Status);\r
cab102c3 99\r
cab102c3 100}\r
a405b86d 101\r
102STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
103 {L"-usage", TypeFlag},\r
345cd235 104 {L"-section", TypeMaxValue},\r
a405b86d 105 {L"-verbose", TypeFlag},\r
106 {L"-v", TypeFlag},\r
107 {NULL, TypeMax}\r
108 };\r
109\r
110/**\r
111 Function for 'help' command.\r
112\r
113 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
114 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
115**/\r
116SHELL_STATUS\r
117EFIAPI\r
118ShellCommandRunHelp (\r
119 IN EFI_HANDLE ImageHandle,\r
120 IN EFI_SYSTEM_TABLE *SystemTable\r
121 )\r
122{\r
123 EFI_STATUS Status;\r
124 LIST_ENTRY *Package;\r
125 CHAR16 *ProblemParam;\r
126 SHELL_STATUS ShellStatus;\r
a405b86d 127 CONST COMMAND_LIST *CommandList;\r
128 CONST COMMAND_LIST *Node;\r
129 CHAR16 *CommandToGetHelpOn;\r
130 CHAR16 *SectionToGetHelpOn;\r
131 CHAR16 *HiiString;\r
132 BOOLEAN Found;\r
7c8e7960 133 BOOLEAN PrintCommandText;\r
a405b86d 134\r
7c8e7960 135 PrintCommandText = TRUE;\r
a405b86d 136 ProblemParam = NULL;\r
137 ShellStatus = SHELL_SUCCESS;\r
a405b86d 138 CommandToGetHelpOn = NULL;\r
139 SectionToGetHelpOn = NULL;\r
140 Found = FALSE;\r
141\r
142 //\r
143 // initialize the shell lib (we must be in non-auto-init...)\r
144 //\r
145 Status = ShellInitialize();\r
146 ASSERT_EFI_ERROR(Status);\r
147\r
148 Status = CommandInit();\r
149 ASSERT_EFI_ERROR(Status);\r
150\r
151 //\r
152 // parse the command line\r
153 //\r
154 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
155 if (EFI_ERROR(Status)) {\r
156 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
157 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, ProblemParam);\r
158 FreePool(ProblemParam);\r
159 ShellStatus = SHELL_INVALID_PARAMETER;\r
160 } else {\r
161 ASSERT(FALSE);\r
162 }\r
163 } else {\r
164 //\r
165 // Check for conflicting parameters.\r
166 //\r
167 if (ShellCommandLineGetFlag(Package, L"-usage")\r
168 &&ShellCommandLineGetFlag(Package, L"-section")\r
169 &&(ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v"))\r
170 ){\r
171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle);\r
172 ShellStatus = SHELL_INVALID_PARAMETER;\r
173 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle);\r
175 ShellStatus = SHELL_INVALID_PARAMETER;\r
176 } else {\r
177 //\r
178 // Get the command name we are getting help on\r
179 //\r
180 ASSERT(CommandToGetHelpOn == NULL);\r
181 StrnCatGrow(&CommandToGetHelpOn, NULL, ShellCommandLineGetRawValue(Package, 1), 0);\r
182 if (CommandToGetHelpOn == NULL && ShellCommandLineGetFlag(Package, L"-?")) {\r
183 //\r
184 // If we dont have a command and we got a simple -?\r
185 // we are looking for help on help command.\r
186 //\r
187 StrnCatGrow(&CommandToGetHelpOn, NULL, L"help", 0);\r
188 }\r
189\r
190 if (CommandToGetHelpOn == NULL) {\r
191 StrnCatGrow(&CommandToGetHelpOn, NULL, L"*", 0);\r
192 ASSERT(SectionToGetHelpOn == NULL);\r
193 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);\r
194 } else {\r
7c8e7960 195 PrintCommandText = FALSE;\r
a405b86d 196 ASSERT(SectionToGetHelpOn == NULL);\r
197 //\r
198 // Get the section name for the given command name\r
199 //\r
200 if (ShellCommandLineGetFlag(Package, L"-section")) {\r
201 StrnCatGrow(&SectionToGetHelpOn, NULL, ShellCommandLineGetValue(Package, L"-section"), 0);\r
202 } else if (ShellCommandLineGetFlag(Package, L"-usage")) {\r
203 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS", 0);\r
204 } else if (ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v")) {\r
205 } else {\r
d51088b7 206 //\r
207 // The output of help <command> will display NAME, SYNOPSIS, OPTIONS, DESCRIPTION, and EXAMPLES sections.\r
208 //\r
209 StrnCatGrow (&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS,OPTIONS,DESCRIPTION,EXAMPLES", 0);\r
a405b86d 210 }\r
211 }\r
212\r
213 if (gUnicodeCollation->StriColl(gUnicodeCollation, CommandToGetHelpOn, L"special") == 0) {\r
214 //\r
215 // we need info on the special characters\r
216 //\r
217 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle);\r
218 HiiString = HiiGetString(gShellLevel3HiiHandle, STRING_TOKEN(STR_HELP_SC_DATA), NULL);\r
219 ShellPrintEx(-1, -1, L"%s", HiiString);\r
220 FreePool(HiiString);\r
221 Found = TRUE;\r
222 } else {\r
345cd235 223 CommandList = ShellCommandGetCommandList(TRUE);\r
a405b86d 224 ASSERT(CommandList != NULL);\r
225 for ( Node = (COMMAND_LIST*)GetFirstNode(&CommandList->Link)\r
226 ; CommandList != NULL && !IsListEmpty(&CommandList->Link) && !IsNull(&CommandList->Link, &Node->Link)\r
227 ; Node = (COMMAND_LIST*)GetNextNode(&CommandList->Link, &Node->Link)\r
228 ){\r
d51088b7 229 //\r
230 // Checking execution break flag when print multiple command help information.\r
231 //\r
232 if (ShellGetExecutionBreakFlag ()) {\r
233 break;\r
234 } \r
345cd235 235 if ((gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, CommandToGetHelpOn)) ||\r
236 (gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
a405b86d 237 //\r
238 // We have a command to look for help on.\r
239 //\r
7c8e7960 240 Status = ShellPrintHelp(Node->CommandString, SectionToGetHelpOn, PrintCommandText);\r
241 if (Status == EFI_DEVICE_ERROR) {\r
345cd235 242 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, Node->CommandString);\r
7c8e7960 243 } else if (EFI_ERROR(Status)) {\r
345cd235 244 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, Node->CommandString);\r
a405b86d 245 } else {\r
7c8e7960 246 Found = TRUE;\r
a405b86d 247 }\r
248 }\r
249 }\r
710db4e8
HL
250\r
251 //\r
252 // now try to match against the dynamic command list and print help\r
253 //\r
254 Status = PrintDynamicCommandHelp (CommandToGetHelpOn, SectionToGetHelpOn,\r
255 PrintCommandText);\r
256 if (!EFI_ERROR(Status)) {\r
257 Found = TRUE;\r
258 }\r
259\r
d51088b7 260 //\r
261 // Search the .man file for Shell applications (Shell external commands).\r
262 //\r
263 if (!Found) {\r
cab102c3
JC
264 Status = ShellPrintHelp(CommandToGetHelpOn, SectionToGetHelpOn, FALSE);\r
265 if (Status == EFI_DEVICE_ERROR) {\r
266 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CommandToGetHelpOn);\r
267 } else if (EFI_ERROR(Status)) {\r
268 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn);\r
269 } else {\r
270 Found = TRUE;\r
271 }\r
272 }\r
a405b86d 273 }\r
274\r
7c8e7960 275 if (!Found) {\r
a405b86d 276 ShellStatus = SHELL_NOT_FOUND;\r
277 }\r
278\r
279 //\r
280 // free the command line package\r
281 //\r
282 ShellCommandLineFreeVarList (Package);\r
283 }\r
284 }\r
7c8e7960 285\r
286 if (CommandToGetHelpOn != NULL && StrCmp(CommandToGetHelpOn, L"*") == 0){\r
287 //\r
288 // If '*' then the command entered was 'Help' without qualifiers, This footer\r
289 // provides additional info on help switches\r
290 //\r
291 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_FOOTER), gShellLevel3HiiHandle);\r
292 }\r
a405b86d 293 if (CommandToGetHelpOn != NULL) {\r
294 FreePool(CommandToGetHelpOn);\r
295 }\r
296 if (SectionToGetHelpOn != NULL) {\r
297 FreePool(SectionToGetHelpOn);\r
298 }\r
299\r
300 return (ShellStatus);\r
301}\r