]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
BaseTools: Replace ARCH with HOST_ARCH in C Makefile to avoid conflict
[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 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
706\r
707 if (gCFormPkg.HavePendingUnassigned () == TRUE) {\r
708 gCFormPkg.PendingAssignPrintAll ();\r
709 goto Fail;\r
710 }\r
711\r
712 SET_RUN_STATUS (STATUS_COMPILEED);\r
713 return;\r
714\r
715Fail:\r
716 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
52302d4d 717 DebugError (NULL, 0, 0003, "Error parsing", "compile error in file %s", InFileName);\r
30fdf114
LG
718 SET_RUN_STATUS (STATUS_FAILED);\r
719 }\r
720 if (pInFile != NULL) {\r
721 fclose (pInFile);\r
722 }\r
723}\r
724\r
4afd3d04 725VOID\r
74bbe31b 726CVfrCompiler::AdjustBin (\r
4afd3d04
LG
727 VOID\r
728 )\r
729{\r
74bbe31b 730 EFI_VFR_RETURN_CODE Status;\r
4afd3d04 731\r
74bbe31b 732 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
4afd3d04
LG
733 return;\r
734 }\r
4afd3d04 735\r
74bbe31b
DB
736 if (gNeedAdjustOpcode) {\r
737 //\r
738 // When parsing the Vfr, has created some opcodes, now need to update the record info.\r
739 //\r
740 gCIfrRecordInfoDB.IfrUpdateRecordInfoForDynamicOpcode (FALSE);\r
741 }\r
4afd3d04
LG
742\r
743 //\r
74bbe31b 744 // Check whether need to check default info for question or auto add default for question.\r
4afd3d04 745 //\r
74bbe31b
DB
746 if (mOptions.AutoDefault || mOptions.CheckDefault) {\r
747 gCIfrRecordInfoDB.IfrCheckAddDefaultRecord (mOptions.AutoDefault, mOptions.CheckDefault);\r
4afd3d04
LG
748 }\r
749\r
30fdf114
LG
750 //\r
751 // Check Binary Code consistent between Form and IfrRecord\r
752 //\r
753\r
754 //\r
755 // Get Package Data and IfrRecord Data\r
756 //\r
757 gCFormPkg.BuildPkg (gCBuffer);\r
758 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
759\r
760 //\r
761 // Compare Form and Record data\r
762 //\r
763 if (gCBuffer.Buffer != NULL && gRBuffer.Buffer != NULL) {\r
764 UINT32 Index;\r
765 if (gCBuffer.Size != gRBuffer.Size) {\r
52302d4d 766 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
767 }\r
768 for (Index = 0; Index < gCBuffer.Size; Index ++) {\r
769 if (gCBuffer.Buffer[Index] != gRBuffer.Buffer[Index]) {\r
770 break;\r
771 }\r
772 }\r
773 if (Index != gCBuffer.Size) {\r
52302d4d 774 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions.VfrFileName, Index);\r
30fdf114 775 }\r
52302d4d 776 DebugMsg (NULL, 0, 9, (CHAR8 *) "IFR Buffer", (CHAR8 *) "Form Buffer same to Record Buffer and Size is 0x%X", Index);\r
30fdf114
LG
777 } else if (gCBuffer.Buffer == NULL && gRBuffer.Buffer == NULL) {\r
778 //ok\r
779 } else {\r
52302d4d 780 DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions.VfrFileName);\r
30fdf114
LG
781 }\r
782\r
783 //\r
784 // For UEFI mode, not do OpCode Adjust\r
785 //\r
786 if (mOptions.CompatibleMode) {\r
787 //\r
788 // Adjust Opcode to be compatible with framework vfr\r
789 //\r
790 Status = gCIfrRecordInfoDB.IfrRecordAdjust ();\r
791 if (Status != VFR_RETURN_SUCCESS) {\r
792 //\r
793 // Record List Adjust Failed\r
794 //\r
795 SET_RUN_STATUS (STATUS_FAILED);\r
796 return;\r
797 }\r
798 //\r
799 // Re get the IfrRecord Buffer.\r
800 //\r
801 gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
802 }\r
803\r
804 return;\r
805}\r
806\r
807VOID\r
808CVfrCompiler::GenBinary (\r
809 VOID\r
810 )\r
811{\r
812 FILE *pFile = NULL;\r
813\r
814 if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
815 goto Fail;\r
816 }\r
817\r
818 if (mOptions.CreateIfrPkgFile == TRUE) {\r
1be2ed90 819 if ((pFile = fopen (LongFilePath (mOptions.PkgOutputFileName), "wb")) == NULL) {\r
8c1e13d3 820 DebugError (NULL, 0, 0001, "Error opening file", "%s", mOptions.PkgOutputFileName);\r
30fdf114
LG
821 goto Fail;\r
822 }\r
823 if (gCFormPkg.BuildPkg (pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
824 fclose (pFile);\r
825 goto Fail;\r
826 }\r
827 fclose (pFile);\r
828 }\r
829\r
830 SET_RUN_STATUS (STATUS_GENBINARY);\r
831\r
832 return;\r
833\r
834Fail:\r
835 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
836 SET_RUN_STATUS (STATUS_FAILED);\r
837 }\r
838}\r
839\r
840static const char *gSourceFileHeader[] = {\r
841 "//",\r
842 "// DO NOT EDIT -- auto-generated file",\r
843 "//",\r
844 "// This file is generated by the vfrcompiler utility",\r
845 "//",\r
846 NULL\r
847};\r
848\r
849VOID\r
850CVfrCompiler::GenCFile (\r
851 VOID\r
852 )\r
853{\r
854 FILE *pFile;\r
855 UINT32 Index;\r
856\r
857 if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
858 goto Fail;\r
859 }\r
b303ea72
LG
860 \r
861 if (!mOptions.CreateIfrPkgFile || mOptions.CompatibleMode) {\r
1be2ed90 862 if ((pFile = fopen (LongFilePath (mOptions.COutputFileName), "w")) == NULL) {\r
8c1e13d3 863 DebugError (NULL, 0, 0001, "Error opening output C file", "%s", mOptions.COutputFileName);\r
b303ea72
LG
864 goto Fail;\r
865 }\r
30fdf114 866\r
b303ea72
LG
867 for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
868 fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
869 }\r
30fdf114 870\r
b303ea72
LG
871 if (mOptions.CompatibleMode) { \r
872 gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
873 }\r
30fdf114 874\r
b303ea72
LG
875 if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
876 fclose (pFile);\r
877 goto Fail;\r
878 }\r
30fdf114 879 fclose (pFile);\r
30fdf114 880 }\r
30fdf114
LG
881\r
882 SET_RUN_STATUS (STATUS_FINISHED);\r
883 return;\r
884\r
885Fail:\r
886 if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
887 SET_RUN_STATUS (STATUS_FAILED);\r
888 }\r
889}\r
890\r
891VOID\r
892CVfrCompiler::GenRecordListFile (\r
893 VOID\r
894 )\r
895{\r
896 CHAR8 *InFileName = NULL;\r
897 FILE *pInFile = NULL;\r
898 FILE *pOutFile = NULL;\r
899 CHAR8 LineBuf[MAX_VFR_LINE_LEN];\r
900 UINT32 LineNo;\r
901\r
902 InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
903\r
8c1e13d3 904 if (mOptions.CreateRecordListFile == TRUE && InFileName != NULL && mOptions.RecordListFile != NULL) {\r
30fdf114
LG
905 if ((InFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {\r
906 return;\r
907 }\r
908\r
1be2ed90 909 if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
8c1e13d3 910 DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", "%s", InFileName);\r
30fdf114
LG
911 return;\r
912 }\r
913\r
1be2ed90 914 if ((pOutFile = fopen (LongFilePath (mOptions.RecordListFile), "w")) == NULL) {\r
8c1e13d3 915 DebugError (NULL, 0, 0001, "Error opening the record list file", "%s", mOptions.RecordListFile);\r
30fdf114
LG
916 goto Err1;\r
917 }\r
918\r
b36d134f 919 fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION __BUILD_VERSION "\n//\n");\r
30fdf114
LG
920 LineNo = 0;\r
921 while (!feof (pInFile)) {\r
922 if (fgets (LineBuf, MAX_VFR_LINE_LEN, pInFile) != NULL) {\r
923 fprintf (pOutFile, "%s", LineBuf);\r
924 LineNo++;\r
925 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);\r
926 }\r
927 }\r
928 \r
929 fprintf (pOutFile, "\n//\n// All Opcode Record List \n//\n");\r
930 gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, 0);\r
931 gCVfrVarDataTypeDB.Dump(pOutFile);\r
932\r
933 fclose (pOutFile);\r
934 fclose (pInFile);\r
935 }\r
936\r
937 return;\r
938\r
939Err1:\r
940 fclose (pInFile);\r
941}\r
942\r
943int\r
944main (\r
52302d4d
LG
945 IN int Argc, \r
946 IN char **Argv\r
30fdf114
LG
947 )\r
948{\r
949 COMPILER_RUN_STATUS Status;\r
4afd3d04
LG
950\r
951 SetPrintLevel(WARNING_LOG_LEVEL);\r
30fdf114
LG
952 CVfrCompiler Compiler(Argc, Argv);\r
953 \r
954 Compiler.PreProcess();\r
955 Compiler.Compile();\r
956 Compiler.AdjustBin();\r
957 Compiler.GenBinary();\r
958 Compiler.GenCFile();\r
959 Compiler.GenRecordListFile ();\r
960\r
961 Status = Compiler.RunStatus ();\r
962 if ((Status == STATUS_DEAD) || (Status == STATUS_FAILED)) {\r
963 return 2;\r
964 }\r
965\r
966 if (gCBuffer.Buffer != NULL) {\r
967 delete gCBuffer.Buffer;\r
968 }\r
969 \r
970 if (gRBuffer.Buffer != NULL) {\r
971 delete gRBuffer.Buffer;\r
972 }\r
973\r
974 return GetUtilityStatus ();\r
975}\r
976\r
52302d4d 977\r