]>
Commit | Line | Data |
---|---|---|
5b19df7f LG |
1 | /*++\r |
2 | \r | |
4b1e1121 HT |
3 | Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r |
4 | This program and the accompanying materials\r | |
5b19df7f LG |
5 | are licensed and made available under the terms and conditions of the BSD License\r |
6 | which accompanies this distribution. The full text of the license may be found at\r | |
7 | http://opensource.org/licenses/bsd-license.php\r | |
8 | \r | |
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
11 | \r | |
12 | Module Name:\r | |
13 | \r | |
14 | VfrError.cpp\r | |
15 | \r | |
16 | Abstract:\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 | |
25 | static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {\r | |
26 | { VFR_RETURN_SUCCESS, NULL },\r | |
27 | { VFR_RETURN_ERROR_SKIPED, NULL },\r | |
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_CODEUNDEFINED, "Undefined Error Code" }\r | |
49 | };\r | |
50 | \r | |
51 | CVfrErrorHandle::CVfrErrorHandle (\r | |
52 | VOID\r | |
53 | )\r | |
54 | {\r | |
55 | mScopeRecordListHead = NULL;\r | |
56 | mScopeRecordListTail = NULL;\r | |
57 | mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;\r | |
58 | }\r | |
59 | \r | |
60 | CVfrErrorHandle::~CVfrErrorHandle (\r | |
61 | VOID\r | |
62 | )\r | |
63 | {\r | |
64 | SVfrFileScopeRecord *pNode = NULL;\r | |
65 | \r | |
66 | while (mScopeRecordListHead != NULL) {\r | |
67 | pNode = mScopeRecordListHead;\r | |
68 | mScopeRecordListHead = mScopeRecordListHead->mNext;\r | |
69 | delete pNode;\r | |
70 | }\r | |
71 | \r | |
72 | mScopeRecordListHead = NULL;\r | |
73 | mScopeRecordListTail = NULL;\r | |
74 | mVfrErrorHandleTable = NULL;\r | |
75 | }\r | |
76 | \r | |
77 | SVfrFileScopeRecord::SVfrFileScopeRecord (\r | |
78 | IN INT8 *Record, \r | |
79 | IN UINT32 LineNum\r | |
80 | )\r | |
81 | {\r | |
82 | UINT32 Index;\r | |
83 | INT8 *FileName = NULL;\r | |
84 | INT8 *Str = NULL;\r | |
85 | \r | |
86 | mWholeScopeLine = LineNum;\r | |
87 | mNext = NULL;\r | |
88 | \r | |
89 | Str = strchr (Record, ' ');\r | |
90 | mScopeLineStart = atoi (++Str);\r | |
91 | \r | |
92 | Str = strchr (Str, '\"');\r | |
93 | FileName = ++Str;\r | |
94 | \r | |
95 | while((Str = strstr (FileName, "\\\\")) != NULL) {\r | |
96 | FileName = Str + 2;\r | |
97 | }\r | |
98 | if ((mFileName = new INT8[strlen(FileName)]) != NULL) {\r | |
99 | for (Index = 0; FileName[Index] != '\"'; Index++) {\r | |
100 | mFileName[Index] = FileName[Index];\r | |
101 | }\r | |
102 | mFileName[Index] = '\0';\r | |
103 | }\r | |
104 | \r | |
105 | return;\r | |
106 | }\r | |
107 | \r | |
108 | SVfrFileScopeRecord::~SVfrFileScopeRecord (\r | |
109 | VOID\r | |
110 | )\r | |
111 | {\r | |
112 | if (mFileName != NULL) {\r | |
113 | delete mFileName;\r | |
114 | }\r | |
115 | }\r | |
116 | \r | |
117 | VOID\r | |
118 | CVfrErrorHandle::ParseFileScopeRecord (\r | |
119 | IN INT8 *Record, \r | |
120 | IN UINT32 WholeScopeLine\r | |
121 | )\r | |
122 | {\r | |
123 | INT8 *FullPathName = NULL;\r | |
124 | SVfrFileScopeRecord *pNode = NULL;\r | |
125 | \r | |
126 | if (Record == NULL) {\r | |
127 | return;\r | |
128 | }\r | |
129 | \r | |
130 | if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {\r | |
131 | return;\r | |
132 | }\r | |
133 | \r | |
134 | if (mScopeRecordListHead == NULL) {\r | |
135 | mScopeRecordListTail = mScopeRecordListHead = pNode;\r | |
136 | } else {\r | |
137 | mScopeRecordListTail->mNext = pNode;\r | |
138 | mScopeRecordListTail = pNode;\r | |
139 | }\r | |
140 | }\r | |
141 | \r | |
142 | VOID\r | |
143 | CVfrErrorHandle::GetFileNameLineNum (\r | |
144 | IN UINT32 LineNum,\r | |
145 | OUT INT8 **FileName,\r | |
146 | OUT UINT32 *FileLine\r | |
147 | )\r | |
148 | {\r | |
149 | SVfrFileScopeRecord *pNode = NULL;\r | |
150 | \r | |
151 | if ((FileName == NULL) || (FileLine == NULL)) {\r | |
152 | return;\r | |
153 | }\r | |
154 | \r | |
155 | *FileName = NULL;\r | |
156 | *FileLine = 0xFFFFFFFF;\r | |
157 | \r | |
158 | for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {\r | |
159 | if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {\r | |
160 | *FileName = pNode->mFileName;\r | |
161 | *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r | |
162 | return ;\r | |
163 | }\r | |
164 | }\r | |
165 | \r | |
166 | *FileName = pNode->mFileName;\r | |
167 | *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r | |
168 | }\r | |
169 | \r | |
170 | VOID\r | |
171 | CVfrErrorHandle::PrintError (\r | |
172 | IN UINT32 LineNum,\r | |
173 | IN INT8 *TokName,\r | |
174 | IN INT8 *ErrorMsg\r | |
175 | )\r | |
176 | {\r | |
177 | INT8 *FileName = NULL;\r | |
178 | UINT32 FileLine;\r | |
179 | \r | |
180 | GetFileNameLineNum (LineNum, &FileName, &FileLine);\r | |
181 | printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);\r | |
182 | }\r | |
183 | \r | |
184 | UINT8\r | |
185 | CVfrErrorHandle::HandleError (\r | |
186 | IN EFI_VFR_RETURN_CODE ErrorCode,\r | |
187 | IN UINT32 LineNum,\r | |
188 | IN INT8 *TokName\r | |
189 | )\r | |
190 | {\r | |
191 | UINT32 Index;\r | |
192 | INT8 *FileName = NULL;\r | |
193 | UINT32 FileLine;\r | |
194 | INT8 *ErrorMsg = NULL;\r | |
195 | \r | |
196 | if (mVfrErrorHandleTable == NULL) {\r | |
197 | return 1;\r | |
198 | }\r | |
199 | \r | |
200 | for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {\r | |
201 | if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {\r | |
202 | ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;\r | |
203 | break;\r | |
204 | }\r | |
205 | }\r | |
206 | \r | |
207 | if (ErrorMsg != NULL) {\r | |
208 | GetFileNameLineNum (LineNum, &FileName, &FileLine);\r | |
209 | printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);\r | |
210 | return 1;\r | |
211 | } else {\r | |
212 | return 0;\r | |
213 | }\r | |
214 | }\r | |
215 | \r | |
216 | CVfrErrorHandle gCVfrErrorHandle;\r |