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