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