]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
BaseTools: resolve initialization order errors in VfrFormPkg.h
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrCompiler.cpp
CommitLineData
30fdf114
LG
1/** @file\r
2 \r
3 VfrCompiler main class and main function.\r
4\r
9edcd278 5Copyright (c) 2004 - 2017, 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 "stdlib.h"\r
18#include "string.h"\r
19#include "VfrCompiler.h"\r
20#include "CommonLib.h"\r
21#include "EfiUtilityMsgs.h"\r
22\r
23PACKAGE_DATA gCBuffer;\r
24PACKAGE_DATA gRBuffer;\r
4234283c 25CVfrStringDB gCVfrStringDB;\r
30fdf114
LG
26\r
27VOID \r
52302d4d
LG
28CVfrCompiler::DebugError (\r
29 IN CHAR8 *FileName,\r
30 IN UINT32 LineNumber,\r
31 IN UINT32 MessageCode,\r
32 IN CONST CHAR8 *Text,\r
33 IN CONST CHAR8 *MsgFmt,\r
34 ...\r
35 ) \r
36{\r
37 va_list List;\r
38 va_start (List, MsgFmt);\r
39 PrintMessage ((CHAR8 *) "ERROR", FileName, LineNumber, MessageCode, (CHAR8 *) Text, (CHAR8 *) MsgFmt, List);\r
40 va_end (List);\r
30fdf114
LG
41}\r
42\r
43VOID\r
44CVfrCompiler::SET_RUN_STATUS (\r
45 IN COMPILER_RUN_STATUS Status\r
46 )\r
47{\r
48 mRunStatus = Status;\r
49}\r
50\r
51BOOLEAN\r
52CVfrCompiler::IS_RUN_STATUS (\r
53 IN COMPILER_RUN_STATUS Status\r
54 )\r
55{\r
56 return mRunStatus == Status;\r
57}\r
58\r
59VOID\r
60CVfrCompiler::OptionInitialization (\r
61 IN INT32 Argc, \r
62 IN CHAR8 **Argv\r
63 )\r
64{\r
65 INT32 Index;\r
4234283c
LG
66 EFI_STATUS Status;\r
67\r
68 Status = EFI_SUCCESS;\r
52302d4d 69 SetUtilityName ((CHAR8*) PROGRAM_NAME);\r
30fdf114 70\r
a6ac965b
HW
71 mOptions.VfrFileName = NULL;\r
72 mOptions.RecordListFile = NULL;\r
30fdf114
LG
73 mOptions.CreateRecordListFile = FALSE;\r
74 mOptions.CreateIfrPkgFile = FALSE;\r
a6ac965b
HW
75 mOptions.PkgOutputFileName = NULL;\r
76 mOptions.COutputFileName = NULL;\r
77 mOptions.OutputDirectory = NULL;\r
78 mOptions.PreprocessorOutputFileName = NULL;\r
79 mOptions.VfrBaseFileName = NULL;\r
30fdf114
LG
80 mOptions.IncludePaths = NULL;\r
81 mOptions.SkipCPreprocessor = TRUE;\r
82 mOptions.CPreprocessorOptions = NULL;\r
83 mOptions.CompatibleMode = FALSE;\r
4234283c 84 mOptions.HasOverrideClassGuid = FALSE;\r
4afd3d04 85 mOptions.WarningAsError = FALSE;\r
74bbe31b
DB
86 mOptions.AutoDefault = FALSE;\r
87 mOptions.CheckDefault = FALSE;\r
4234283c 88 memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID));\r
30fdf114
LG
89 \r
90 if (Argc == 1) {\r
91 Usage ();\r
92 SET_RUN_STATUS (STATUS_DEAD);\r
93 return;\r
94 }\r
95\r
96 for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) {\r
97 if ((stricmp(Argv[Index], "-h") == 0) || (stricmp(Argv[Index], "--help") == 0)) {\r
98 Usage ();\r
99 SET_RUN_STATUS (STATUS_DEAD);\r
100 return;\r
cebd6ef9
ED
101 } else if (stricmp(Argv[Index], "--version") == 0) {\r
102 Version ();\r
103 SET_RUN_STATUS (STATUS_DEAD);\r
104 return;\r
30fdf114
LG
105 } else if (stricmp(Argv[Index], "-l") == 0) {\r
106 mOptions.CreateRecordListFile = TRUE;\r
107 gCIfrRecordInfoDB.TurnOn ();\r
108 } else if (stricmp(Argv[Index], "-i") == 0) {\r
30fdf114
LG
109 Index++;\r
110 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
52302d4d 111 DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument"); \r
30fdf114
LG
112 goto Fail;\r
113 }\r
114\r
115 AppendIncludePath(Argv[Index]);\r
116 } else if (stricmp(Argv[Index], "-o") == 0 || stricmp(Argv[Index], "--output-directory") == 0 || stricmp(Argv[Index], "-od") == 0) {\r
117 Index++;\r
118 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
52302d4d 119 DebugError (NULL, 0, 1001, "Missing option", "-o missing output directory name");\r
30fdf114
LG
120 goto Fail;\r
121 }\r
a6ac965b
HW
122\r
123 mOptions.OutputDirectory = (CHAR8 *) malloc (strlen (Argv[Index]) + strlen ("\\") + 1);\r
124 if (mOptions.OutputDirectory == NULL) {\r
125 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
126 goto Fail;\r
127 }\r
30fdf114
LG
128 strcpy (mOptions.OutputDirectory, Argv[Index]);\r
129 \r
130 CHAR8 lastChar = mOptions.OutputDirectory[strlen(mOptions.OutputDirectory) - 1];\r
131 if ((lastChar != '/') && (lastChar != '\\')) {\r
132 if (strchr(mOptions.OutputDirectory, '/') != NULL) {\r
133 strcat (mOptions.OutputDirectory, "/");\r
134 } else {\r
135 strcat (mOptions.OutputDirectory, "\\");\r
136 }\r
137 }\r
38eb573b 138 DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", (CHAR8 *) "%s", mOptions.OutputDirectory);\r
30fdf114
LG
139 } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) {\r
140 mOptions.CreateIfrPkgFile = TRUE;\r
141 } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) {\r
142 mOptions.SkipCPreprocessor = TRUE;\r
143 } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) {\r
30fdf114
LG
144 Index++;\r
145 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
52302d4d 146 DebugError (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");\r
30fdf114
LG
147 goto Fail;\r
148 }\r
149\r
150 AppendCPreprocessorOptions (Argv[Index]);\r
151 } else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) {\r
152 mOptions.CompatibleMode = TRUE;\r
4234283c
LG
153 } else if (stricmp(Argv[Index], "-s") == 0|| stricmp(Argv[Index], "--string-db") == 0) {\r
154 Index++;\r
155 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
156 DebugError (NULL, 0, 1001, "Missing option", "-s missing input string file name");\r
157 goto Fail;\r
158 }\r
159 gCVfrStringDB.SetStringFileName(Argv[Index]);\r
38eb573b 160 DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", (CHAR8 *) "%s", Argv[Index]);\r
4234283c
LG
161 } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) {\r
162 Index++;\r
163 Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid);\r
164 if (EFI_ERROR (Status)) {\r
165 DebugError (NULL, 0, 1000, "Invalid format:", "%s", Argv[Index]);\r
166 goto Fail;\r
167 }\r
168 mOptions.HasOverrideClassGuid = TRUE;\r
4afd3d04
LG
169 } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {\r
170 mOptions.WarningAsError = TRUE;\r
74bbe31b
DB
171 } else if (stricmp(Argv[Index], "-a") == 0 ||stricmp(Argv[Index], "--autodefault") == 0) {\r
172 mOptions.AutoDefault = TRUE;\r
173 } else if (stricmp(Argv[Index], "-d") == 0 ||stricmp(Argv[Index], "--checkdefault") == 0) {\r
174 mOptions.CheckDefault = TRUE;\r
30fdf114 175 } else {\r
52302d4d 176 DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
30fdf114
LG
177 goto Fail;\r
178 }\r
179 }\r
180\r
181 if (Index != Argc - 1) {\r
52302d4d 182 DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
30fdf114
LG
183 goto Fail;\r
184 } else {\r
a6ac965b
HW
185 mOptions.VfrFileName = (CHAR8 *) malloc (strlen (Argv[Index]) + 1);\r
186 if (mOptions.VfrFileName == NULL) {\r
187 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
188 goto Fail;\r
189 }\r
30fdf114 190 strcpy (mOptions.VfrFileName, Argv[Index]);\r
a6ac965b
HW
191\r
192 if (mOptions.OutputDirectory == NULL) {\r
193 mOptions.OutputDirectory = (CHAR8 *) malloc (1);\r
194 if (mOptions.OutputDirectory == NULL) {\r
195 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
196 goto Fail;\r
197 }\r
198 mOptions.OutputDirectory[0] = '\0';\r
199 }\r
30fdf114
LG
200 }\r
201\r
202 if (SetBaseFileName() != 0) {\r
203 goto Fail;\r
204 }\r
205 if (SetPkgOutputFileName () != 0) {\r
206 goto Fail;\r
207 }\r
208 if (SetCOutputFileName() != 0) {\r
209 goto Fail;\r
210 }\r
211 if (SetPreprocessorOutputFileName () != 0) {\r
212 goto Fail;\r
213 }\r
214 if (SetRecordListFileName () != 0) {\r
215 goto Fail;\r
216 }\r
217 return;\r
218\r
219Fail:\r
220 SET_RUN_STATUS (STATUS_DEAD);\r
221\r
30fdf114
LG
222 mOptions.CreateRecordListFile = FALSE;\r
223 mOptions.CreateIfrPkgFile = FALSE;\r
a6ac965b
HW
224\r
225 if (mOptions.VfrFileName != NULL) {\r
226 free (mOptions.VfrFileName);\r
227 mOptions.VfrFileName = NULL;\r
228 }\r
229 if (mOptions.VfrBaseFileName != NULL) {\r
230 free (mOptions.VfrBaseFileName);\r
231 mOptions.VfrBaseFileName = NULL;\r
232 }\r
233 if (mOptions.OutputDirectory != NULL) {\r
234 free (mOptions.OutputDirectory);\r
235 mOptions.OutputDirectory = NULL;\r
236 }\r
237 if (mOptions.PkgOutputFileName != NULL) {\r
238 free (mOptions.PkgOutputFileName);\r
239 mOptions.PkgOutputFileName = NULL;\r
240 }\r
241 if (mOptions.COutputFileName != NULL) {\r
242 free (mOptions.COutputFileName);\r
243 mOptions.COutputFileName = NULL;\r
244 }\r
245 if (mOptions.PreprocessorOutputFileName != NULL) {\r
246 free (mOptions.PreprocessorOutputFileName);\r
247 mOptions.PreprocessorOutputFileName = NULL;\r
248 }\r
249 if (mOptions.RecordListFile != NULL) {\r
250 free (mOptions.RecordListFile);\r
251 mOptions.RecordListFile = NULL;\r
252 }\r
30fdf114
LG
253 if (mOptions.IncludePaths != NULL) {\r
254 delete mOptions.IncludePaths;\r
255 mOptions.IncludePaths = NULL;\r
256 } \r
257 if (mOptions.CPreprocessorOptions != NULL) {\r
258 delete mOptions.CPreprocessorOptions;\r
259 mOptions.CPreprocessorOptions = NULL;\r
260 }\r
261}\r
262\r
263VOID\r
264CVfrCompiler::AppendIncludePath (\r
265 IN CHAR8 *PathStr\r
266 )\r
267{\r
268 UINT32 Len = 0;\r
269 CHAR8 *IncludePaths = NULL;\r
270\r
271 Len = strlen (" -I ") + strlen (PathStr) + 1;\r
272 if (mOptions.IncludePaths != NULL) {\r
273 Len += strlen (mOptions.IncludePaths);\r
274 }\r
275 IncludePaths = new CHAR8[Len];\r
276 if (IncludePaths == NULL) {\r
52302d4d 277 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
278 return;\r
279 }\r
280 IncludePaths[0] = '\0';\r
281 if (mOptions.IncludePaths != NULL) {\r
282 strcat (IncludePaths, mOptions.IncludePaths);\r
283 }\r
284 strcat (IncludePaths, " -I ");\r
285 strcat (IncludePaths, PathStr);\r
286 if (mOptions.IncludePaths != NULL) {\r
287 delete mOptions.IncludePaths;\r
288 }\r
289 mOptions.IncludePaths = IncludePaths;\r
290}\r
291\r
292VOID\r
293CVfrCompiler::AppendCPreprocessorOptions (\r
294 IN CHAR8 *Options\r
295 )\r
296{\r
297 UINT32 Len = 0;\r
298 CHAR8 *Opt = NULL;\r
299\r
300 Len = strlen (Options) + strlen (" ") + 1;\r
301 if (mOptions.CPreprocessorOptions != NULL) {\r
302 Len += strlen (mOptions.CPreprocessorOptions);\r
303 }\r
304 Opt = new CHAR8[Len];\r
305 if (Opt == NULL) {\r
52302d4d 306 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
307 return;\r
308 }\r
309 Opt[0] = 0;\r
310 if (mOptions.CPreprocessorOptions != NULL) {\r
311 strcat (Opt, mOptions.CPreprocessorOptions);\r
312 }\r
313 strcat (Opt, " ");\r
314 strcat (Opt, Options);\r
315 if (mOptions.CPreprocessorOptions != NULL) {\r
316 delete mOptions.CPreprocessorOptions;\r
317 }\r
318 mOptions.CPreprocessorOptions = Opt;\r
319}\r
320\r
321INT8\r
322CVfrCompiler::SetBaseFileName (\r
323 VOID\r
324 )\r
325{\r
326 CHAR8 *pFileName, *pPath, *pExt;\r
327\r
a6ac965b 328 if (mOptions.VfrFileName == NULL) {\r
30fdf114
LG
329 return -1;\r
330 }\r
331\r
332 pFileName = mOptions.VfrFileName;\r
333 while (\r
334 ((pPath = strchr (pFileName, '\\')) != NULL) ||\r
335 ((pPath = strchr (pFileName, '/')) != NULL)\r
336 )\r
337 {\r
338 pFileName = pPath + 1;\r
339 }\r
340\r
341 if (pFileName == NULL) {\r
342 return -1;\r
343 }\r
344\r
345 if ((pExt = strchr (pFileName, '.')) == NULL) {\r
346 return -1;\r
347 }\r
348\r
a6ac965b 349 *pExt = '\0';\r
a6ac965b
HW
350\r
351 mOptions.VfrBaseFileName = (CHAR8 *) malloc (strlen (pFileName) + 1);\r
352 if (mOptions.VfrBaseFileName == NULL) {\r
353 *pExt = '.';\r
354 return -1;\r
355 }\r
356\r
357 strcpy (mOptions.VfrBaseFileName, pFileName);\r
358 *pExt = '.';\r
30fdf114
LG
359\r
360 return 0;\r
361}\r
362\r
363INT8\r
364CVfrCompiler::SetPkgOutputFileName (\r
365 VOID\r
366 )\r
367{\r
a6ac965b
HW
368 INTN Length;\r
369\r
370 if (mOptions.VfrBaseFileName == NULL) {\r
371 return -1;\r
372 }\r
373\r
374 Length = strlen (mOptions.OutputDirectory) +\r
375 strlen (mOptions.VfrBaseFileName) +\r
376 strlen (VFR_PACKAGE_FILENAME_EXTENSION) +\r
377 1;\r
a6ac965b
HW
378\r
379 mOptions.PkgOutputFileName = (CHAR8 *) malloc (Length);\r
380 if (mOptions.PkgOutputFileName == NULL) {\r
30fdf114
LG
381 return -1;\r
382 }\r
383\r
384 strcpy (mOptions.PkgOutputFileName, mOptions.OutputDirectory);\r
385 strcat (mOptions.PkgOutputFileName, mOptions.VfrBaseFileName);\r
386 strcat (mOptions.PkgOutputFileName, VFR_PACKAGE_FILENAME_EXTENSION);\r
387\r
388 return 0;\r
389}\r
390\r
391INT8\r
392CVfrCompiler::SetCOutputFileName (\r
393 VOID\r
394 )\r
395{\r
a6ac965b
HW
396 INTN Length;\r
397\r
398 if (mOptions.VfrBaseFileName == NULL) {\r
399 return -1;\r
400 }\r
401\r
402 Length = strlen (mOptions.OutputDirectory) +\r
403 strlen (mOptions.VfrBaseFileName) +\r
404 strlen (".c") +\r
405 1;\r
a6ac965b
HW
406\r
407 mOptions.COutputFileName = (CHAR8 *) malloc (Length);\r
408 if (mOptions.COutputFileName == NULL) {\r
30fdf114
LG
409 return -1;\r
410 }\r
411\r
412 strcpy (mOptions.COutputFileName, mOptions.OutputDirectory);\r
413 strcat (mOptions.COutputFileName, mOptions.VfrBaseFileName);\r
414 strcat (mOptions.COutputFileName, ".c");\r
415\r
416 return 0;\r
417}\r
418\r
419INT8\r
420CVfrCompiler::SetPreprocessorOutputFileName (\r
421 VOID\r
422 )\r
423{\r
a6ac965b
HW
424 INTN Length;\r
425\r
426 if (mOptions.VfrBaseFileName == NULL) {\r
427 return -1;\r
428 }\r
429\r
430 Length = strlen (mOptions.OutputDirectory) +\r
431 strlen (mOptions.VfrBaseFileName) +\r
432 strlen (VFR_PREPROCESS_FILENAME_EXTENSION) +\r
433 1;\r
a6ac965b
HW
434\r
435 mOptions.PreprocessorOutputFileName = (CHAR8 *) malloc (Length);\r
436 if (mOptions.PreprocessorOutputFileName == NULL) {\r
30fdf114
LG
437 return -1;\r
438 }\r
439\r
440 strcpy (mOptions.PreprocessorOutputFileName, mOptions.OutputDirectory);\r
441 strcat (mOptions.PreprocessorOutputFileName, mOptions.VfrBaseFileName);\r
442 strcat (mOptions.PreprocessorOutputFileName, VFR_PREPROCESS_FILENAME_EXTENSION);\r
443\r
444 return 0;\r
445}\r
446\r
447INT8\r
448CVfrCompiler::SetRecordListFileName (\r
449 VOID\r
450 )\r
451{\r
a6ac965b
HW
452 INTN Length;\r
453\r
454 if (mOptions.VfrBaseFileName == NULL) {\r
455 return -1;\r
456 }\r
457\r
458 Length = strlen (mOptions.OutputDirectory) +\r
459 strlen (mOptions.VfrBaseFileName) +\r
460 strlen (VFR_RECORDLIST_FILENAME_EXTENSION) +\r
461 1;\r
a6ac965b
HW
462\r
463 mOptions.RecordListFile = (CHAR8 *) malloc (Length);\r
464 if (mOptions.RecordListFile == NULL) {\r
30fdf114
LG
465 return -1;\r
466 }\r
467\r
468 strcpy (mOptions.RecordListFile, mOptions.OutputDirectory);\r
469 strcat (mOptions.RecordListFile, mOptions.VfrBaseFileName);\r
470 strcat (mOptions.RecordListFile, VFR_RECORDLIST_FILENAME_EXTENSION);\r
471\r
472 return 0;\r
473}\r
474\r
475CVfrCompiler::CVfrCompiler (\r
476 IN INT32 Argc, \r
477 IN CHAR8 **Argv\r
478 )\r
479{\r
52302d4d
LG
480 mPreProcessCmd = (CHAR8 *) PREPROCESSOR_COMMAND;\r
481 mPreProcessOpt = (CHAR8 *) PREPROCESSOR_OPTIONS;\r
30fdf114 482\r
e4ac870f
LG
483 SET_RUN_STATUS (STATUS_STARTED);\r
484\r
30fdf114
LG
485 OptionInitialization(Argc, Argv);\r
486\r
487 if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {\r
488 return;\r
489 }\r
490\r
491 SET_RUN_STATUS(STATUS_INITIALIZED);\r
492}\r
493\r
494CVfrCompiler::~CVfrCompiler (\r
495 VOID\r
496 )\r
497{\r
a6ac965b
HW
498 if (mOptions.VfrFileName != NULL) {\r
499 free (mOptions.VfrFileName);\r
500 mOptions.VfrFileName = NULL;\r
501 }\r
502\r
503 if (mOptions.VfrBaseFileName != NULL) {\r
504 free (mOptions.VfrBaseFileName);\r
505 mOptions.VfrBaseFileName = NULL;\r
506 }\r
507\r
508 if (mOptions.OutputDirectory != NULL) {\r
509 free (mOptions.OutputDirectory);\r
510 mOptions.OutputDirectory = NULL;\r
511 }\r
512\r
513 if (mOptions.PkgOutputFileName != NULL) {\r
514 free (mOptions.PkgOutputFileName);\r
515 mOptions.PkgOutputFileName = NULL;\r
516 }\r
517\r
518 if (mOptions.COutputFileName != NULL) {\r
519 free (mOptions.COutputFileName);\r
520 mOptions.COutputFileName = NULL;\r
521 }\r
522\r
523 if (mOptions.PreprocessorOutputFileName != NULL) {\r
524 free (mOptions.PreprocessorOutputFileName);\r
525 mOptions.PreprocessorOutputFileName = NULL;\r
526 }\r
527\r
528 if (mOptions.RecordListFile != NULL) {\r
529 free (mOptions.RecordListFile);\r
530 mOptions.RecordListFile = NULL;\r
531 }\r
532\r
30fdf114
LG
533 if (mOptions.IncludePaths != NULL) {\r
534 delete mOptions.IncludePaths;\r
535 mOptions.IncludePaths = NULL;\r
536 }\r
537\r
538 if (mOptions.CPreprocessorOptions != NULL) {\r
539 delete mOptions.CPreprocessorOptions;\r
540 mOptions.CPreprocessorOptions = NULL;\r
541 }\r
542\r
543 SET_RUN_STATUS(STATUS_DEAD);\r
544}\r
545\r
546VOID \r
547CVfrCompiler::Usage (\r
548 VOID\r
549 )\r
550{\r
551 UINT32 Index;\r
552 CONST CHAR8 *Help[] = {\r
553 " ", \r
45258285
LG
554 "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
555 "Copyright (c) 2004-2016 Intel Corporation. All rights reserved.",\r
30fdf114
LG
556 " ",\r
557 "Usage: VfrCompile [options] VfrFile",\r
558 " ",\r
559 "Options:",\r
560 " -h, --help prints this help",\r
cebd6ef9 561 " --version prints version info",\r
30fdf114
LG
562 " -l create an output IFR listing file",\r
563 " -o DIR, --output-directory DIR",\r
564 " deposit all output files to directory OutputDir",\r
565 " default is current directory",\r
566 " -b, --create-ifr-package",\r
567 " create an IFR HII pack file",\r
568 " -n, --no-pre-processing",\r
569 " do not preprocessing input file",\r
570 " -c, --compatible-framework",\r
571 " compatible framework vfr file",\r
4234283c
LG
572 " -s, --string-db",\r
573 " input uni string package file",\r
574 " -g, --guid",\r
575 " override class guid input",\r
576 " format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",\r
4afd3d04
LG
577 " -w --warning-as-error",\r
578 " treat warning as an error",\r
74bbe31b
DB
579 " -a --autodefaut generate default value for question opcode if some default is missing",\r
580 " -d --checkdefault check the default information in a question opcode",\r
30fdf114
LG
581 NULL\r
582 };\r
583 for (Index = 0; Help[Index] != NULL; Index++) {\r
584 fprintf (stdout, "%s\n", Help[Index]);\r
585 }\r
586}\r
587\r
cebd6ef9
ED
588VOID \r
589CVfrCompiler::Version (\r
590 VOID\r
591 )\r
592{\r
593 UINT32 Index;\r
594 CONST CHAR8 *Help[] = {\r
45258285 595 "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
cebd6ef9
ED
596 NULL\r
597 };\r
598 for (Index = 0; Help[Index] != NULL; Index++) {\r
599 fprintf (stdout, "%s\n", Help[Index]);\r
600 }\r
601}\r
602\r
30fdf114
LG
603VOID\r
604CVfrCompiler::PreProcess (\r
605 VOID\r
606 )\r
607{\r
608 FILE *pVfrFile = NULL;\r
609 UINT32 CmdLen = 0;\r
610 CHAR8 *PreProcessCmd = NULL;\r
611\r
612 if (!IS_RUN_STATUS(STATUS_INITIALIZED)) {\r
613 goto Fail;\r
614 }\r
615\r
616 if (mOptions.SkipCPreprocessor == TRUE) {\r
617 goto Out;\r
618 }\r
619\r
1be2ed90 620 if ((pVfrFile = fopen (LongFilePath (mOptions.VfrFileName), "r")) == NULL) {\r
8c1e13d3 621 DebugError (NULL, 0, 0001, "Error opening the input VFR file", "%s", mOptions.VfrFileName);\r
30fdf114
LG
622 goto Fail;\r
623 }\r
624 fclose (pVfrFile);\r
625\r
626 CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) + \r
627 strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName);\r
628 if (mOptions.CPreprocessorOptions != NULL) {\r
629 CmdLen += strlen (mOptions.CPreprocessorOptions);\r
630 }\r
631 if (mOptions.IncludePaths != NULL) {\r
632 CmdLen += strlen (mOptions.IncludePaths);\r
633 }\r
634\r
635 PreProcessCmd = new CHAR8[CmdLen + 10];\r
636 if (PreProcessCmd == NULL) {\r
52302d4d 637 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
638 goto Fail;\r
639 }\r
640 strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " ");\r
641 strcat (PreProcessCmd, mPreProcessOpt), strcat (PreProcessCmd, " ");\r
642 if (mOptions.IncludePaths != NULL) {\r
643 strcat (PreProcessCmd, mOptions.IncludePaths), strcat (PreProcessCmd, " ");\r
644 }\r
645 if (mOptions.CPreprocessorOptions != NULL) {\r
646 strcat (PreProcessCmd, mOptions.CPreprocessorOptions), strcat (PreProcessCmd, " ");\r
647 }\r
648 strcat (PreProcessCmd, mOptions.VfrFileName), strcat (PreProcessCmd, " > ");\r
649 strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName);\r
650\r
651 if (system (PreProcessCmd) != 0) {\r
52302d4d 652 DebugError (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd);\r
30fdf114
LG
653 goto Fail;\r
654 }\r
655\r
fd542523 656 delete[] PreProcessCmd;\r
30fdf114
LG
657\r
658Out:\r
659 SET_RUN_STATUS (STATUS_PREPROCESSED);\r
660 return;\r
661\r
662Fail:\r
663 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
664 SET_RUN_STATUS (STATUS_FAILED);\r
665 }\r
fd542523 666 delete[] PreProcessCmd;\r
30fdf114
LG
667}\r
668\r
4234283c 669extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *);\r
30fdf114
LG
670\r
671VOID\r
672CVfrCompiler::Compile (\r
673 VOID\r
674 )\r
675{\r
676 FILE *pInFile = NULL;\r
677 CHAR8 *InFileName = NULL;\r
4234283c 678 INPUT_INFO_TO_SYNTAX InputInfo;\r
30fdf114
LG
679\r
680 if (!IS_RUN_STATUS(STATUS_PREPROCESSED)) {\r
681 goto Fail;\r
682 }\r
683\r
684 InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
685\r
686 gCVfrErrorHandle.SetInputFile (InFileName);\r
4afd3d04 687 gCVfrErrorHandle.SetWarningAsError(mOptions.WarningAsError);\r
30fdf114 688\r
1be2ed90 689 if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
8c1e13d3 690 DebugError (NULL, 0, 0001, "Error opening the input file", "%s", InFileName);\r
30fdf114
LG
691 goto Fail;\r
692 }\r
693\r
4234283c
LG
694 InputInfo.CompatibleMode = mOptions.CompatibleMode;\r
695 if (mOptions.HasOverrideClassGuid) {\r
696 InputInfo.OverrideClassGuid = &mOptions.OverrideClassGuid;\r
697 } else {\r
698 InputInfo.OverrideClassGuid = NULL;\r
699 }\r
700\r
701 if (VfrParserStart (pInFile, &InputInfo) != 0) {\r
30fdf114
LG
702 goto Fail;\r
703 }\r
704\r
705 fclose (pInFile);\r
9edcd278 706 pInFile = NULL;\r
30fdf114
LG
707\r
708 if (gCFormPkg.HavePendingUnassigned () == TRUE) {\r
709 gCFormPkg.PendingAssignPrintAll ();\r
710 goto Fail;\r
711 }\r
712\r
713 SET_RUN_STATUS (STATUS_COMPILEED);\r
714 return;\r
715\r
716Fail:\r
717 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
52302d4d 718 DebugError (NULL, 0, 0003, "Error parsing", "compile error in file %s", InFileName);\r
30fdf114
LG
719 SET_RUN_STATUS (STATUS_FAILED);\r
720 }\r
721 if (pInFile != NULL) {\r
722 fclose (pInFile);\r
723 }\r
724}\r
725\r
4afd3d04 726VOID\r
74bbe31b 727CVfrCompiler::AdjustBin (\r
4afd3d04
LG
728 VOID\r
729 )\r
730{\r
74bbe31b 731 EFI_VFR_RETURN_CODE Status;\r
4afd3d04 732\r
74bbe31b 733 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
4afd3d04
LG
734 return;\r
735 }\r
4afd3d04 736\r
74bbe31b
DB
737 if (gNeedAdjustOpcode) {\r
738 //\r
739 // When parsing the Vfr, has created some opcodes, now need to update the record info.\r
740 //\r
741 gCIfrRecordInfoDB.IfrUpdateRecordInfoForDynamicOpcode (FALSE);\r
742 }\r
4afd3d04
LG
743\r
744 //\r
74bbe31b 745 // Check whether need to check default info for question or auto add default for question.\r
4afd3d04 746 //\r
74bbe31b
DB
747 if (mOptions.AutoDefault || mOptions.CheckDefault) {\r
748 gCIfrRecordInfoDB.IfrCheckAddDefaultRecord (mOptions.AutoDefault, mOptions.CheckDefault);\r
4afd3d04
LG
749 }\r
750\r
30fdf114
LG
751 //\r
752 // Check Binary Code consistent between Form and IfrRecord\r
753 //\r
754\r
755 //\r
756 // Get Package Data and IfrRecord Data\r
757 //\r
758 gCFormPkg.BuildPkg (gCBuffer);\r
759 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
760\r
761 //\r
762 // Compare Form and Record data\r
763 //\r
764 if (gCBuffer.Buffer != NULL && gRBuffer.Buffer != NULL) {\r
765 UINT32 Index;\r
766 if (gCBuffer.Size != gRBuffer.Size) {\r
52302d4d 767 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. FormBinary Size 0x%X is not same to RecordBuffer Size 0x%X", mOptions.VfrFileName, gCBuffer.Size, gRBuffer.Size);\r
30fdf114
LG
768 }\r
769 for (Index = 0; Index < gCBuffer.Size; Index ++) {\r
770 if (gCBuffer.Buffer[Index] != gRBuffer.Buffer[Index]) {\r
771 break;\r
772 }\r
773 }\r
774 if (Index != gCBuffer.Size) {\r
52302d4d 775 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions.VfrFileName, Index);\r
30fdf114 776 }\r
52302d4d 777 DebugMsg (NULL, 0, 9, (CHAR8 *) "IFR Buffer", (CHAR8 *) "Form Buffer same to Record Buffer and Size is 0x%X", Index);\r
30fdf114
LG
778 } else if (gCBuffer.Buffer == NULL && gRBuffer.Buffer == NULL) {\r
779 //ok\r
780 } else {\r
52302d4d 781 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions.VfrFileName);\r
30fdf114
LG
782 }\r
783\r
784 //\r
785 // For UEFI mode, not do OpCode Adjust\r
786 //\r
787 if (mOptions.CompatibleMode) {\r
788 //\r
789 // Adjust Opcode to be compatible with framework vfr\r
790 //\r
791 Status = gCIfrRecordInfoDB.IfrRecordAdjust ();\r
792 if (Status != VFR_RETURN_SUCCESS) {\r
793 //\r
794 // Record List Adjust Failed\r
795 //\r
796 SET_RUN_STATUS (STATUS_FAILED);\r
797 return;\r
798 }\r
799 //\r
800 // Re get the IfrRecord Buffer.\r
801 //\r
802 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
803 }\r
804\r
805 return;\r
806}\r
807\r
808VOID\r
809CVfrCompiler::GenBinary (\r
810 VOID\r
811 )\r
812{\r
813 FILE *pFile = NULL;\r
814\r
815 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
816 goto Fail;\r
817 }\r
818\r
819 if (mOptions.CreateIfrPkgFile == TRUE) {\r
1be2ed90 820 if ((pFile = fopen (LongFilePath (mOptions.PkgOutputFileName), "wb")) == NULL) {\r
8c1e13d3 821 DebugError (NULL, 0, 0001, "Error opening file", "%s", mOptions.PkgOutputFileName);\r
30fdf114
LG
822 goto Fail;\r
823 }\r
824 if (gCFormPkg.BuildPkg (pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
825 fclose (pFile);\r
826 goto Fail;\r
827 }\r
828 fclose (pFile);\r
829 }\r
830\r
831 SET_RUN_STATUS (STATUS_GENBINARY);\r
832\r
833 return;\r
834\r
835Fail:\r
836 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
837 SET_RUN_STATUS (STATUS_FAILED);\r
838 }\r
839}\r
840\r
841static const char *gSourceFileHeader[] = {\r
842 "//",\r
843 "// DO NOT EDIT -- auto-generated file",\r
844 "//",\r
845 "// This file is generated by the vfrcompiler utility",\r
846 "//",\r
847 NULL\r
848};\r
849\r
850VOID\r
851CVfrCompiler::GenCFile (\r
852 VOID\r
853 )\r
854{\r
855 FILE *pFile;\r
856 UINT32 Index;\r
857\r
858 if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
859 goto Fail;\r
860 }\r
b303ea72
LG
861 \r
862 if (!mOptions.CreateIfrPkgFile || mOptions.CompatibleMode) {\r
1be2ed90 863 if ((pFile = fopen (LongFilePath (mOptions.COutputFileName), "w")) == NULL) {\r
8c1e13d3 864 DebugError (NULL, 0, 0001, "Error opening output C file", "%s", mOptions.COutputFileName);\r
b303ea72
LG
865 goto Fail;\r
866 }\r
30fdf114 867\r
b303ea72
LG
868 for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
869 fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
870 }\r
30fdf114 871\r
b303ea72
LG
872 if (mOptions.CompatibleMode) { \r
873 gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
874 }\r
30fdf114 875\r
b303ea72
LG
876 if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
877 fclose (pFile);\r
878 goto Fail;\r
879 }\r
30fdf114 880 fclose (pFile);\r
30fdf114 881 }\r
30fdf114
LG
882\r
883 SET_RUN_STATUS (STATUS_FINISHED);\r
884 return;\r
885\r
886Fail:\r
887 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
888 SET_RUN_STATUS (STATUS_FAILED);\r
889 }\r
890}\r
891\r
892VOID\r
893CVfrCompiler::GenRecordListFile (\r
894 VOID\r
895 )\r
896{\r
897 CHAR8 *InFileName = NULL;\r
898 FILE *pInFile = NULL;\r
899 FILE *pOutFile = NULL;\r
900 CHAR8 LineBuf[MAX_VFR_LINE_LEN];\r
901 UINT32 LineNo;\r
902\r
903 InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
904\r
8c1e13d3 905 if (mOptions.CreateRecordListFile == TRUE && InFileName != NULL && mOptions.RecordListFile != NULL) {\r
30fdf114
LG
906 if ((InFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {\r
907 return;\r
908 }\r
909\r
1be2ed90 910 if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
8c1e13d3 911 DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", "%s", InFileName);\r
30fdf114
LG
912 return;\r
913 }\r
914\r
1be2ed90 915 if ((pOutFile = fopen (LongFilePath (mOptions.RecordListFile), "w")) == NULL) {\r
8c1e13d3 916 DebugError (NULL, 0, 0001, "Error opening the record list file", "%s", mOptions.RecordListFile);\r
30fdf114
LG
917 goto Err1;\r
918 }\r
919\r
b36d134f 920 fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION __BUILD_VERSION "\n//\n");\r
30fdf114
LG
921 LineNo = 0;\r
922 while (!feof (pInFile)) {\r
923 if (fgets (LineBuf, MAX_VFR_LINE_LEN, pInFile) != NULL) {\r
924 fprintf (pOutFile, "%s", LineBuf);\r
925 LineNo++;\r
926 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);\r
927 }\r
928 }\r
929 \r
930 fprintf (pOutFile, "\n//\n// All Opcode Record List \n//\n");\r
931 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, 0);\r
932 gCVfrVarDataTypeDB.Dump(pOutFile);\r
933\r
934 fclose (pOutFile);\r
935 fclose (pInFile);\r
936 }\r
937\r
938 return;\r
939\r
940Err1:\r
941 fclose (pInFile);\r
942}\r
943\r
944int\r
945main (\r
52302d4d
LG
946 IN int Argc, \r
947 IN char **Argv\r
30fdf114
LG
948 )\r
949{\r
950 COMPILER_RUN_STATUS Status;\r
4afd3d04
LG
951\r
952 SetPrintLevel(WARNING_LOG_LEVEL);\r
30fdf114
LG
953 CVfrCompiler Compiler(Argc, Argv);\r
954 \r
955 Compiler.PreProcess();\r
956 Compiler.Compile();\r
957 Compiler.AdjustBin();\r
958 Compiler.GenBinary();\r
959 Compiler.GenCFile();\r
960 Compiler.GenRecordListFile ();\r
961\r
962 Status = Compiler.RunStatus ();\r
963 if ((Status == STATUS_DEAD) || (Status == STATUS_FAILED)) {\r
964 return 2;\r
965 }\r
966\r
967 if (gCBuffer.Buffer != NULL) {\r
968 delete gCBuffer.Buffer;\r
969 }\r
970 \r
971 if (gRBuffer.Buffer != NULL) {\r
972 delete gRBuffer.Buffer;\r
973 }\r
974\r
975 return GetUtilityStatus ();\r
976}\r
977\r
52302d4d 978\r