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