]> git.proxmox.com Git - mirror_edk2.git/blame - 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
30fdf114
LG
1/** @file\r
2 \r
3 VfrCompiler error handler.\r
4\r
da92f276 5Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
40d841f6 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
da92f276 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
30fdf114
LG
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
30fdf114
LG
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
52302d4d
LG
198 IN CONST CHAR8 *MsgType,\r
199 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
200 )\r
201{\r
202 CHAR8 *FileName = NULL;\r
203 UINT32 FileLine;\r
fd171542 204 \r
205 if (strncmp ("Warning", MsgType, strlen ("Warning")) == 0) {\r
52302d4d 206 VerboseMsg ((CHAR8 *) ErrorMsg);\r
fd171542 207 return;\r
208 }\r
30fdf114 209 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
52302d4d 210 Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
30fdf114
LG
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
52302d4d 223 CONST CHAR8 *ErrorMsg = NULL;\r
30fdf114
LG
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
52302d4d 238 Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
30fdf114
LG
239 return 1;\r
240 } else {\r
241 return 0;\r
242 }\r
243}\r
244\r
245CVfrErrorHandle gCVfrErrorHandle;\r