]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
BaseTools/VfrCompile: Initialize local variables before being used
[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
45258285 5Copyright (c) 2004 - 2016, 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
LG
70\r
71 mOptions.VfrFileName[0] = '\0';\r
72 mOptions.RecordListFile[0] = '\0';\r
73 mOptions.CreateRecordListFile = FALSE;\r
74 mOptions.CreateIfrPkgFile = FALSE;\r
75 mOptions.PkgOutputFileName[0] = '\0';\r
76 mOptions.COutputFileName[0] = '\0';\r
77 mOptions.OutputDirectory[0] = '\0';\r
78 mOptions.PreprocessorOutputFileName[0] = '\0';\r
79 mOptions.VfrBaseFileName[0] = '\0';\r
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
122 strcpy (mOptions.OutputDirectory, Argv[Index]);\r
123 \r
124 CHAR8 lastChar = mOptions.OutputDirectory[strlen(mOptions.OutputDirectory) - 1];\r
125 if ((lastChar != '/') && (lastChar != '\\')) {\r
126 if (strchr(mOptions.OutputDirectory, '/') != NULL) {\r
127 strcat (mOptions.OutputDirectory, "/");\r
128 } else {\r
129 strcat (mOptions.OutputDirectory, "\\");\r
130 }\r
131 }\r
52302d4d 132 DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", mOptions.OutputDirectory);\r
30fdf114
LG
133 } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) {\r
134 mOptions.CreateIfrPkgFile = TRUE;\r
135 } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) {\r
136 mOptions.SkipCPreprocessor = TRUE;\r
137 } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) {\r
30fdf114
LG
138 Index++;\r
139 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
52302d4d 140 DebugError (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");\r
30fdf114
LG
141 goto Fail;\r
142 }\r
143\r
144 AppendCPreprocessorOptions (Argv[Index]);\r
145 } else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) {\r
146 mOptions.CompatibleMode = TRUE;\r
4234283c
LG
147 } else if (stricmp(Argv[Index], "-s") == 0|| stricmp(Argv[Index], "--string-db") == 0) {\r
148 Index++;\r
149 if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
150 DebugError (NULL, 0, 1001, "Missing option", "-s missing input string file name");\r
151 goto Fail;\r
152 }\r
153 gCVfrStringDB.SetStringFileName(Argv[Index]);\r
154 DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", Argv[Index]);\r
155 } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) {\r
156 Index++;\r
157 Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid);\r
158 if (EFI_ERROR (Status)) {\r
159 DebugError (NULL, 0, 1000, "Invalid format:", "%s", Argv[Index]);\r
160 goto Fail;\r
161 }\r
162 mOptions.HasOverrideClassGuid = TRUE;\r
4afd3d04
LG
163 } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {\r
164 mOptions.WarningAsError = TRUE;\r
74bbe31b
DB
165 } else if (stricmp(Argv[Index], "-a") == 0 ||stricmp(Argv[Index], "--autodefault") == 0) {\r
166 mOptions.AutoDefault = TRUE;\r
167 } else if (stricmp(Argv[Index], "-d") == 0 ||stricmp(Argv[Index], "--checkdefault") == 0) {\r
168 mOptions.CheckDefault = TRUE;\r
30fdf114 169 } else {\r
52302d4d 170 DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
30fdf114
LG
171 goto Fail;\r
172 }\r
173 }\r
174\r
175 if (Index != Argc - 1) {\r
52302d4d 176 DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
30fdf114
LG
177 goto Fail;\r
178 } else {\r
179 strcpy (mOptions.VfrFileName, Argv[Index]);\r
180 }\r
181\r
182 if (SetBaseFileName() != 0) {\r
183 goto Fail;\r
184 }\r
185 if (SetPkgOutputFileName () != 0) {\r
186 goto Fail;\r
187 }\r
188 if (SetCOutputFileName() != 0) {\r
189 goto Fail;\r
190 }\r
191 if (SetPreprocessorOutputFileName () != 0) {\r
192 goto Fail;\r
193 }\r
194 if (SetRecordListFileName () != 0) {\r
195 goto Fail;\r
196 }\r
197 return;\r
198\r
199Fail:\r
200 SET_RUN_STATUS (STATUS_DEAD);\r
201\r
202 mOptions.VfrFileName[0] = '\0';\r
203 mOptions.RecordListFile[0] = '\0';\r
204 mOptions.CreateRecordListFile = FALSE;\r
205 mOptions.CreateIfrPkgFile = FALSE;\r
206 mOptions.PkgOutputFileName[0] = '\0';\r
207 mOptions.COutputFileName[0] = '\0';\r
208 mOptions.OutputDirectory[0] = '\0';\r
209 mOptions.PreprocessorOutputFileName[0] = '\0';\r
210 mOptions.VfrBaseFileName[0] = '\0';\r
211 if (mOptions.IncludePaths != NULL) {\r
212 delete mOptions.IncludePaths;\r
213 mOptions.IncludePaths = NULL;\r
214 } \r
215 if (mOptions.CPreprocessorOptions != NULL) {\r
216 delete mOptions.CPreprocessorOptions;\r
217 mOptions.CPreprocessorOptions = NULL;\r
218 }\r
219}\r
220\r
221VOID\r
222CVfrCompiler::AppendIncludePath (\r
223 IN CHAR8 *PathStr\r
224 )\r
225{\r
226 UINT32 Len = 0;\r
227 CHAR8 *IncludePaths = NULL;\r
228\r
229 Len = strlen (" -I ") + strlen (PathStr) + 1;\r
230 if (mOptions.IncludePaths != NULL) {\r
231 Len += strlen (mOptions.IncludePaths);\r
232 }\r
233 IncludePaths = new CHAR8[Len];\r
234 if (IncludePaths == NULL) {\r
52302d4d 235 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
236 return;\r
237 }\r
238 IncludePaths[0] = '\0';\r
239 if (mOptions.IncludePaths != NULL) {\r
240 strcat (IncludePaths, mOptions.IncludePaths);\r
241 }\r
242 strcat (IncludePaths, " -I ");\r
243 strcat (IncludePaths, PathStr);\r
244 if (mOptions.IncludePaths != NULL) {\r
245 delete mOptions.IncludePaths;\r
246 }\r
247 mOptions.IncludePaths = IncludePaths;\r
248}\r
249\r
250VOID\r
251CVfrCompiler::AppendCPreprocessorOptions (\r
252 IN CHAR8 *Options\r
253 )\r
254{\r
255 UINT32 Len = 0;\r
256 CHAR8 *Opt = NULL;\r
257\r
258 Len = strlen (Options) + strlen (" ") + 1;\r
259 if (mOptions.CPreprocessorOptions != NULL) {\r
260 Len += strlen (mOptions.CPreprocessorOptions);\r
261 }\r
262 Opt = new CHAR8[Len];\r
263 if (Opt == NULL) {\r
52302d4d 264 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
265 return;\r
266 }\r
267 Opt[0] = 0;\r
268 if (mOptions.CPreprocessorOptions != NULL) {\r
269 strcat (Opt, mOptions.CPreprocessorOptions);\r
270 }\r
271 strcat (Opt, " ");\r
272 strcat (Opt, Options);\r
273 if (mOptions.CPreprocessorOptions != NULL) {\r
274 delete mOptions.CPreprocessorOptions;\r
275 }\r
276 mOptions.CPreprocessorOptions = Opt;\r
277}\r
278\r
279INT8\r
280CVfrCompiler::SetBaseFileName (\r
281 VOID\r
282 )\r
283{\r
284 CHAR8 *pFileName, *pPath, *pExt;\r
285\r
286 if (mOptions.VfrFileName[0] == '\0') {\r
287 return -1;\r
288 }\r
289\r
290 pFileName = mOptions.VfrFileName;\r
291 while (\r
292 ((pPath = strchr (pFileName, '\\')) != NULL) ||\r
293 ((pPath = strchr (pFileName, '/')) != NULL)\r
294 )\r
295 {\r
296 pFileName = pPath + 1;\r
297 }\r
298\r
299 if (pFileName == NULL) {\r
300 return -1;\r
301 }\r
302\r
303 if ((pExt = strchr (pFileName, '.')) == NULL) {\r
304 return -1;\r
305 }\r
306\r
307 strncpy (mOptions.VfrBaseFileName, pFileName, pExt - pFileName);\r
308 mOptions.VfrBaseFileName[pExt - pFileName] = '\0';\r
309\r
310 return 0;\r
311}\r
312\r
313INT8\r
314CVfrCompiler::SetPkgOutputFileName (\r
315 VOID\r
316 )\r
317{\r
318 if (mOptions.VfrBaseFileName[0] == '\0') {\r
319 return -1;\r
320 }\r
321\r
322 strcpy (mOptions.PkgOutputFileName, mOptions.OutputDirectory);\r
323 strcat (mOptions.PkgOutputFileName, mOptions.VfrBaseFileName);\r
324 strcat (mOptions.PkgOutputFileName, VFR_PACKAGE_FILENAME_EXTENSION);\r
325\r
326 return 0;\r
327}\r
328\r
329INT8\r
330CVfrCompiler::SetCOutputFileName (\r
331 VOID\r
332 )\r
333{\r
334 if (mOptions.VfrBaseFileName[0] == '\0') {\r
335 return -1;\r
336 }\r
337\r
338 strcpy (mOptions.COutputFileName, mOptions.OutputDirectory);\r
339 strcat (mOptions.COutputFileName, mOptions.VfrBaseFileName);\r
340 strcat (mOptions.COutputFileName, ".c");\r
341\r
342 return 0;\r
343}\r
344\r
345INT8\r
346CVfrCompiler::SetPreprocessorOutputFileName (\r
347 VOID\r
348 )\r
349{\r
350 if (mOptions.VfrBaseFileName[0] == '\0') {\r
351 return -1;\r
352 }\r
353\r
354 strcpy (mOptions.PreprocessorOutputFileName, mOptions.OutputDirectory);\r
355 strcat (mOptions.PreprocessorOutputFileName, mOptions.VfrBaseFileName);\r
356 strcat (mOptions.PreprocessorOutputFileName, VFR_PREPROCESS_FILENAME_EXTENSION);\r
357\r
358 return 0;\r
359}\r
360\r
361INT8\r
362CVfrCompiler::SetRecordListFileName (\r
363 VOID\r
364 )\r
365{\r
366 if (mOptions.VfrBaseFileName[0] == '\0') {\r
367 return -1;\r
368 }\r
369\r
370 strcpy (mOptions.RecordListFile, mOptions.OutputDirectory);\r
371 strcat (mOptions.RecordListFile, mOptions.VfrBaseFileName);\r
372 strcat (mOptions.RecordListFile, VFR_RECORDLIST_FILENAME_EXTENSION);\r
373\r
374 return 0;\r
375}\r
376\r
377CVfrCompiler::CVfrCompiler (\r
378 IN INT32 Argc, \r
379 IN CHAR8 **Argv\r
380 )\r
381{\r
52302d4d
LG
382 mPreProcessCmd = (CHAR8 *) PREPROCESSOR_COMMAND;\r
383 mPreProcessOpt = (CHAR8 *) PREPROCESSOR_OPTIONS;\r
30fdf114 384\r
e4ac870f
LG
385 SET_RUN_STATUS (STATUS_STARTED);\r
386\r
30fdf114
LG
387 OptionInitialization(Argc, Argv);\r
388\r
389 if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {\r
390 return;\r
391 }\r
392\r
393 SET_RUN_STATUS(STATUS_INITIALIZED);\r
394}\r
395\r
396CVfrCompiler::~CVfrCompiler (\r
397 VOID\r
398 )\r
399{\r
400 if (mOptions.IncludePaths != NULL) {\r
401 delete mOptions.IncludePaths;\r
402 mOptions.IncludePaths = NULL;\r
403 }\r
404\r
405 if (mOptions.CPreprocessorOptions != NULL) {\r
406 delete mOptions.CPreprocessorOptions;\r
407 mOptions.CPreprocessorOptions = NULL;\r
408 }\r
409\r
410 SET_RUN_STATUS(STATUS_DEAD);\r
411}\r
412\r
413VOID \r
414CVfrCompiler::Usage (\r
415 VOID\r
416 )\r
417{\r
418 UINT32 Index;\r
419 CONST CHAR8 *Help[] = {\r
420 " ", \r
45258285
LG
421 "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
422 "Copyright (c) 2004-2016 Intel Corporation. All rights reserved.",\r
30fdf114
LG
423 " ",\r
424 "Usage: VfrCompile [options] VfrFile",\r
425 " ",\r
426 "Options:",\r
427 " -h, --help prints this help",\r
cebd6ef9 428 " --version prints version info",\r
30fdf114
LG
429 " -l create an output IFR listing file",\r
430 " -o DIR, --output-directory DIR",\r
431 " deposit all output files to directory OutputDir",\r
432 " default is current directory",\r
433 " -b, --create-ifr-package",\r
434 " create an IFR HII pack file",\r
435 " -n, --no-pre-processing",\r
436 " do not preprocessing input file",\r
437 " -c, --compatible-framework",\r
438 " compatible framework vfr file",\r
4234283c
LG
439 " -s, --string-db",\r
440 " input uni string package file",\r
441 " -g, --guid",\r
442 " override class guid input",\r
443 " format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",\r
4afd3d04
LG
444 " -w --warning-as-error",\r
445 " treat warning as an error",\r
74bbe31b
DB
446 " -a --autodefaut generate default value for question opcode if some default is missing",\r
447 " -d --checkdefault check the default information in a question opcode",\r
30fdf114
LG
448 NULL\r
449 };\r
450 for (Index = 0; Help[Index] != NULL; Index++) {\r
451 fprintf (stdout, "%s\n", Help[Index]);\r
452 }\r
453}\r
454\r
cebd6ef9
ED
455VOID \r
456CVfrCompiler::Version (\r
457 VOID\r
458 )\r
459{\r
460 UINT32 Index;\r
461 CONST CHAR8 *Help[] = {\r
45258285 462 "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
cebd6ef9
ED
463 NULL\r
464 };\r
465 for (Index = 0; Help[Index] != NULL; Index++) {\r
466 fprintf (stdout, "%s\n", Help[Index]);\r
467 }\r
468}\r
469\r
30fdf114
LG
470VOID\r
471CVfrCompiler::PreProcess (\r
472 VOID\r
473 )\r
474{\r
475 FILE *pVfrFile = NULL;\r
476 UINT32 CmdLen = 0;\r
477 CHAR8 *PreProcessCmd = NULL;\r
478\r
479 if (!IS_RUN_STATUS(STATUS_INITIALIZED)) {\r
480 goto Fail;\r
481 }\r
482\r
483 if (mOptions.SkipCPreprocessor == TRUE) {\r
484 goto Out;\r
485 }\r
486\r
1be2ed90 487 if ((pVfrFile = fopen (LongFilePath (mOptions.VfrFileName), "r")) == NULL) {\r
52302d4d 488 DebugError (NULL, 0, 0001, "Error opening the input VFR file", mOptions.VfrFileName);\r
30fdf114
LG
489 goto Fail;\r
490 }\r
491 fclose (pVfrFile);\r
492\r
493 CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) + \r
494 strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName);\r
495 if (mOptions.CPreprocessorOptions != NULL) {\r
496 CmdLen += strlen (mOptions.CPreprocessorOptions);\r
497 }\r
498 if (mOptions.IncludePaths != NULL) {\r
499 CmdLen += strlen (mOptions.IncludePaths);\r
500 }\r
501\r
502 PreProcessCmd = new CHAR8[CmdLen + 10];\r
503 if (PreProcessCmd == NULL) {\r
52302d4d 504 DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
30fdf114
LG
505 goto Fail;\r
506 }\r
507 strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " ");\r
508 strcat (PreProcessCmd, mPreProcessOpt), strcat (PreProcessCmd, " ");\r
509 if (mOptions.IncludePaths != NULL) {\r
510 strcat (PreProcessCmd, mOptions.IncludePaths), strcat (PreProcessCmd, " ");\r
511 }\r
512 if (mOptions.CPreprocessorOptions != NULL) {\r
513 strcat (PreProcessCmd, mOptions.CPreprocessorOptions), strcat (PreProcessCmd, " ");\r
514 }\r
515 strcat (PreProcessCmd, mOptions.VfrFileName), strcat (PreProcessCmd, " > ");\r
516 strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName);\r
517\r
518 if (system (PreProcessCmd) != 0) {\r
52302d4d 519 DebugError (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd);\r
30fdf114
LG
520 goto Fail;\r
521 }\r
522\r
523 delete PreProcessCmd;\r
524\r
525Out:\r
526 SET_RUN_STATUS (STATUS_PREPROCESSED);\r
527 return;\r
528\r
529Fail:\r
530 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
531 SET_RUN_STATUS (STATUS_FAILED);\r
532 }\r
533 delete PreProcessCmd;\r
534}\r
535\r
4234283c 536extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *);\r
30fdf114
LG
537\r
538VOID\r
539CVfrCompiler::Compile (\r
540 VOID\r
541 )\r
542{\r
543 FILE *pInFile = NULL;\r
544 CHAR8 *InFileName = NULL;\r
4234283c 545 INPUT_INFO_TO_SYNTAX InputInfo;\r
30fdf114
LG
546\r
547 if (!IS_RUN_STATUS(STATUS_PREPROCESSED)) {\r
548 goto Fail;\r
549 }\r
550\r
551 InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
552\r
553 gCVfrErrorHandle.SetInputFile (InFileName);\r
4afd3d04 554 gCVfrErrorHandle.SetWarningAsError(mOptions.WarningAsError);\r
30fdf114 555\r
1be2ed90 556 if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
52302d4d 557 DebugError (NULL, 0, 0001, "Error opening the input file", InFileName);\r
30fdf114
LG
558 goto Fail;\r
559 }\r
560\r
4234283c
LG
561 InputInfo.CompatibleMode = mOptions.CompatibleMode;\r
562 if (mOptions.HasOverrideClassGuid) {\r
563 InputInfo.OverrideClassGuid = &mOptions.OverrideClassGuid;\r
564 } else {\r
565 InputInfo.OverrideClassGuid = NULL;\r
566 }\r
567\r
568 if (VfrParserStart (pInFile, &InputInfo) != 0) {\r
30fdf114
LG
569 goto Fail;\r
570 }\r
571\r
572 fclose (pInFile);\r
573\r
574 if (gCFormPkg.HavePendingUnassigned () == TRUE) {\r
575 gCFormPkg.PendingAssignPrintAll ();\r
576 goto Fail;\r
577 }\r
578\r
579 SET_RUN_STATUS (STATUS_COMPILEED);\r
580 return;\r
581\r
582Fail:\r
583 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
52302d4d 584 DebugError (NULL, 0, 0003, "Error parsing", "compile error in file %s", InFileName);\r
30fdf114
LG
585 SET_RUN_STATUS (STATUS_FAILED);\r
586 }\r
587 if (pInFile != NULL) {\r
588 fclose (pInFile);\r
589 }\r
590}\r
591\r
4afd3d04 592VOID\r
74bbe31b 593CVfrCompiler::AdjustBin (\r
4afd3d04
LG
594 VOID\r
595 )\r
596{\r
74bbe31b 597 EFI_VFR_RETURN_CODE Status;\r
4afd3d04 598\r
74bbe31b 599 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
4afd3d04
LG
600 return;\r
601 }\r
4afd3d04 602\r
74bbe31b
DB
603 if (gNeedAdjustOpcode) {\r
604 //\r
605 // When parsing the Vfr, has created some opcodes, now need to update the record info.\r
606 //\r
607 gCIfrRecordInfoDB.IfrUpdateRecordInfoForDynamicOpcode (FALSE);\r
608 }\r
4afd3d04
LG
609\r
610 //\r
74bbe31b 611 // Check whether need to check default info for question or auto add default for question.\r
4afd3d04 612 //\r
74bbe31b
DB
613 if (mOptions.AutoDefault || mOptions.CheckDefault) {\r
614 gCIfrRecordInfoDB.IfrCheckAddDefaultRecord (mOptions.AutoDefault, mOptions.CheckDefault);\r
4afd3d04
LG
615 }\r
616\r
30fdf114
LG
617 //\r
618 // Check Binary Code consistent between Form and IfrRecord\r
619 //\r
620\r
621 //\r
622 // Get Package Data and IfrRecord Data\r
623 //\r
624 gCFormPkg.BuildPkg (gCBuffer);\r
625 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
626\r
627 //\r
628 // Compare Form and Record data\r
629 //\r
630 if (gCBuffer.Buffer != NULL && gRBuffer.Buffer != NULL) {\r
631 UINT32 Index;\r
632 if (gCBuffer.Size != gRBuffer.Size) {\r
52302d4d 633 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
634 }\r
635 for (Index = 0; Index < gCBuffer.Size; Index ++) {\r
636 if (gCBuffer.Buffer[Index] != gRBuffer.Buffer[Index]) {\r
637 break;\r
638 }\r
639 }\r
640 if (Index != gCBuffer.Size) {\r
52302d4d 641 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions.VfrFileName, Index);\r
30fdf114 642 }\r
52302d4d 643 DebugMsg (NULL, 0, 9, (CHAR8 *) "IFR Buffer", (CHAR8 *) "Form Buffer same to Record Buffer and Size is 0x%X", Index);\r
30fdf114
LG
644 } else if (gCBuffer.Buffer == NULL && gRBuffer.Buffer == NULL) {\r
645 //ok\r
646 } else {\r
52302d4d 647 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions.VfrFileName);\r
30fdf114
LG
648 }\r
649\r
650 //\r
651 // For UEFI mode, not do OpCode Adjust\r
652 //\r
653 if (mOptions.CompatibleMode) {\r
654 //\r
655 // Adjust Opcode to be compatible with framework vfr\r
656 //\r
657 Status = gCIfrRecordInfoDB.IfrRecordAdjust ();\r
658 if (Status != VFR_RETURN_SUCCESS) {\r
659 //\r
660 // Record List Adjust Failed\r
661 //\r
662 SET_RUN_STATUS (STATUS_FAILED);\r
663 return;\r
664 }\r
665 //\r
666 // Re get the IfrRecord Buffer.\r
667 //\r
668 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
669 }\r
670\r
671 return;\r
672}\r
673\r
674VOID\r
675CVfrCompiler::GenBinary (\r
676 VOID\r
677 )\r
678{\r
679 FILE *pFile = NULL;\r
680\r
681 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
682 goto Fail;\r
683 }\r
684\r
685 if (mOptions.CreateIfrPkgFile == TRUE) {\r
1be2ed90 686 if ((pFile = fopen (LongFilePath (mOptions.PkgOutputFileName), "wb")) == NULL) {\r
52302d4d 687 DebugError (NULL, 0, 0001, "Error opening file", mOptions.PkgOutputFileName);\r
30fdf114
LG
688 goto Fail;\r
689 }\r
690 if (gCFormPkg.BuildPkg (pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
691 fclose (pFile);\r
692 goto Fail;\r
693 }\r
694 fclose (pFile);\r
695 }\r
696\r
697 SET_RUN_STATUS (STATUS_GENBINARY);\r
698\r
699 return;\r
700\r
701Fail:\r
702 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
703 SET_RUN_STATUS (STATUS_FAILED);\r
704 }\r
705}\r
706\r
707static const char *gSourceFileHeader[] = {\r
708 "//",\r
709 "// DO NOT EDIT -- auto-generated file",\r
710 "//",\r
711 "// This file is generated by the vfrcompiler utility",\r
712 "//",\r
713 NULL\r
714};\r
715\r
716VOID\r
717CVfrCompiler::GenCFile (\r
718 VOID\r
719 )\r
720{\r
721 FILE *pFile;\r
722 UINT32 Index;\r
723\r
724 if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
725 goto Fail;\r
726 }\r
b303ea72
LG
727 \r
728 if (!mOptions.CreateIfrPkgFile || mOptions.CompatibleMode) {\r
1be2ed90 729 if ((pFile = fopen (LongFilePath (mOptions.COutputFileName), "w")) == NULL) {\r
52302d4d 730 DebugError (NULL, 0, 0001, "Error opening output C file", mOptions.COutputFileName);\r
b303ea72
LG
731 goto Fail;\r
732 }\r
30fdf114 733\r
b303ea72
LG
734 for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
735 fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
736 }\r
30fdf114 737\r
b303ea72
LG
738 if (mOptions.CompatibleMode) { \r
739 gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
740 }\r
30fdf114 741\r
b303ea72
LG
742 if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
743 fclose (pFile);\r
744 goto Fail;\r
745 }\r
30fdf114 746 fclose (pFile);\r
30fdf114 747 }\r
30fdf114
LG
748\r
749 SET_RUN_STATUS (STATUS_FINISHED);\r
750 return;\r
751\r
752Fail:\r
753 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
754 SET_RUN_STATUS (STATUS_FAILED);\r
755 }\r
756}\r
757\r
758VOID\r
759CVfrCompiler::GenRecordListFile (\r
760 VOID\r
761 )\r
762{\r
763 CHAR8 *InFileName = NULL;\r
764 FILE *pInFile = NULL;\r
765 FILE *pOutFile = NULL;\r
766 CHAR8 LineBuf[MAX_VFR_LINE_LEN];\r
767 UINT32 LineNo;\r
768\r
769 InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
770\r
771 if (mOptions.CreateRecordListFile == TRUE) {\r
772 if ((InFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {\r
773 return;\r
774 }\r
775\r
1be2ed90 776 if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
52302d4d 777 DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", InFileName);\r
30fdf114
LG
778 return;\r
779 }\r
780\r
1be2ed90 781 if ((pOutFile = fopen (LongFilePath (mOptions.RecordListFile), "w")) == NULL) {\r
52302d4d 782 DebugError (NULL, 0, 0001, "Error opening the record list file", mOptions.RecordListFile);\r
30fdf114
LG
783 goto Err1;\r
784 }\r
785\r
b36d134f 786 fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION __BUILD_VERSION "\n//\n");\r
30fdf114
LG
787 LineNo = 0;\r
788 while (!feof (pInFile)) {\r
789 if (fgets (LineBuf, MAX_VFR_LINE_LEN, pInFile) != NULL) {\r
790 fprintf (pOutFile, "%s", LineBuf);\r
791 LineNo++;\r
792 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);\r
793 }\r
794 }\r
795 \r
796 fprintf (pOutFile, "\n//\n// All Opcode Record List \n//\n");\r
797 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, 0);\r
798 gCVfrVarDataTypeDB.Dump(pOutFile);\r
799\r
800 fclose (pOutFile);\r
801 fclose (pInFile);\r
802 }\r
803\r
804 return;\r
805\r
806Err1:\r
807 fclose (pInFile);\r
808}\r
809\r
810int\r
811main (\r
52302d4d
LG
812 IN int Argc, \r
813 IN char **Argv\r
30fdf114
LG
814 )\r
815{\r
816 COMPILER_RUN_STATUS Status;\r
4afd3d04
LG
817\r
818 SetPrintLevel(WARNING_LOG_LEVEL);\r
30fdf114
LG
819 CVfrCompiler Compiler(Argc, Argv);\r
820 \r
821 Compiler.PreProcess();\r
822 Compiler.Compile();\r
823 Compiler.AdjustBin();\r
824 Compiler.GenBinary();\r
825 Compiler.GenCFile();\r
826 Compiler.GenRecordListFile ();\r
827\r
828 Status = Compiler.RunStatus ();\r
829 if ((Status == STATUS_DEAD) || (Status == STATUS_FAILED)) {\r
830 return 2;\r
831 }\r
832\r
833 if (gCBuffer.Buffer != NULL) {\r
834 delete gCBuffer.Buffer;\r
835 }\r
836 \r
837 if (gRBuffer.Buffer != NULL) {\r
838 delete gRBuffer.Buffer;\r
839 }\r
840\r
841 return GetUtilityStatus ();\r
842}\r
843\r
52302d4d 844\r