]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c
ShellPkg: print error when column index is out of range instead of ASSERT.
[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
8fcf74a8 4 Copyright (c) 2009 - 2012, 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
8fcf74a8 94 if (ColumnPointer == NULL) {\r
95 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"Column Index");\r
96 ShellStatus = SHELL_INVALID_PARAMETER;\r
97 } else {\r
98 TempSpot = StrStr(ColumnPointer, L",");\r
99 if (TempSpot != NULL) {\r
100 *TempSpot = CHAR_NULL;\r
101 }\r
102 while (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L' '){\r
103 ColumnPointer++;\r
104 }\r
105 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L'\"'){\r
106 ColumnPointer++;\r
107 }\r
108 if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen(ColumnPointer)-1] == L'\"'){\r
109 ColumnPointer[StrLen(ColumnPointer)-1] = CHAR_NULL;\r
110 }\r
a405b86d 111\r
8fcf74a8 112 ShellPrintEx(-1, -1, L"%s\r\n", ColumnPointer);\r
113 }\r
a405b86d 114 }\r
115 }\r
116 SHELL_FREE_NON_NULL(TempLine);\r
117 }\r
118 }\r
119 }\r
120 return (ShellStatus);\r
121}\r
122\r
123STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
124 {L"-i", TypeValue},\r
125 {L"-s", TypeValue},\r
126 {NULL, TypeMax}\r
127 };\r
128\r
129/**\r
130 Function for 'parse' command.\r
131\r
132 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
133 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
134**/\r
135SHELL_STATUS\r
136EFIAPI\r
137ShellCommandRunParse (\r
138 IN EFI_HANDLE ImageHandle,\r
139 IN EFI_SYSTEM_TABLE *SystemTable\r
140 )\r
141{\r
142 EFI_STATUS Status;\r
143 LIST_ENTRY *Package;\r
144 CHAR16 *ProblemParam;\r
145 CONST CHAR16 *FileName;\r
146 CONST CHAR16 *TableName;\r
147 CONST CHAR16 *ColumnString;\r
148 SHELL_STATUS ShellStatus;\r
149 UINTN ShellCommandInstance;\r
150 UINTN TableNameInstance;\r
151\r
152 ShellStatus = SHELL_SUCCESS;\r
153 ProblemParam = NULL;\r
154\r
155 //\r
156 // initialize the shell lib (we must be in non-auto-init...)\r
157 //\r
158 Status = ShellInitialize();\r
159 ASSERT_EFI_ERROR(Status);\r
160\r
161 //\r
162 // parse the command line\r
163 //\r
164 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
165 if (EFI_ERROR(Status)) {\r
166 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
167 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
168 FreePool(ProblemParam);\r
169 ShellStatus = SHELL_INVALID_PARAMETER;\r
170 } else {\r
171 ASSERT(FALSE);\r
172 }\r
173 } else {\r
174 if (ShellCommandLineGetCount(Package) < 4) {\r
175 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
176 ShellStatus = SHELL_INVALID_PARAMETER;\r
177 } else if (ShellCommandLineGetCount(Package) > 4) {\r
178 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
179 ShellStatus = SHELL_INVALID_PARAMETER;\r
180 } else {\r
181 FileName = ShellCommandLineGetRawValue(Package, 1);\r
182 TableName = ShellCommandLineGetRawValue(Package, 2);\r
183 ColumnString = ShellCommandLineGetRawValue(Package, 3);\r
184\r
185 if (ShellCommandLineGetValue(Package, L"-i") == NULL) {\r
186 TableNameInstance = (UINTN)-1;\r
187 } else {\r
188 TableNameInstance = ShellStrToUintn(ShellCommandLineGetValue(Package, L"-i"));\r
189 }\r
190 if (ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
191 ShellCommandInstance = 1;\r
192 } else {\r
193 ShellCommandInstance = ShellStrToUintn(ShellCommandLineGetValue(Package, L"-s"));\r
194 }\r
195\r
196 ShellStatus = PerformParsing(FileName, TableName, ShellStrToUintn(ColumnString), TableNameInstance, ShellCommandInstance);\r
197 }\r
198 }\r
199\r
200 //\r
201 // free the command line package\r
202 //\r
203 ShellCommandLineFreeVarList (Package);\r
204\r
205 return (ShellStatus);\r
206}\r
207\r