]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/C/VfrCompile/VfrError.cpp
Sync BaseTools Branch (version r2149) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrError.cpp
... / ...
CommitLineData
1/** @file\r
2 \r
3 VfrCompiler error handler.\r
4\r
5Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
6This program and the accompanying materials \r
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_VARSTORE_DATATYPE_REDEFINED_ERROR, ": Data Structure is defined by more than one varstores, it can't be referred as varstore, only varstore name could be used."},\r
38 { VFR_RETURN_GET_EFIVARSTORE_ERROR, ": get efi varstore error"},\r
39 { VFR_RETURN_EFIVARSTORE_USE_ERROR, ": can not use the efi varstore like this" },\r
40 { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, ": unsupport efi varstore size should be <= 8 bytes" },\r
41 { VFR_RETURN_GET_NVVARSTORE_ERROR, ": get name value varstore error" },\r
42 { VFR_RETURN_QVAR_REUSE, ": variable reused by more than one question" },\r
43 { VFR_RETURN_FLAGS_UNSUPPORTED, ": flags unsupported" },\r
44 { 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
45 { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not support"},\r
46 { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},\r
47 { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expression"},\r
48 { VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }\r
49};\r
50\r
51CVfrErrorHandle::CVfrErrorHandle (\r
52 VOID\r
53 )\r
54{\r
55 mInputFileName = NULL;\r
56 mScopeRecordListHead = NULL;\r
57 mScopeRecordListTail = NULL;\r
58 mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;\r
59}\r
60\r
61CVfrErrorHandle::~CVfrErrorHandle (\r
62 VOID\r
63 )\r
64{\r
65 SVfrFileScopeRecord *pNode = NULL;\r
66\r
67 if (mInputFileName != NULL) {\r
68 delete mInputFileName;\r
69 }\r
70\r
71 while (mScopeRecordListHead != NULL) {\r
72 pNode = mScopeRecordListHead;\r
73 mScopeRecordListHead = mScopeRecordListHead->mNext;\r
74 delete pNode;\r
75 }\r
76\r
77 mScopeRecordListHead = NULL;\r
78 mScopeRecordListTail = NULL;\r
79 mVfrErrorHandleTable = NULL;\r
80}\r
81\r
82VOID\r
83CVfrErrorHandle::SetInputFile (\r
84 IN CHAR8 *InputFile\r
85 )\r
86{\r
87 if (InputFile != NULL) {\r
88 mInputFileName = new CHAR8[strlen(InputFile) + 1];\r
89 strcpy (mInputFileName, InputFile);\r
90 }\r
91}\r
92\r
93SVfrFileScopeRecord::SVfrFileScopeRecord (\r
94 IN CHAR8 *Record, \r
95 IN UINT32 LineNum\r
96 )\r
97{\r
98 UINT32 Index;\r
99 CHAR8 *FileName = NULL;\r
100 CHAR8 *Str = NULL;\r
101\r
102 mWholeScopeLine = LineNum;\r
103 mNext = NULL;\r
104\r
105 Str = strchr (Record, ' ');\r
106 mScopeLineStart = atoi (++Str);\r
107\r
108 Str = strchr (Str, '\"');\r
109 FileName = ++Str;\r
110\r
111 while((Str = strstr (FileName, "\\\\")) != NULL) {\r
112 FileName = Str + 2;\r
113 }\r
114 if ((mFileName = new CHAR8[strlen(FileName)]) != NULL) {\r
115 for (Index = 0; FileName[Index] != '\"'; Index++) {\r
116 mFileName[Index] = FileName[Index];\r
117 }\r
118 mFileName[Index] = '\0';\r
119 }\r
120\r
121 return;\r
122}\r
123\r
124SVfrFileScopeRecord::~SVfrFileScopeRecord (\r
125 VOID\r
126 )\r
127{\r
128 if (mFileName != NULL) {\r
129 delete mFileName;\r
130 }\r
131}\r
132\r
133VOID\r
134CVfrErrorHandle::ParseFileScopeRecord (\r
135 IN CHAR8 *Record, \r
136 IN UINT32 WholeScopeLine\r
137 )\r
138{\r
139 SVfrFileScopeRecord *pNode = NULL;\r
140\r
141 if (Record == NULL) {\r
142 return;\r
143 }\r
144\r
145 if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {\r
146 return;\r
147 }\r
148\r
149 if (mScopeRecordListHead == NULL) {\r
150 mScopeRecordListTail = mScopeRecordListHead = pNode;\r
151 } else {\r
152 mScopeRecordListTail->mNext = pNode;\r
153 mScopeRecordListTail = pNode;\r
154 }\r
155}\r
156\r
157VOID\r
158CVfrErrorHandle::GetFileNameLineNum (\r
159 IN UINT32 LineNum,\r
160 OUT CHAR8 **FileName,\r
161 OUT UINT32 *FileLine\r
162 )\r
163{\r
164 SVfrFileScopeRecord *pNode = NULL;\r
165\r
166 if ((FileName == NULL) || (FileLine == NULL)) {\r
167 return;\r
168 }\r
169\r
170 *FileName = NULL;\r
171 *FileLine = 0xFFFFFFFF;\r
172\r
173 //\r
174 // Some errors occur before scope record list been built.\r
175 //\r
176 if (mScopeRecordListHead == NULL) {\r
177 *FileLine = LineNum;\r
178 *FileName = mInputFileName;\r
179 return ;\r
180 }\r
181\r
182 for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {\r
183 if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {\r
184 *FileName = pNode->mFileName;\r
185 *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
186 return ;\r
187 }\r
188 }\r
189\r
190 *FileName = pNode->mFileName;\r
191 *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
192}\r
193\r
194VOID\r
195CVfrErrorHandle::PrintMsg (\r
196 IN UINT32 LineNum,\r
197 IN CHAR8 *TokName,\r
198 IN CONST CHAR8 *MsgType,\r
199 IN CONST CHAR8 *ErrorMsg\r
200 )\r
201{\r
202 CHAR8 *FileName = NULL;\r
203 UINT32 FileLine;\r
204 \r
205 if (strncmp ("Warning", MsgType, strlen ("Warning")) == 0) {\r
206 VerboseMsg ((CHAR8 *) ErrorMsg);\r
207 return;\r
208 }\r
209 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
210 Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
211}\r
212\r
213UINT8\r
214CVfrErrorHandle::HandleError (\r
215 IN EFI_VFR_RETURN_CODE ErrorCode,\r
216 IN UINT32 LineNum,\r
217 IN CHAR8 *TokName\r
218 )\r
219{\r
220 UINT32 Index;\r
221 CHAR8 *FileName = NULL;\r
222 UINT32 FileLine;\r
223 CONST CHAR8 *ErrorMsg = NULL;\r
224\r
225 if (mVfrErrorHandleTable == NULL) {\r
226 return 1;\r
227 }\r
228\r
229 for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {\r
230 if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {\r
231 ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;\r
232 break;\r
233 }\r
234 }\r
235\r
236 if (ErrorMsg != NULL) {\r
237 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
238 Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
239 return 1;\r
240 } else {\r
241 return 0;\r
242 }\r
243}\r
244\r
245CVfrErrorHandle gCVfrErrorHandle;\r