]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrError.cpp
updated WinNtSerialIoDxe driver not to create new child handle if RemainingDeviepath...
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrError.cpp
CommitLineData
30fdf114
LG
1/** @file\r
2 \r
3 VfrCompiler error handler.\r
4\r
5Copyright (c) 2004 - 2008, Intel Corporation \r
6All rights reserved. This 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_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
138 CHAR8 *FullPathName = NULL;\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 CHAR8 *MsgType,\r
199 IN CHAR8 *ErrorMsg\r
200 )\r
201{\r
202 CHAR8 *FileName = NULL;\r
203 UINT32 FileLine;\r
204\r
205 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
206 Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);\r
207}\r
208\r
209UINT8\r
210CVfrErrorHandle::HandleError (\r
211 IN EFI_VFR_RETURN_CODE ErrorCode,\r
212 IN UINT32 LineNum,\r
213 IN CHAR8 *TokName\r
214 )\r
215{\r
216 UINT32 Index;\r
217 CHAR8 *FileName = NULL;\r
218 UINT32 FileLine;\r
219 CHAR8 *ErrorMsg = NULL;\r
220\r
221 if (mVfrErrorHandleTable == NULL) {\r
222 return 1;\r
223 }\r
224\r
225 for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {\r
226 if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {\r
227 ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;\r
228 break;\r
229 }\r
230 }\r
231\r
232 if (ErrorMsg != NULL) {\r
233 GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
234 Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);\r
235 return 1;\r
236 } else {\r
237 return 0;\r
238 }\r
239}\r
240\r
241CVfrErrorHandle gCVfrErrorHandle;\r