]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c
cp - fix conditional for memory de-allocaiton.
[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
345cd235 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved. <BR>\r
a405b86d 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 "UefiShellLevel3CommandsLib.h"\r
16\r
17#include <Library/ShellLib.h>\r
18\r
19STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
20 {L"-usage", TypeFlag},\r
345cd235 21 {L"-section", TypeMaxValue},\r
a405b86d 22 {L"-verbose", TypeFlag},\r
23 {L"-v", TypeFlag},\r
24 {NULL, TypeMax}\r
25 };\r
26\r
27/**\r
28 Function for 'help' command.\r
29\r
30 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
31 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
32**/\r
33SHELL_STATUS\r
34EFIAPI\r
35ShellCommandRunHelp (\r
36 IN EFI_HANDLE ImageHandle,\r
37 IN EFI_SYSTEM_TABLE *SystemTable\r
38 )\r
39{\r
40 EFI_STATUS Status;\r
41 LIST_ENTRY *Package;\r
42 CHAR16 *ProblemParam;\r
43 SHELL_STATUS ShellStatus;\r
44 CHAR16 *OutText;\r
45 CONST COMMAND_LIST *CommandList;\r
46 CONST COMMAND_LIST *Node;\r
47 CHAR16 *CommandToGetHelpOn;\r
48 CHAR16 *SectionToGetHelpOn;\r
49 CHAR16 *HiiString;\r
50 BOOLEAN Found;\r
51\r
52 ProblemParam = NULL;\r
53 ShellStatus = SHELL_SUCCESS;\r
54 OutText = NULL;\r
55 CommandToGetHelpOn = NULL;\r
56 SectionToGetHelpOn = NULL;\r
57 Found = FALSE;\r
58\r
59 //\r
60 // initialize the shell lib (we must be in non-auto-init...)\r
61 //\r
62 Status = ShellInitialize();\r
63 ASSERT_EFI_ERROR(Status);\r
64\r
65 Status = CommandInit();\r
66 ASSERT_EFI_ERROR(Status);\r
67\r
68 //\r
69 // parse the command line\r
70 //\r
71 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
72 if (EFI_ERROR(Status)) {\r
73 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
74 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, ProblemParam);\r
75 FreePool(ProblemParam);\r
76 ShellStatus = SHELL_INVALID_PARAMETER;\r
77 } else {\r
78 ASSERT(FALSE);\r
79 }\r
80 } else {\r
81 //\r
82 // Check for conflicting parameters.\r
83 //\r
84 if (ShellCommandLineGetFlag(Package, L"-usage")\r
85 &&ShellCommandLineGetFlag(Package, L"-section")\r
86 &&(ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v"))\r
87 ){\r
88 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle);\r
89 ShellStatus = SHELL_INVALID_PARAMETER;\r
90 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
91 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle);\r
92 ShellStatus = SHELL_INVALID_PARAMETER;\r
93 } else {\r
94 //\r
95 // Get the command name we are getting help on\r
96 //\r
97 ASSERT(CommandToGetHelpOn == NULL);\r
98 StrnCatGrow(&CommandToGetHelpOn, NULL, ShellCommandLineGetRawValue(Package, 1), 0);\r
99 if (CommandToGetHelpOn == NULL && ShellCommandLineGetFlag(Package, L"-?")) {\r
100 //\r
101 // If we dont have a command and we got a simple -?\r
102 // we are looking for help on help command.\r
103 //\r
104 StrnCatGrow(&CommandToGetHelpOn, NULL, L"help", 0);\r
105 }\r
106\r
107 if (CommandToGetHelpOn == NULL) {\r
108 StrnCatGrow(&CommandToGetHelpOn, NULL, L"*", 0);\r
109 ASSERT(SectionToGetHelpOn == NULL);\r
110 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);\r
111 } else {\r
112 ASSERT(SectionToGetHelpOn == NULL);\r
113 //\r
114 // Get the section name for the given command name\r
115 //\r
116 if (ShellCommandLineGetFlag(Package, L"-section")) {\r
117 StrnCatGrow(&SectionToGetHelpOn, NULL, ShellCommandLineGetValue(Package, L"-section"), 0);\r
118 } else if (ShellCommandLineGetFlag(Package, L"-usage")) {\r
119 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS", 0);\r
120 } else if (ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v")) {\r
121 } else {\r
122 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);\r
123 }\r
124 }\r
125\r
126 if (gUnicodeCollation->StriColl(gUnicodeCollation, CommandToGetHelpOn, L"special") == 0) {\r
127 //\r
128 // we need info on the special characters\r
129 //\r
130 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle);\r
131 HiiString = HiiGetString(gShellLevel3HiiHandle, STRING_TOKEN(STR_HELP_SC_DATA), NULL);\r
132 ShellPrintEx(-1, -1, L"%s", HiiString);\r
133 FreePool(HiiString);\r
134 Found = TRUE;\r
135 } else {\r
345cd235 136 CommandList = ShellCommandGetCommandList(TRUE);\r
a405b86d 137 ASSERT(CommandList != NULL);\r
138 for ( Node = (COMMAND_LIST*)GetFirstNode(&CommandList->Link)\r
139 ; CommandList != NULL && !IsListEmpty(&CommandList->Link) && !IsNull(&CommandList->Link, &Node->Link)\r
140 ; Node = (COMMAND_LIST*)GetNextNode(&CommandList->Link, &Node->Link)\r
141 ){\r
345cd235 142 if ((gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, CommandToGetHelpOn)) ||\r
143 (gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
a405b86d 144 //\r
145 // We have a command to look for help on.\r
146 //\r
147 Status = gEfiShellProtocol->GetHelpText(Node->CommandString, SectionToGetHelpOn, &OutText);\r
148 if (EFI_ERROR(Status) || OutText == NULL) {\r
345cd235 149 if (Status == EFI_DEVICE_ERROR) {\r
150 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, Node->CommandString);\r
151 } else {\r
152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, Node->CommandString);\r
153 }\r
a405b86d 154 ShellStatus = SHELL_NOT_FOUND;\r
155 } else {\r
156 while (OutText[StrLen(OutText)-1] == L'\r' || OutText[StrLen(OutText)-1] == L'\n' || OutText[StrLen(OutText)-1] == L' ') {\r
157 OutText[StrLen(OutText)-1] = CHAR_NULL;\r
158 }\r
159 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_COMMAND), gShellLevel3HiiHandle, Node->CommandString, OutText);\r
160 FreePool(OutText);\r
161 OutText = NULL;\r
162 Found = TRUE;\r
163 }\r
164 }\r
165 }\r
166 }\r
167\r
168 if (!Found && ShellStatus == SHELL_SUCCESS) {\r
169 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn);\r
170 ShellStatus = SHELL_NOT_FOUND;\r
171 }\r
172\r
173 //\r
174 // free the command line package\r
175 //\r
176 ShellCommandLineFreeVarList (Package);\r
177 }\r
178 }\r
179 if (CommandToGetHelpOn != NULL) {\r
180 FreePool(CommandToGetHelpOn);\r
181 }\r
182 if (SectionToGetHelpOn != NULL) {\r
183 FreePool(SectionToGetHelpOn);\r
184 }\r
185\r
186 return (ShellStatus);\r
187}\r
188\r