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