]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.cpp
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrError.cpp
CommitLineData
5b19df7f
LG
1/*++\r
2\r
4b1e1121
HT
3Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials\r
5b19df7f
LG
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
3e99020d 14 VfrError.cpp\r
5b19df7f
LG
15\r
16Abstract:\r
17\r
18--*/\r
19\r
95d675b5 20#include "stdio.h"\r
21#include "string.h"\r
22#include "stdlib.h"\r
23#include "VfrError.h"\r
24\r
25static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {\r
26 { VFR_RETURN_SUCCESS, NULL },\r
27 { VFR_RETURN_ERROR_SKIPED, NULL },\r
3e99020d
LG
28 { VFR_RETURN_FATAL_ERROR, ": fatal error!!" },\r
29\r
30 { VFR_RETURN_MISMATCHED, ": unexpected token" },\r
31 { VFR_RETURN_INVALID_PARAMETER, ": invalid parameter" },\r
32 { VFR_RETURN_OUT_FOR_RESOURCES, ": system out of memory" },\r
33 { VFR_RETURN_UNSUPPORTED, ": unsupported" },\r
34 { VFR_RETURN_REDEFINED, ": already defined" },\r
35 { VFR_RETURN_FORMID_REDEFINED, ": form id already defined" },\r
36 { VFR_RETURN_QUESTIONID_REDEFINED, ": question id already defined" },\r
37 { VFR_RETURN_VARSTOREID_REDEFINED, ": varstore id already defined" },\r
38 { VFR_RETURN_UNDEFINED, ": undefined" },\r
39 { VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION, ": some variable has not defined by a question"},\r
40 { VFR_RETURN_GET_EFIVARSTORE_ERROR, ": get efi varstore error"},\r
41 { VFR_RETURN_EFIVARSTORE_USE_ERROR, ": can not use the efi varstore like this" },\r
42 { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, ": unsupport efi varstore size should be <= 8 bytes" },\r
43 { VFR_RETURN_GET_NVVARSTORE_ERROR, ": get name value varstore error" },\r
44 { VFR_RETURN_QVAR_REUSE, ": variable reused by more than one question" },\r
45 { VFR_RETURN_FLAGS_UNSUPPORTED, ": flags unsupported" },\r
46 { VFR_RETURN_ERROR_ARRARY_NUM, ": array number error" },\r
47 { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not support"},\r
48 { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},\r
49 { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expression"},\r
50 { VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }\r
95d675b5 51};\r
52\r
53CVfrErrorHandle::CVfrErrorHandle (\r
54 VOID\r
55 )\r
56{\r
3e99020d 57 mInputFileName = NULL;\r
95d675b5 58 mScopeRecordListHead = NULL;\r
59 mScopeRecordListTail = NULL;\r
60 mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;\r
61}\r
62\r
63CVfrErrorHandle::~CVfrErrorHandle (\r
64 VOID\r
65 )\r
66{\r
67 SVfrFileScopeRecord *pNode = NULL;\r
68\r
3e99020d
LG
69 if (mInputFileName != NULL) {\r
70 delete mInputFileName;\r
71 }\r
72\r
95d675b5 73 while (mScopeRecordListHead != NULL) {\r
74 pNode = mScopeRecordListHead;\r
75 mScopeRecordListHead = mScopeRecordListHead->mNext;\r
76 delete pNode;\r
77 }\r
78\r
79 mScopeRecordListHead = NULL;\r
80 mScopeRecordListTail = NULL;\r
81 mVfrErrorHandleTable = NULL;\r
82}\r
83\r
3e99020d
LG
84VOID\r
85CVfrErrorHandle::SetInputFile (\r
86 IN INT8 *InputFile\r
87 )\r
88{\r
89 if (InputFile != NULL) {\r
90 mInputFileName = new INT8[strlen(InputFile) + 1];\r
91 strcpy (mInputFileName, InputFile);\r
92 }\r
93}\r
94\r
95d675b5 95SVfrFileScopeRecord::SVfrFileScopeRecord (\r
3e99020d 96 IN INT8 *Record,\r
95d675b5 97 IN UINT32 LineNum\r
98 )\r
99{\r
100 UINT32 Index;\r
101 INT8 *FileName = NULL;\r
102 INT8 *Str = NULL;\r
103\r
104 mWholeScopeLine = LineNum;\r
105 mNext = NULL;\r
106\r
107 Str = strchr (Record, ' ');\r
108 mScopeLineStart = atoi (++Str);\r
109\r
110 Str = strchr (Str, '\"');\r
111 FileName = ++Str;\r
112\r
113 while((Str = strstr (FileName, "\\\\")) != NULL) {\r
114 FileName = Str + 2;\r
115 }\r
116 if ((mFileName = new INT8[strlen(FileName)]) != NULL) {\r
117 for (Index = 0; FileName[Index] != '\"'; Index++) {\r
118 mFileName[Index] = FileName[Index];\r
119 }\r
120 mFileName[Index] = '\0';\r
121 }\r
122\r
123 return;\r
124}\r
125\r
126SVfrFileScopeRecord::~SVfrFileScopeRecord (\r
127 VOID\r
128 )\r
129{\r
130 if (mFileName != NULL) {\r
131 delete mFileName;\r
132 }\r
133}\r
134\r
135VOID\r
136CVfrErrorHandle::ParseFileScopeRecord (\r
3e99020d 137 IN INT8 *Record,\r
95d675b5 138 IN UINT32 WholeScopeLine\r
139 )\r
140{\r
141 INT8 *FullPathName = NULL;\r
142 SVfrFileScopeRecord *pNode = NULL;\r
143\r
144 if (Record == NULL) {\r
145 return;\r
146 }\r
147\r
148 if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {\r
149 return;\r
150 }\r
151\r
152 if (mScopeRecordListHead == NULL) {\r
153 mScopeRecordListTail = mScopeRecordListHead = pNode;\r
154 } else {\r
155 mScopeRecordListTail->mNext = pNode;\r
156 mScopeRecordListTail = pNode;\r
157 }\r
158}\r
159\r
160VOID\r
161CVfrErrorHandle::GetFileNameLineNum (\r
162 IN UINT32 LineNum,\r
163 OUT INT8 **FileName,\r
164 OUT UINT32 *FileLine\r
165 )\r
166{\r
167 SVfrFileScopeRecord *pNode = NULL;\r
168\r
169 if ((FileName == NULL) || (FileLine == NULL)) {\r
170 return;\r
171 }\r
172\r
173 *FileName = NULL;\r
174 *FileLine = 0xFFFFFFFF;\r
175\r
3e99020d
LG
176 //\r
177 // Some errors occur before scope record list been built.\r
178 //\r
179 if (mScopeRecordListHead == NULL) {\r
180 *FileLine = LineNum;\r
181 *FileName = mInputFileName;\r
182 return ;\r
183 }\r
184\r
95d675b5 185 for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {\r
186 if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {\r
187 *FileName = pNode->mFileName;\r
188 *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
189 return ;\r
190 }\r
191 }\r
192\r
193 *FileName = pNode->mFileName;\r
194 *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
195}\r
196\r
197VOID\r
3e99020d 198CVfrErrorHandle::PrintMsg (\r
95d675b5 199 IN UINT32 LineNum,\r
200 IN INT8 *TokName,\r
3e99020d 201 IN INT8 *MsgType,\r
95d675b5 202 IN INT8 *ErrorMsg\r
203 )\r
204{\r
205 INT8 *FileName = NULL;\r
206 UINT32 FileLine;\r
207\r
208 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
3e99020d 209 printf ("%s line %d: %s %s %s\n", FileName, FileLine, MsgType, TokName, ErrorMsg);\r
95d675b5 210}\r
211\r
212UINT8\r
213CVfrErrorHandle::HandleError (\r
214 IN EFI_VFR_RETURN_CODE ErrorCode,\r
215 IN UINT32 LineNum,\r
216 IN INT8 *TokName\r
217 )\r
218{\r
219 UINT32 Index;\r
220 INT8 *FileName = NULL;\r
221 UINT32 FileLine;\r
222 INT8 *ErrorMsg = NULL;\r
223\r
224 if (mVfrErrorHandleTable == NULL) {\r
225 return 1;\r
226 }\r
227\r
228 for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {\r
229 if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {\r
230 ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;\r
231 break;\r
232 }\r
233 }\r
234\r
235 if (ErrorMsg != NULL) {\r
236 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
237 printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);\r
238 return 1;\r
239 } else {\r
240 return 0;\r
241 }\r
242}\r
243\r
244CVfrErrorHandle gCVfrErrorHandle;\r