]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c
ShellPkg: Add checking for memory allocation and pointer returns from functions.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Parse.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for Parse shell level 2 function.\r
3\r
b54fd049 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 "UefiShellLevel2CommandsLib.h"\r
16\r
b54fd049 17/**\r
18 Do the actual parsing of the file. the file should be SFO output from a \r
19 shell command or a similar format.\r
20\r
21 @param[in] FileName The filename to open.\r
22 @param[in] TableName The name of the table to find.\r
23 @param[in] ColumnIndex The column number to get.\r
24 @param[in] TableNameInstance Which instance of the table to get (row).\r
25 @param[in] ShellCommandInstance Which instance of the command to get.\r
26\r
27 @retval SHELL_NOT_FOUND The requested instance was not found.\r
28 @retval SHELL_SUCCESS The operation was successful.\r
29**/\r
a405b86d 30SHELL_STATUS\r
31EFIAPI\r
32PerformParsing(\r
33 IN CONST CHAR16 *FileName,\r
34 IN CONST CHAR16 *TableName,\r
35 IN CONST UINTN ColumnIndex,\r
36 IN CONST UINTN TableNameInstance,\r
37 IN CONST UINTN ShellCommandInstance\r
38 )\r
39{\r
40 SHELL_FILE_HANDLE FileHandle;\r
41 EFI_STATUS Status;\r
42 BOOLEAN Ascii;\r
43 UINTN LoopVariable;\r
44 UINTN ColumnLoop;\r
45 CHAR16 *TempLine;\r
46 CHAR16 *ColumnPointer;\r
47 SHELL_STATUS ShellStatus;\r
48 CHAR16 *TempSpot;\r
49\r
50 ASSERT(FileName != NULL);\r
51 ASSERT(TableName != NULL);\r
52\r
53 ShellStatus = SHELL_SUCCESS;\r
54\r
55 Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0);\r
56 if (EFI_ERROR(Status)) {\r
57 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, FileName);\r
58 ShellStatus = SHELL_NOT_FOUND;\r
59 } else {\r
60 for (LoopVariable = 0 ; LoopVariable < ShellCommandInstance && !ShellFileHandleEof(FileHandle);) {\r
61 TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii);\r
62 if (TempLine == NULL) {\r
63 break;\r
64 }\r
65 if (StrStr(TempLine, L"ShellCommand, \"") == TempLine) {\r
66 LoopVariable++;\r
67 }\r
68 SHELL_FREE_NON_NULL(TempLine);\r
69 }\r
70 if (LoopVariable == ShellCommandInstance) {\r
71 LoopVariable = 0;\r
72 while(1) {\r
73 TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii);\r
74 if ( TempLine == NULL\r
75 || *TempLine == CHAR_NULL\r
76 || StrStr(TempLine, L"ShellCommand, \"") == TempLine\r
77 ){\r
78 SHELL_FREE_NON_NULL(TempLine);\r
79 break;\r
80 }\r
81 if (StrStr(TempLine, TableName) == TempLine) {\r
82 LoopVariable++;\r
83 }\r
84 if ( LoopVariable == TableNameInstance\r
85 || (TableNameInstance == (UINTN)-1 && StrStr(TempLine, TableName) == TempLine)\r
86 ){\r
87 for (ColumnLoop = 1, ColumnPointer = TempLine; ColumnLoop < ColumnIndex && ColumnPointer != NULL && *ColumnPointer != CHAR_NULL; ColumnLoop++) {\r
88 ColumnPointer = StrStr(ColumnPointer, L",");\r
89 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL){\r
90 ColumnPointer++;\r
91 }\r
92 }\r
93 if (ColumnLoop == ColumnIndex) {\r
94 ASSERT(ColumnPointer != NULL);\r
95 TempSpot = StrStr(ColumnPointer, L",");\r
96 if (TempSpot != NULL) {\r
97 *TempSpot = CHAR_NULL;\r
98 }\r
99 while (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L' '){\r
100 ColumnPointer++;\r
101 }\r
102 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L'\"'){\r
103 ColumnPointer++;\r
104 }\r
105 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen(ColumnPointer)-1] == L'\"'){\r
106 ColumnPointer[StrLen(ColumnPointer)-1] = CHAR_NULL;\r
107 }\r
108\r
109 ShellPrintEx(-1, -1, L"%s\r\n", ColumnPointer);\r
110 }\r
111 }\r
112 SHELL_FREE_NON_NULL(TempLine);\r
113 }\r
114 }\r
115 }\r
116 return (ShellStatus);\r
117}\r
118\r
119STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
120 {L"-i", TypeValue},\r
121 {L"-s", TypeValue},\r
122 {NULL, TypeMax}\r
123 };\r
124\r
125/**\r
126 Function for 'parse' command.\r
127\r
128 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
129 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
130**/\r
131SHELL_STATUS\r
132EFIAPI\r
133ShellCommandRunParse (\r
134 IN EFI_HANDLE ImageHandle,\r
135 IN EFI_SYSTEM_TABLE *SystemTable\r
136 )\r
137{\r
138 EFI_STATUS Status;\r
139 LIST_ENTRY *Package;\r
140 CHAR16 *ProblemParam;\r
141 CONST CHAR16 *FileName;\r
142 CONST CHAR16 *TableName;\r
143 CONST CHAR16 *ColumnString;\r
144 SHELL_STATUS ShellStatus;\r
145 UINTN ShellCommandInstance;\r
146 UINTN TableNameInstance;\r
147\r
148 ShellStatus = SHELL_SUCCESS;\r
149 ProblemParam = NULL;\r
150\r
151 //\r
152 // initialize the shell lib (we must be in non-auto-init...)\r
153 //\r
154 Status = ShellInitialize();\r
155 ASSERT_EFI_ERROR(Status);\r
156\r
157 //\r
158 // parse the command line\r
159 //\r
160 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
161 if (EFI_ERROR(Status)) {\r
162 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
163 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
164 FreePool(ProblemParam);\r
165 ShellStatus = SHELL_INVALID_PARAMETER;\r
166 } else {\r
167 ASSERT(FALSE);\r
168 }\r
169 } else {\r
170 if (ShellCommandLineGetCount(Package) < 4) {\r
171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
172 ShellStatus = SHELL_INVALID_PARAMETER;\r
173 } else if (ShellCommandLineGetCount(Package) > 4) {\r
174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
175 ShellStatus = SHELL_INVALID_PARAMETER;\r
176 } else {\r
177 FileName = ShellCommandLineGetRawValue(Package, 1);\r
178 TableName = ShellCommandLineGetRawValue(Package, 2);\r
179 ColumnString = ShellCommandLineGetRawValue(Package, 3);\r
180\r
181 if (ShellCommandLineGetValue(Package, L"-i") == NULL) {\r
182 TableNameInstance = (UINTN)-1;\r
183 } else {\r
184 TableNameInstance = ShellStrToUintn(ShellCommandLineGetValue(Package, L"-i"));\r
185 }\r
186 if (ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
187 ShellCommandInstance = 1;\r
188 } else {\r
189 ShellCommandInstance = ShellStrToUintn(ShellCommandLineGetValue(Package, L"-s"));\r
190 }\r
191\r
192 ShellStatus = PerformParsing(FileName, TableName, ShellStrToUintn(ColumnString), TableNameInstance, ShellCommandInstance);\r
193 }\r
194 }\r
195\r
196 //\r
197 // free the command line package\r
198 //\r
199 ShellCommandLineFreeVarList (Package);\r
200\r
201 return (ShellStatus);\r
202}\r
203\r