3 VfrCompiler main class and main function.
5 Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 #include "VfrCompiler.h"
20 #include "CommonLib.h"
21 #include "EfiUtilityMsgs.h"
23 PACKAGE_DATA gCBuffer
;
24 PACKAGE_DATA gRBuffer
;
25 CVfrStringDB gCVfrStringDB
;
28 CVfrCompiler::DebugError (
31 IN UINT32 MessageCode
,
33 IN CONST CHAR8
*MsgFmt
,
38 va_start (List
, MsgFmt
);
39 PrintMessage ((CHAR8
*) "ERROR", FileName
, LineNumber
, MessageCode
, (CHAR8
*) Text
, (CHAR8
*) MsgFmt
, List
);
44 CVfrCompiler::SET_RUN_STATUS (
45 IN COMPILER_RUN_STATUS Status
52 CVfrCompiler::IS_RUN_STATUS (
53 IN COMPILER_RUN_STATUS Status
56 return mRunStatus
== Status
;
60 CVfrCompiler::OptionInitialization (
69 SetUtilityName ((CHAR8
*) PROGRAM_NAME
);
71 mOptions
.VfrFileName
[0] = '\0';
72 mOptions
.RecordListFile
[0] = '\0';
73 mOptions
.CreateRecordListFile
= FALSE
;
74 mOptions
.CreateIfrPkgFile
= FALSE
;
75 mOptions
.PkgOutputFileName
[0] = '\0';
76 mOptions
.COutputFileName
[0] = '\0';
77 mOptions
.OutputDirectory
[0] = '\0';
78 mOptions
.PreprocessorOutputFileName
[0] = '\0';
79 mOptions
.VfrBaseFileName
[0] = '\0';
80 mOptions
.IncludePaths
= NULL
;
81 mOptions
.SkipCPreprocessor
= TRUE
;
82 mOptions
.CPreprocessorOptions
= NULL
;
83 mOptions
.CompatibleMode
= FALSE
;
84 mOptions
.HasOverrideClassGuid
= FALSE
;
85 memset (&mOptions
.OverrideClassGuid
, 0, sizeof (EFI_GUID
));
89 SET_RUN_STATUS (STATUS_DEAD
);
93 for (Index
= 1; (Index
< Argc
) && (Argv
[Index
][0] == '-'); Index
++) {
94 if ((stricmp(Argv
[Index
], "-h") == 0) || (stricmp(Argv
[Index
], "--help") == 0)) {
96 SET_RUN_STATUS (STATUS_DEAD
);
98 } else if (stricmp(Argv
[Index
], "-l") == 0) {
99 mOptions
.CreateRecordListFile
= TRUE
;
100 gCIfrRecordInfoDB
.TurnOn ();
101 } else if (stricmp(Argv
[Index
], "-i") == 0) {
103 if ((Index
>= Argc
) || (Argv
[Index
][0] == '-')) {
104 DebugError (NULL
, 0, 1001, "Missing option", "-i missing path argument");
108 AppendIncludePath(Argv
[Index
]);
109 } else if (stricmp(Argv
[Index
], "-o") == 0 || stricmp(Argv
[Index
], "--output-directory") == 0 || stricmp(Argv
[Index
], "-od") == 0) {
111 if ((Index
>= Argc
) || (Argv
[Index
][0] == '-')) {
112 DebugError (NULL
, 0, 1001, "Missing option", "-o missing output directory name");
115 strcpy (mOptions
.OutputDirectory
, Argv
[Index
]);
117 CHAR8 lastChar
= mOptions
.OutputDirectory
[strlen(mOptions
.OutputDirectory
) - 1];
118 if ((lastChar
!= '/') && (lastChar
!= '\\')) {
119 if (strchr(mOptions
.OutputDirectory
, '/') != NULL
) {
120 strcat (mOptions
.OutputDirectory
, "/");
122 strcat (mOptions
.OutputDirectory
, "\\");
125 DebugMsg (NULL
, 0, 9, (CHAR8
*) "Output Directory", mOptions
.OutputDirectory
);
126 } else if (stricmp(Argv
[Index
], "-b") == 0 || stricmp(Argv
[Index
], "--create-ifr-package") == 0 || stricmp(Argv
[Index
], "-ibin") == 0) {
127 mOptions
.CreateIfrPkgFile
= TRUE
;
128 } else if (stricmp(Argv
[Index
], "-n") == 0 || stricmp(Argv
[Index
], "--no-pre-processing") == 0 || stricmp(Argv
[Index
], "-nopp") == 0) {
129 mOptions
.SkipCPreprocessor
= TRUE
;
130 } else if (stricmp(Argv
[Index
], "-f") == 0 || stricmp(Argv
[Index
], "--pre-processing-flag") == 0 || stricmp(Argv
[Index
], "-ppflag") == 0) {
132 if ((Index
>= Argc
) || (Argv
[Index
][0] == '-')) {
133 DebugError (NULL
, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");
137 AppendCPreprocessorOptions (Argv
[Index
]);
138 } else if (stricmp(Argv
[Index
], "-c") == 0 || stricmp(Argv
[Index
], "--compatible-framework") == 0) {
139 mOptions
.CompatibleMode
= TRUE
;
140 } else if (stricmp(Argv
[Index
], "-s") == 0|| stricmp(Argv
[Index
], "--string-db") == 0) {
142 if ((Index
>= Argc
) || (Argv
[Index
][0] == '-')) {
143 DebugError (NULL
, 0, 1001, "Missing option", "-s missing input string file name");
146 gCVfrStringDB
.SetStringFileName(Argv
[Index
]);
147 DebugMsg (NULL
, 0, 9, (CHAR8
*) "Input string file path", Argv
[Index
]);
148 } else if ((stricmp (Argv
[Index
], "-g") == 0) || (stricmp (Argv
[Index
], "--guid") == 0)) {
150 Status
= StringToGuid (Argv
[Index
], &mOptions
.OverrideClassGuid
);
151 if (EFI_ERROR (Status
)) {
152 DebugError (NULL
, 0, 1000, "Invalid format:", "%s", Argv
[Index
]);
155 mOptions
.HasOverrideClassGuid
= TRUE
;
157 DebugError (NULL
, 0, 1000, "Unknown option", "unrecognized option %s", Argv
[Index
]);
162 if (Index
!= Argc
- 1) {
163 DebugError (NULL
, 0, 1001, "Missing option", "VFR file name is not specified.");
166 strcpy (mOptions
.VfrFileName
, Argv
[Index
]);
169 if (SetBaseFileName() != 0) {
172 if (SetPkgOutputFileName () != 0) {
175 if (SetCOutputFileName() != 0) {
178 if (SetPreprocessorOutputFileName () != 0) {
181 if (SetRecordListFileName () != 0) {
187 SET_RUN_STATUS (STATUS_DEAD
);
189 mOptions
.VfrFileName
[0] = '\0';
190 mOptions
.RecordListFile
[0] = '\0';
191 mOptions
.CreateRecordListFile
= FALSE
;
192 mOptions
.CreateIfrPkgFile
= FALSE
;
193 mOptions
.PkgOutputFileName
[0] = '\0';
194 mOptions
.COutputFileName
[0] = '\0';
195 mOptions
.OutputDirectory
[0] = '\0';
196 mOptions
.PreprocessorOutputFileName
[0] = '\0';
197 mOptions
.VfrBaseFileName
[0] = '\0';
198 if (mOptions
.IncludePaths
!= NULL
) {
199 delete mOptions
.IncludePaths
;
200 mOptions
.IncludePaths
= NULL
;
202 if (mOptions
.CPreprocessorOptions
!= NULL
) {
203 delete mOptions
.CPreprocessorOptions
;
204 mOptions
.CPreprocessorOptions
= NULL
;
209 CVfrCompiler::AppendIncludePath (
214 CHAR8
*IncludePaths
= NULL
;
216 Len
= strlen (" -I ") + strlen (PathStr
) + 1;
217 if (mOptions
.IncludePaths
!= NULL
) {
218 Len
+= strlen (mOptions
.IncludePaths
);
220 IncludePaths
= new CHAR8
[Len
];
221 if (IncludePaths
== NULL
) {
222 DebugError (NULL
, 0, 4001, "Resource: memory can't be allocated", NULL
);
225 IncludePaths
[0] = '\0';
226 if (mOptions
.IncludePaths
!= NULL
) {
227 strcat (IncludePaths
, mOptions
.IncludePaths
);
229 strcat (IncludePaths
, " -I ");
230 strcat (IncludePaths
, PathStr
);
231 if (mOptions
.IncludePaths
!= NULL
) {
232 delete mOptions
.IncludePaths
;
234 mOptions
.IncludePaths
= IncludePaths
;
238 CVfrCompiler::AppendCPreprocessorOptions (
245 Len
= strlen (Options
) + strlen (" ") + 1;
246 if (mOptions
.CPreprocessorOptions
!= NULL
) {
247 Len
+= strlen (mOptions
.CPreprocessorOptions
);
249 Opt
= new CHAR8
[Len
];
251 DebugError (NULL
, 0, 4001, "Resource: memory can't be allocated", NULL
);
255 if (mOptions
.CPreprocessorOptions
!= NULL
) {
256 strcat (Opt
, mOptions
.CPreprocessorOptions
);
259 strcat (Opt
, Options
);
260 if (mOptions
.CPreprocessorOptions
!= NULL
) {
261 delete mOptions
.CPreprocessorOptions
;
263 mOptions
.CPreprocessorOptions
= Opt
;
267 CVfrCompiler::SetBaseFileName (
271 CHAR8
*pFileName
, *pPath
, *pExt
;
273 if (mOptions
.VfrFileName
[0] == '\0') {
277 pFileName
= mOptions
.VfrFileName
;
279 ((pPath
= strchr (pFileName
, '\\')) != NULL
) ||
280 ((pPath
= strchr (pFileName
, '/')) != NULL
)
283 pFileName
= pPath
+ 1;
286 if (pFileName
== NULL
) {
290 if ((pExt
= strchr (pFileName
, '.')) == NULL
) {
294 strncpy (mOptions
.VfrBaseFileName
, pFileName
, pExt
- pFileName
);
295 mOptions
.VfrBaseFileName
[pExt
- pFileName
] = '\0';
301 CVfrCompiler::SetPkgOutputFileName (
305 if (mOptions
.VfrBaseFileName
[0] == '\0') {
309 strcpy (mOptions
.PkgOutputFileName
, mOptions
.OutputDirectory
);
310 strcat (mOptions
.PkgOutputFileName
, mOptions
.VfrBaseFileName
);
311 strcat (mOptions
.PkgOutputFileName
, VFR_PACKAGE_FILENAME_EXTENSION
);
317 CVfrCompiler::SetCOutputFileName (
321 if (mOptions
.VfrBaseFileName
[0] == '\0') {
325 strcpy (mOptions
.COutputFileName
, mOptions
.OutputDirectory
);
326 strcat (mOptions
.COutputFileName
, mOptions
.VfrBaseFileName
);
327 strcat (mOptions
.COutputFileName
, ".c");
333 CVfrCompiler::SetPreprocessorOutputFileName (
337 if (mOptions
.VfrBaseFileName
[0] == '\0') {
341 strcpy (mOptions
.PreprocessorOutputFileName
, mOptions
.OutputDirectory
);
342 strcat (mOptions
.PreprocessorOutputFileName
, mOptions
.VfrBaseFileName
);
343 strcat (mOptions
.PreprocessorOutputFileName
, VFR_PREPROCESS_FILENAME_EXTENSION
);
349 CVfrCompiler::SetRecordListFileName (
353 if (mOptions
.VfrBaseFileName
[0] == '\0') {
357 strcpy (mOptions
.RecordListFile
, mOptions
.OutputDirectory
);
358 strcat (mOptions
.RecordListFile
, mOptions
.VfrBaseFileName
);
359 strcat (mOptions
.RecordListFile
, VFR_RECORDLIST_FILENAME_EXTENSION
);
364 CVfrCompiler::CVfrCompiler (
369 mPreProcessCmd
= (CHAR8
*) PREPROCESSOR_COMMAND
;
370 mPreProcessOpt
= (CHAR8
*) PREPROCESSOR_OPTIONS
;
372 OptionInitialization(Argc
, Argv
);
374 if ((IS_RUN_STATUS(STATUS_FAILED
)) || (IS_RUN_STATUS(STATUS_DEAD
))) {
378 SET_RUN_STATUS(STATUS_INITIALIZED
);
381 CVfrCompiler::~CVfrCompiler (
385 if (mOptions
.IncludePaths
!= NULL
) {
386 delete mOptions
.IncludePaths
;
387 mOptions
.IncludePaths
= NULL
;
390 if (mOptions
.CPreprocessorOptions
!= NULL
) {
391 delete mOptions
.CPreprocessorOptions
;
392 mOptions
.CPreprocessorOptions
= NULL
;
395 SET_RUN_STATUS(STATUS_DEAD
);
399 CVfrCompiler::Usage (
404 CONST CHAR8
*Help
[] = {
406 "VfrCompile version " VFR_COMPILER_VERSION VFR_COMPILER_UPDATE_TIME
,
407 "Copyright (c) 2004-2011 Intel Corporation. All rights reserved.",
409 "Usage: VfrCompile [options] VfrFile",
412 " -h, --help prints this help",
413 " -l create an output IFR listing file",
414 " -o DIR, --output-directory DIR",
415 " deposit all output files to directory OutputDir",
416 " default is current directory",
417 " -b, --create-ifr-package",
418 " create an IFR HII pack file",
419 " -n, --no-pre-processing",
420 " do not preprocessing input file",
421 " -c, --compatible-framework",
422 " compatible framework vfr file",
424 " input uni string package file",
426 " override class guid input",
427 " format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
430 for (Index
= 0; Help
[Index
] != NULL
; Index
++) {
431 fprintf (stdout
, "%s\n", Help
[Index
]);
436 CVfrCompiler::PreProcess (
440 FILE *pVfrFile
= NULL
;
442 CHAR8
*PreProcessCmd
= NULL
;
444 if (!IS_RUN_STATUS(STATUS_INITIALIZED
)) {
448 if (mOptions
.SkipCPreprocessor
== TRUE
) {
452 if ((pVfrFile
= fopen (mOptions
.VfrFileName
, "r")) == NULL
) {
453 DebugError (NULL
, 0, 0001, "Error opening the input VFR file", mOptions
.VfrFileName
);
458 CmdLen
= strlen (mPreProcessCmd
) + strlen (mPreProcessOpt
) +
459 strlen (mOptions
.VfrFileName
) + strlen (mOptions
.PreprocessorOutputFileName
);
460 if (mOptions
.CPreprocessorOptions
!= NULL
) {
461 CmdLen
+= strlen (mOptions
.CPreprocessorOptions
);
463 if (mOptions
.IncludePaths
!= NULL
) {
464 CmdLen
+= strlen (mOptions
.IncludePaths
);
467 PreProcessCmd
= new CHAR8
[CmdLen
+ 10];
468 if (PreProcessCmd
== NULL
) {
469 DebugError (NULL
, 0, 4001, "Resource: memory can't be allocated", NULL
);
472 strcpy (PreProcessCmd
, mPreProcessCmd
), strcat (PreProcessCmd
, " ");
473 strcat (PreProcessCmd
, mPreProcessOpt
), strcat (PreProcessCmd
, " ");
474 if (mOptions
.IncludePaths
!= NULL
) {
475 strcat (PreProcessCmd
, mOptions
.IncludePaths
), strcat (PreProcessCmd
, " ");
477 if (mOptions
.CPreprocessorOptions
!= NULL
) {
478 strcat (PreProcessCmd
, mOptions
.CPreprocessorOptions
), strcat (PreProcessCmd
, " ");
480 strcat (PreProcessCmd
, mOptions
.VfrFileName
), strcat (PreProcessCmd
, " > ");
481 strcat (PreProcessCmd
, mOptions
.PreprocessorOutputFileName
);
483 if (system (PreProcessCmd
) != 0) {
484 DebugError (NULL
, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd
);
488 delete PreProcessCmd
;
491 SET_RUN_STATUS (STATUS_PREPROCESSED
);
495 if (!IS_RUN_STATUS(STATUS_DEAD
)) {
496 SET_RUN_STATUS (STATUS_FAILED
);
498 delete PreProcessCmd
;
501 extern UINT8
VfrParserStart (IN
FILE *, IN INPUT_INFO_TO_SYNTAX
*);
504 CVfrCompiler::Compile (
508 FILE *pInFile
= NULL
;
509 CHAR8
*InFileName
= NULL
;
510 INPUT_INFO_TO_SYNTAX InputInfo
;
512 if (!IS_RUN_STATUS(STATUS_PREPROCESSED
)) {
516 InFileName
= (mOptions
.SkipCPreprocessor
== TRUE
) ? mOptions
.VfrFileName
: mOptions
.PreprocessorOutputFileName
;
518 gCVfrErrorHandle
.SetInputFile (InFileName
);
520 if ((pInFile
= fopen (InFileName
, "r")) == NULL
) {
521 DebugError (NULL
, 0, 0001, "Error opening the input file", InFileName
);
525 InputInfo
.CompatibleMode
= mOptions
.CompatibleMode
;
526 if (mOptions
.HasOverrideClassGuid
) {
527 InputInfo
.OverrideClassGuid
= &mOptions
.OverrideClassGuid
;
529 InputInfo
.OverrideClassGuid
= NULL
;
532 if (VfrParserStart (pInFile
, &InputInfo
) != 0) {
538 if (gCFormPkg
.HavePendingUnassigned () == TRUE
) {
539 gCFormPkg
.PendingAssignPrintAll ();
543 SET_RUN_STATUS (STATUS_COMPILEED
);
547 if (!IS_RUN_STATUS(STATUS_DEAD
)) {
548 DebugError (NULL
, 0, 0003, "Error parsing", "compile error in file %s", InFileName
);
549 SET_RUN_STATUS (STATUS_FAILED
);
551 if (pInFile
!= NULL
) {
557 CVfrCompiler::AdjustBin (
561 EFI_VFR_RETURN_CODE Status
;
563 // Check Binary Code consistent between Form and IfrRecord
567 // Get Package Data and IfrRecord Data
569 gCFormPkg
.BuildPkg (gCBuffer
);
570 gCIfrRecordInfoDB
.IfrRecordOutput (gRBuffer
);
573 // Compare Form and Record data
575 if (gCBuffer
.Buffer
!= NULL
&& gRBuffer
.Buffer
!= NULL
) {
577 if (gCBuffer
.Size
!= gRBuffer
.Size
) {
578 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
);
580 for (Index
= 0; Index
< gCBuffer
.Size
; Index
++) {
581 if (gCBuffer
.Buffer
[Index
] != gRBuffer
.Buffer
[Index
]) {
585 if (Index
!= gCBuffer
.Size
) {
586 DebugError (NULL
, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions
.VfrFileName
, Index
);
588 DebugMsg (NULL
, 0, 9, (CHAR8
*) "IFR Buffer", (CHAR8
*) "Form Buffer same to Record Buffer and Size is 0x%X", Index
);
589 } else if (gCBuffer
.Buffer
== NULL
&& gRBuffer
.Buffer
== NULL
) {
592 DebugError (NULL
, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions
.VfrFileName
);
596 // For UEFI mode, not do OpCode Adjust
598 if (mOptions
.CompatibleMode
) {
600 // Adjust Opcode to be compatible with framework vfr
602 Status
= gCIfrRecordInfoDB
.IfrRecordAdjust ();
603 if (Status
!= VFR_RETURN_SUCCESS
) {
605 // Record List Adjust Failed
607 SET_RUN_STATUS (STATUS_FAILED
);
611 // Re get the IfrRecord Buffer.
613 gCIfrRecordInfoDB
.IfrRecordOutput (gRBuffer
);
620 CVfrCompiler::GenBinary (
626 if (!IS_RUN_STATUS(STATUS_COMPILEED
)) {
630 if (mOptions
.CreateIfrPkgFile
== TRUE
) {
631 if ((pFile
= fopen (mOptions
.PkgOutputFileName
, "wb")) == NULL
) {
632 DebugError (NULL
, 0, 0001, "Error opening file", mOptions
.PkgOutputFileName
);
635 if (gCFormPkg
.BuildPkg (pFile
, &gRBuffer
) != VFR_RETURN_SUCCESS
) {
642 SET_RUN_STATUS (STATUS_GENBINARY
);
647 if (!IS_RUN_STATUS(STATUS_DEAD
)) {
648 SET_RUN_STATUS (STATUS_FAILED
);
652 static const char *gSourceFileHeader
[] = {
654 "// DO NOT EDIT -- auto-generated file",
656 "// This file is generated by the vfrcompiler utility",
662 CVfrCompiler::GenCFile (
669 if (!IS_RUN_STATUS(STATUS_GENBINARY
)) {
673 if (!mOptions
.CreateIfrPkgFile
|| mOptions
.CompatibleMode
) {
674 if ((pFile
= fopen (mOptions
.COutputFileName
, "w")) == NULL
) {
675 DebugError (NULL
, 0, 0001, "Error opening output C file", mOptions
.COutputFileName
);
679 for (Index
= 0; gSourceFileHeader
[Index
] != NULL
; Index
++) {
680 fprintf (pFile
, "%s\n", gSourceFileHeader
[Index
]);
683 if (mOptions
.CompatibleMode
) {
684 gCVfrBufferConfig
.OutputCFile (pFile
, mOptions
.VfrBaseFileName
);
687 if (gCFormPkg
.GenCFile (mOptions
.VfrBaseFileName
, pFile
, &gRBuffer
) != VFR_RETURN_SUCCESS
) {
694 SET_RUN_STATUS (STATUS_FINISHED
);
698 if (!IS_RUN_STATUS(STATUS_DEAD
)) {
699 SET_RUN_STATUS (STATUS_FAILED
);
704 CVfrCompiler::GenRecordListFile (
708 CHAR8
*InFileName
= NULL
;
709 FILE *pInFile
= NULL
;
710 FILE *pOutFile
= NULL
;
711 CHAR8 LineBuf
[MAX_VFR_LINE_LEN
];
714 InFileName
= (mOptions
.SkipCPreprocessor
== TRUE
) ? mOptions
.VfrFileName
: mOptions
.PreprocessorOutputFileName
;
716 if (mOptions
.CreateRecordListFile
== TRUE
) {
717 if ((InFileName
[0] == '\0') || (mOptions
.RecordListFile
[0] == '\0')) {
721 if ((pInFile
= fopen (InFileName
, "r")) == NULL
) {
722 DebugError (NULL
, 0, 0001, "Error opening the input VFR preprocessor output file", InFileName
);
726 if ((pOutFile
= fopen (mOptions
.RecordListFile
, "w")) == NULL
) {
727 DebugError (NULL
, 0, 0001, "Error opening the record list file", mOptions
.RecordListFile
);
731 fprintf (pOutFile
, "//\n// VFR compiler version " VFR_COMPILER_VERSION
"\n//\n");
733 while (!feof (pInFile
)) {
734 if (fgets (LineBuf
, MAX_VFR_LINE_LEN
, pInFile
) != NULL
) {
735 fprintf (pOutFile
, "%s", LineBuf
);
737 gCIfrRecordInfoDB
.IfrRecordOutput (pOutFile
, LineNo
);
741 fprintf (pOutFile
, "\n//\n// All Opcode Record List \n//\n");
742 gCIfrRecordInfoDB
.IfrRecordOutput (pOutFile
, 0);
743 gCVfrVarDataTypeDB
.Dump(pOutFile
);
761 COMPILER_RUN_STATUS Status
;
762 CVfrCompiler
Compiler(Argc
, Argv
);
764 Compiler
.PreProcess();
766 Compiler
.AdjustBin();
767 Compiler
.GenBinary();
769 Compiler
.GenRecordListFile ();
771 Status
= Compiler
.RunStatus ();
772 if ((Status
== STATUS_DEAD
) || (Status
== STATUS_FAILED
)) {
776 if (gCBuffer
.Buffer
!= NULL
) {
777 delete gCBuffer
.Buffer
;
780 if (gRBuffer
.Buffer
!= NULL
) {
781 delete gRBuffer
.Buffer
;
784 return GetUtilityStatus ();