]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrCompiler.cpp
index dd34a1b5333fc76a2b273127e0e03ef1243d3c38..c4d4d261ad3770663a7423e9881b15c49c185079 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
-  \r
+\r
   VfrCompiler main class and main function.\r
 \r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -24,7 +18,7 @@ PACKAGE_DATA  gCBuffer;
 PACKAGE_DATA  gRBuffer;\r
 CVfrStringDB  gCVfrStringDB;\r
 \r
-VOID \r
+VOID\r
 CVfrCompiler::DebugError (\r
   IN CHAR8         *FileName,\r
   IN UINT32        LineNumber,\r
@@ -32,7 +26,7 @@ CVfrCompiler::DebugError (
   IN CONST CHAR8   *Text,\r
   IN CONST CHAR8   *MsgFmt,\r
   ...\r
-  ) \r
+  )\r
 {\r
   va_list List;\r
   va_start (List, MsgFmt);\r
@@ -58,7 +52,7 @@ CVfrCompiler::IS_RUN_STATUS (
 \r
 VOID\r
 CVfrCompiler::OptionInitialization (\r
-  IN INT32      Argc, \r
+  IN INT32      Argc,\r
   IN CHAR8      **Argv\r
   )\r
 {\r
@@ -68,23 +62,25 @@ CVfrCompiler::OptionInitialization (
   Status = EFI_SUCCESS;\r
   SetUtilityName ((CHAR8*) PROGRAM_NAME);\r
 \r
-  mOptions.VfrFileName[0]                = '\0';\r
-  mOptions.RecordListFile[0]             = '\0';\r
+  mOptions.VfrFileName                   = NULL;\r
+  mOptions.RecordListFile                = NULL;\r
   mOptions.CreateRecordListFile          = FALSE;\r
   mOptions.CreateIfrPkgFile              = FALSE;\r
-  mOptions.PkgOutputFileName[0]          = '\0';\r
-  mOptions.COutputFileName[0]            = '\0';\r
-  mOptions.OutputDirectory[0]            = '\0';\r
-  mOptions.PreprocessorOutputFileName[0] = '\0';\r
-  mOptions.VfrBaseFileName[0]            = '\0';\r
+  mOptions.PkgOutputFileName             = NULL;\r
+  mOptions.COutputFileName               = NULL;\r
+  mOptions.OutputDirectory               = NULL;\r
+  mOptions.PreprocessorOutputFileName    = NULL;\r
+  mOptions.VfrBaseFileName               = NULL;\r
   mOptions.IncludePaths                  = NULL;\r
   mOptions.SkipCPreprocessor             = TRUE;\r
   mOptions.CPreprocessorOptions          = NULL;\r
   mOptions.CompatibleMode                = FALSE;\r
   mOptions.HasOverrideClassGuid          = FALSE;\r
   mOptions.WarningAsError                = FALSE;\r
+  mOptions.AutoDefault                   = FALSE;\r
+  mOptions.CheckDefault                  = FALSE;\r
   memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID));\r
-  \r
+\r
   if (Argc == 1) {\r
     Usage ();\r
     SET_RUN_STATUS (STATUS_DEAD);\r
@@ -96,13 +92,17 @@ CVfrCompiler::OptionInitialization (
       Usage ();\r
       SET_RUN_STATUS (STATUS_DEAD);\r
       return;\r
+    } else if (stricmp(Argv[Index], "--version") == 0) {\r
+      Version ();\r
+      SET_RUN_STATUS (STATUS_DEAD);\r
+      return;\r
     } else if (stricmp(Argv[Index], "-l") == 0) {\r
       mOptions.CreateRecordListFile = TRUE;\r
       gCIfrRecordInfoDB.TurnOn ();\r
     } else if (stricmp(Argv[Index], "-i") == 0) {\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
-        DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument"); \r
+        DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument");\r
         goto Fail;\r
       }\r
 \r
@@ -113,8 +113,14 @@ CVfrCompiler::OptionInitialization (
         DebugError (NULL, 0, 1001, "Missing option", "-o missing output directory name");\r
         goto Fail;\r
       }\r
+\r
+      mOptions.OutputDirectory = (CHAR8 *) malloc (strlen (Argv[Index]) + strlen ("\\") + 1);\r
+      if (mOptions.OutputDirectory == NULL) {\r
+        DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+        goto Fail;\r
+      }\r
       strcpy (mOptions.OutputDirectory, Argv[Index]);\r
-      \r
+\r
       CHAR8 lastChar = mOptions.OutputDirectory[strlen(mOptions.OutputDirectory) - 1];\r
       if ((lastChar != '/') && (lastChar != '\\')) {\r
         if (strchr(mOptions.OutputDirectory, '/') != NULL) {\r
@@ -123,7 +129,7 @@ CVfrCompiler::OptionInitialization (
           strcat (mOptions.OutputDirectory, "\\");\r
         }\r
       }\r
-      DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", mOptions.OutputDirectory);\r
+      DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", (CHAR8 *) "%s", mOptions.OutputDirectory);\r
     } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) {\r
       mOptions.CreateIfrPkgFile = TRUE;\r
     } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) {\r
@@ -145,7 +151,7 @@ CVfrCompiler::OptionInitialization (
         goto Fail;\r
       }\r
       gCVfrStringDB.SetStringFileName(Argv[Index]);\r
-      DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", Argv[Index]);\r
+      DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", (CHAR8 *) "%s", Argv[Index]);\r
     } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) {\r
       Index++;\r
       Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid);\r
@@ -156,6 +162,10 @@ CVfrCompiler::OptionInitialization (
       mOptions.HasOverrideClassGuid = TRUE;\r
     } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {\r
       mOptions.WarningAsError = TRUE;\r
+    } else if (stricmp(Argv[Index], "-a") == 0 ||stricmp(Argv[Index], "--autodefault") == 0) {\r
+      mOptions.AutoDefault = TRUE;\r
+    } else if (stricmp(Argv[Index], "-d") == 0 ||stricmp(Argv[Index], "--checkdefault") == 0) {\r
+      mOptions.CheckDefault = TRUE;\r
     } else {\r
       DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
       goto Fail;\r
@@ -166,7 +176,21 @@ CVfrCompiler::OptionInitialization (
     DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
     goto Fail;\r
   } else {\r
+    mOptions.VfrFileName = (CHAR8 *) malloc (strlen (Argv[Index]) + 1);\r
+    if (mOptions.VfrFileName == NULL) {\r
+      DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+      goto Fail;\r
+    }\r
     strcpy (mOptions.VfrFileName, Argv[Index]);\r
+\r
+    if (mOptions.OutputDirectory == NULL) {\r
+      mOptions.OutputDirectory = (CHAR8 *) malloc (1);\r
+      if (mOptions.OutputDirectory == NULL) {\r
+        DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+        goto Fail;\r
+      }\r
+      mOptions.OutputDirectory[0] = '\0';\r
+    }\r
   }\r
 \r
   if (SetBaseFileName() != 0) {\r
@@ -189,19 +213,41 @@ CVfrCompiler::OptionInitialization (
 Fail:\r
   SET_RUN_STATUS (STATUS_DEAD);\r
 \r
-  mOptions.VfrFileName[0]                = '\0';\r
-  mOptions.RecordListFile[0]             = '\0';\r
   mOptions.CreateRecordListFile          = FALSE;\r
   mOptions.CreateIfrPkgFile              = FALSE;\r
-  mOptions.PkgOutputFileName[0]          = '\0';\r
-  mOptions.COutputFileName[0]            = '\0';\r
-  mOptions.OutputDirectory[0]            = '\0';\r
-  mOptions.PreprocessorOutputFileName[0] = '\0';\r
-  mOptions.VfrBaseFileName[0]            = '\0';\r
+\r
+  if (mOptions.VfrFileName != NULL) {\r
+    free (mOptions.VfrFileName);\r
+    mOptions.VfrFileName                 = NULL;\r
+  }\r
+  if (mOptions.VfrBaseFileName != NULL) {\r
+    free (mOptions.VfrBaseFileName);\r
+    mOptions.VfrBaseFileName             = NULL;\r
+  }\r
+  if (mOptions.OutputDirectory != NULL) {\r
+    free (mOptions.OutputDirectory);\r
+    mOptions.OutputDirectory             = NULL;\r
+  }\r
+  if (mOptions.PkgOutputFileName != NULL) {\r
+    free (mOptions.PkgOutputFileName);\r
+    mOptions.PkgOutputFileName           = NULL;\r
+  }\r
+  if (mOptions.COutputFileName != NULL) {\r
+    free (mOptions.COutputFileName);\r
+    mOptions.COutputFileName             = NULL;\r
+  }\r
+  if (mOptions.PreprocessorOutputFileName != NULL) {\r
+    free (mOptions.PreprocessorOutputFileName);\r
+    mOptions.PreprocessorOutputFileName  = NULL;\r
+  }\r
+  if (mOptions.RecordListFile != NULL) {\r
+    free (mOptions.RecordListFile);\r
+    mOptions.RecordListFile              = NULL;\r
+  }\r
   if (mOptions.IncludePaths != NULL) {\r
     delete mOptions.IncludePaths;\r
     mOptions.IncludePaths                = NULL;\r
-  } \r
+  }\r
   if (mOptions.CPreprocessorOptions != NULL) {\r
     delete mOptions.CPreprocessorOptions;\r
     mOptions.CPreprocessorOptions        = NULL;\r
@@ -232,7 +278,7 @@ CVfrCompiler::AppendIncludePath (
   strcat (IncludePaths, " -I ");\r
   strcat (IncludePaths, PathStr);\r
   if (mOptions.IncludePaths != NULL) {\r
-    delete mOptions.IncludePaths;\r
+    delete[] mOptions.IncludePaths;\r
   }\r
   mOptions.IncludePaths = IncludePaths;\r
 }\r
@@ -261,7 +307,7 @@ CVfrCompiler::AppendCPreprocessorOptions (
   strcat (Opt, " ");\r
   strcat (Opt, Options);\r
   if (mOptions.CPreprocessorOptions != NULL) {\r
-    delete mOptions.CPreprocessorOptions;\r
+    delete[] mOptions.CPreprocessorOptions;\r
   }\r
   mOptions.CPreprocessorOptions = Opt;\r
 }\r
@@ -273,7 +319,7 @@ CVfrCompiler::SetBaseFileName (
 {\r
   CHAR8         *pFileName, *pPath, *pExt;\r
 \r
-  if (mOptions.VfrFileName[0] == '\0') {\r
+  if (mOptions.VfrFileName == NULL) {\r
     return -1;\r
   }\r
 \r
@@ -294,8 +340,16 @@ CVfrCompiler::SetBaseFileName (
     return -1;\r
   }\r
 \r
-  strncpy (mOptions.VfrBaseFileName, pFileName, pExt - pFileName);\r
-  mOptions.VfrBaseFileName[pExt - pFileName] = '\0';\r
+  *pExt = '\0';\r
+\r
+  mOptions.VfrBaseFileName = (CHAR8 *) malloc (strlen (pFileName) + 1);\r
+  if (mOptions.VfrBaseFileName == NULL) {\r
+    *pExt = '.';\r
+    return -1;\r
+  }\r
+\r
+  strcpy (mOptions.VfrBaseFileName, pFileName);\r
+  *pExt = '.';\r
 \r
   return 0;\r
 }\r
@@ -305,7 +359,19 @@ CVfrCompiler::SetPkgOutputFileName (
   VOID\r
   )\r
 {\r
-  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+  INTN Length;\r
+\r
+  if (mOptions.VfrBaseFileName == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  Length = strlen (mOptions.OutputDirectory) +\r
+           strlen (mOptions.VfrBaseFileName) +\r
+           strlen (VFR_PACKAGE_FILENAME_EXTENSION) +\r
+           1;\r
+\r
+  mOptions.PkgOutputFileName = (CHAR8 *) malloc (Length);\r
+  if (mOptions.PkgOutputFileName == NULL) {\r
     return -1;\r
   }\r
 \r
@@ -321,7 +387,19 @@ CVfrCompiler::SetCOutputFileName (
   VOID\r
   )\r
 {\r
-  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+  INTN Length;\r
+\r
+  if (mOptions.VfrBaseFileName == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  Length = strlen (mOptions.OutputDirectory) +\r
+           strlen (mOptions.VfrBaseFileName) +\r
+           strlen (".c") +\r
+           1;\r
+\r
+  mOptions.COutputFileName = (CHAR8 *) malloc (Length);\r
+  if (mOptions.COutputFileName == NULL) {\r
     return -1;\r
   }\r
 \r
@@ -337,7 +415,19 @@ CVfrCompiler::SetPreprocessorOutputFileName (
   VOID\r
   )\r
 {\r
-  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+  INTN Length;\r
+\r
+  if (mOptions.VfrBaseFileName == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  Length = strlen (mOptions.OutputDirectory) +\r
+           strlen (mOptions.VfrBaseFileName) +\r
+           strlen (VFR_PREPROCESS_FILENAME_EXTENSION) +\r
+           1;\r
+\r
+  mOptions.PreprocessorOutputFileName = (CHAR8 *) malloc (Length);\r
+  if (mOptions.PreprocessorOutputFileName == NULL) {\r
     return -1;\r
   }\r
 \r
@@ -353,7 +443,19 @@ CVfrCompiler::SetRecordListFileName (
   VOID\r
   )\r
 {\r
-  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+  INTN Length;\r
+\r
+  if (mOptions.VfrBaseFileName == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  Length = strlen (mOptions.OutputDirectory) +\r
+           strlen (mOptions.VfrBaseFileName) +\r
+           strlen (VFR_RECORDLIST_FILENAME_EXTENSION) +\r
+           1;\r
+\r
+  mOptions.RecordListFile = (CHAR8 *) malloc (Length);\r
+  if (mOptions.RecordListFile == NULL) {\r
     return -1;\r
   }\r
 \r
@@ -365,13 +467,15 @@ CVfrCompiler::SetRecordListFileName (
 }\r
 \r
 CVfrCompiler::CVfrCompiler (\r
-  IN INT32      Argc, \r
+  IN INT32      Argc,\r
   IN CHAR8      **Argv\r
   )\r
 {\r
   mPreProcessCmd = (CHAR8 *) PREPROCESSOR_COMMAND;\r
   mPreProcessOpt = (CHAR8 *) PREPROCESSOR_OPTIONS;\r
 \r
+  SET_RUN_STATUS (STATUS_STARTED);\r
+\r
   OptionInitialization(Argc, Argv);\r
 \r
   if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {\r
@@ -385,34 +489,70 @@ CVfrCompiler::~CVfrCompiler (
   VOID\r
   )\r
 {\r
+  if (mOptions.VfrFileName != NULL) {\r
+    free (mOptions.VfrFileName);\r
+    mOptions.VfrFileName = NULL;\r
+  }\r
+\r
+  if (mOptions.VfrBaseFileName != NULL) {\r
+    free (mOptions.VfrBaseFileName);\r
+    mOptions.VfrBaseFileName = NULL;\r
+  }\r
+\r
+  if (mOptions.OutputDirectory != NULL) {\r
+    free (mOptions.OutputDirectory);\r
+    mOptions.OutputDirectory = NULL;\r
+  }\r
+\r
+  if (mOptions.PkgOutputFileName != NULL) {\r
+    free (mOptions.PkgOutputFileName);\r
+    mOptions.PkgOutputFileName = NULL;\r
+  }\r
+\r
+  if (mOptions.COutputFileName != NULL) {\r
+    free (mOptions.COutputFileName);\r
+    mOptions.COutputFileName = NULL;\r
+  }\r
+\r
+  if (mOptions.PreprocessorOutputFileName != NULL) {\r
+    free (mOptions.PreprocessorOutputFileName);\r
+    mOptions.PreprocessorOutputFileName = NULL;\r
+  }\r
+\r
+  if (mOptions.RecordListFile != NULL) {\r
+    free (mOptions.RecordListFile);\r
+    mOptions.RecordListFile = NULL;\r
+  }\r
+\r
   if (mOptions.IncludePaths != NULL) {\r
-    delete mOptions.IncludePaths;\r
+    delete[] mOptions.IncludePaths;\r
     mOptions.IncludePaths = NULL;\r
   }\r
 \r
   if (mOptions.CPreprocessorOptions != NULL) {\r
-    delete mOptions.CPreprocessorOptions;\r
+    delete[] mOptions.CPreprocessorOptions;\r
     mOptions.CPreprocessorOptions = NULL;\r
   }\r
 \r
   SET_RUN_STATUS(STATUS_DEAD);\r
 }\r
 \r
-VOID \r
+VOID\r
 CVfrCompiler::Usage (\r
   VOID\r
   )\r
 {\r
   UINT32 Index;\r
   CONST  CHAR8 *Help[] = {\r
-    " ", \r
-    "VfrCompile version " VFR_COMPILER_VERSION __BUILD_VERSION,\r
-    "Copyright (c) 2004-2013 Intel Corporation. All rights reserved.",\r
+    " ",\r
+    "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
+    "Copyright (c) 2004-2016 Intel Corporation. All rights reserved.",\r
     " ",\r
     "Usage: VfrCompile [options] VfrFile",\r
     " ",\r
     "Options:",\r
     "  -h, --help     prints this help",\r
+    "  --version      prints version info",\r
     "  -l             create an output IFR listing file",\r
     "  -o DIR, --output-directory DIR",\r
     "                 deposit all output files to directory OutputDir",\r
@@ -430,6 +570,23 @@ CVfrCompiler::Usage (
     "                 format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",\r
     "  -w  --warning-as-error",\r
     "                 treat warning as an error",\r
+    "  -a  --autodefaut    generate default value for question opcode if some default is missing",\r
+    "  -d  --checkdefault  check the default information in a question opcode",\r
+    NULL\r
+    };\r
+  for (Index = 0; Help[Index] != NULL; Index++) {\r
+    fprintf (stdout, "%s\n", Help[Index]);\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrCompiler::Version (\r
+  VOID\r
+  )\r
+{\r
+  UINT32 Index;\r
+  CONST  CHAR8 *Help[] = {\r
+    "VfrCompile version " VFR_COMPILER_VERSION "Build " __BUILD_VERSION,\r
     NULL\r
     };\r
   for (Index = 0; Help[Index] != NULL; Index++) {\r
@@ -454,14 +611,14 @@ CVfrCompiler::PreProcess (
     goto Out;\r
   }\r
 \r
-  if ((pVfrFile = fopen (mOptions.VfrFileName, "r")) == NULL) {\r
-    DebugError (NULL, 0, 0001, "Error opening the input VFR file", mOptions.VfrFileName);\r
+  if ((pVfrFile = fopen (LongFilePath (mOptions.VfrFileName), "r")) == NULL) {\r
+    DebugError (NULL, 0, 0001, "Error opening the input VFR file", "%s", mOptions.VfrFileName);\r
     goto Fail;\r
   }\r
   fclose (pVfrFile);\r
 \r
-  CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) + \r
-              strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName);\r
+  CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) +\r
+           strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName);\r
   if (mOptions.CPreprocessorOptions != NULL) {\r
     CmdLen += strlen (mOptions.CPreprocessorOptions);\r
   }\r
@@ -490,7 +647,7 @@ CVfrCompiler::PreProcess (
     goto Fail;\r
   }\r
 \r
-  delete PreProcessCmd;\r
+  delete[] PreProcessCmd;\r
 \r
 Out:\r
   SET_RUN_STATUS (STATUS_PREPROCESSED);\r
@@ -500,7 +657,7 @@ Fail:
   if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
     SET_RUN_STATUS (STATUS_FAILED);\r
   }\r
-  delete PreProcessCmd;\r
+  delete[] PreProcessCmd;\r
 }\r
 \r
 extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *);\r
@@ -523,8 +680,8 @@ CVfrCompiler::Compile (
   gCVfrErrorHandle.SetInputFile (InFileName);\r
   gCVfrErrorHandle.SetWarningAsError(mOptions.WarningAsError);\r
 \r
-  if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
-    DebugError (NULL, 0, 0001, "Error opening the input file", InFileName);\r
+  if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
+    DebugError (NULL, 0, 0001, "Error opening the input file", "%s", InFileName);\r
     goto Fail;\r
   }\r
 \r
@@ -540,6 +697,7 @@ CVfrCompiler::Compile (
   }\r
 \r
   fclose (pInFile);\r
+  pInFile = NULL;\r
 \r
   if (gCFormPkg.HavePendingUnassigned () == TRUE) {\r
     gCFormPkg.PendingAssignPrintAll ();\r
@@ -560,54 +718,30 @@ Fail:
 }\r
 \r
 VOID\r
-CVfrCompiler::UpdateInfoForDynamicOpcode (\r
+CVfrCompiler::AdjustBin (\r
   VOID\r
   )\r
 {\r
-  SIfrRecord          *pRecord;\r
+  EFI_VFR_RETURN_CODE Status;\r
 \r
-  if (!gNeedAdjustOpcode) {\r
+  if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
     return;\r
   }\r
-  \r
-  //\r
-  // Base on the original offset info to update the record list.\r
-  //\r
-  if (!gCIfrRecordInfoDB.IfrAdjustDynamicOpcodeInRecords()) {\r
-    DebugError (NULL, 0, 1001, "Error parsing vfr file", "Can find the offset in the record.");\r
-  }\r
 \r
-  //\r
-  // Base on the opcode binary length to recalculate the offset for each opcode.\r
-  //\r
-  gCIfrRecordInfoDB.IfrAdjustOffsetForRecord();\r
+  if (gNeedAdjustOpcode) {\r
+    //\r
+    // When parsing the Vfr, has created some opcodes, now need to update the record info.\r
+    //\r
+    gCIfrRecordInfoDB.IfrUpdateRecordInfoForDynamicOpcode (FALSE);\r
+  }\r
 \r
   //\r
-  // Base on the offset to find the binary address.\r
+  // Check whether need to check default info for question or auto add default for question.\r
   //\r
-  pRecord = gCIfrRecordInfoDB.GetRecordInfoFromOffset(gAdjustOpcodeOffset);\r
-  while (pRecord != NULL) {\r
-    pRecord->mIfrBinBuf = gCFormPkg.GetBufAddrBaseOnOffset(pRecord->mOffset);\r
-    if (pRecord->mIfrBinBuf == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error parsing vfr file", " 0x%X. offset not allocated.", pRecord->mOffset);\r
-    }\r
-    pRecord = pRecord->mNext;\r
-  }\r
-}\r
-\r
-VOID\r
-CVfrCompiler::AdjustBin (\r
-  VOID\r
-  )\r
-{\r
-  EFI_VFR_RETURN_CODE Status;\r
-\r
-  if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
-    return;\r
+  if (mOptions.AutoDefault || mOptions.CheckDefault) {\r
+    gCIfrRecordInfoDB.IfrCheckAddDefaultRecord (mOptions.AutoDefault, mOptions.CheckDefault);\r
   }\r
 \r
-  UpdateInfoForDynamicOpcode ();\r
-\r
   //\r
   // Check Binary Code consistent between Form and IfrRecord\r
   //\r
@@ -616,7 +750,7 @@ CVfrCompiler::AdjustBin (
   // Get Package Data and IfrRecord Data\r
   //\r
   gCFormPkg.BuildPkg (gCBuffer);\r
-  gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
+  gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer);\r
 \r
   //\r
   // Compare Form and Record data\r
@@ -659,7 +793,7 @@ CVfrCompiler::AdjustBin (
     //\r
     // Re get the IfrRecord Buffer.\r
     //\r
-    gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer); \r
+    gCIfrRecordInfoDB.IfrRecordOutput (gRBuffer);\r
   }\r
 \r
   return;\r
@@ -677,8 +811,8 @@ CVfrCompiler::GenBinary (
   }\r
 \r
   if (mOptions.CreateIfrPkgFile == TRUE) {\r
-    if ((pFile = fopen (mOptions.PkgOutputFileName, "wb")) == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error opening file", mOptions.PkgOutputFileName);\r
+    if ((pFile = fopen (LongFilePath (mOptions.PkgOutputFileName), "wb")) == NULL) {\r
+      DebugError (NULL, 0, 0001, "Error opening file", "%s", mOptions.PkgOutputFileName);\r
       goto Fail;\r
     }\r
     if (gCFormPkg.BuildPkg (pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
@@ -718,10 +852,10 @@ CVfrCompiler::GenCFile (
   if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
     goto Fail;\r
   }\r
-  \r
+\r
   if (!mOptions.CreateIfrPkgFile || mOptions.CompatibleMode) {\r
-    if ((pFile = fopen (mOptions.COutputFileName, "w")) == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error opening output C file", mOptions.COutputFileName);\r
+    if ((pFile = fopen (LongFilePath (mOptions.COutputFileName), "w")) == NULL) {\r
+      DebugError (NULL, 0, 0001, "Error opening output C file", "%s", mOptions.COutputFileName);\r
       goto Fail;\r
     }\r
 \r
@@ -729,7 +863,7 @@ CVfrCompiler::GenCFile (
       fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
     }\r
 \r
-    if (mOptions.CompatibleMode) { \r
+    if (mOptions.CompatibleMode) {\r
       gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
     }\r
 \r
@@ -762,18 +896,18 @@ CVfrCompiler::GenRecordListFile (
 \r
   InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
 \r
-  if (mOptions.CreateRecordListFile == TRUE) {\r
+  if (mOptions.CreateRecordListFile == TRUE && InFileName != NULL && mOptions.RecordListFile != NULL) {\r
     if ((InFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {\r
       return;\r
     }\r
 \r
-    if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", InFileName);\r
+    if ((pInFile = fopen (LongFilePath (InFileName), "r")) == NULL) {\r
+      DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", "%s", InFileName);\r
       return;\r
     }\r
 \r
-    if ((pOutFile = fopen (mOptions.RecordListFile, "w")) == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error opening the record list file", mOptions.RecordListFile);\r
+    if ((pOutFile = fopen (LongFilePath (mOptions.RecordListFile), "w")) == NULL) {\r
+      DebugError (NULL, 0, 0001, "Error opening the record list file", "%s", mOptions.RecordListFile);\r
       goto Err1;\r
     }\r
 \r
@@ -786,7 +920,7 @@ CVfrCompiler::GenRecordListFile (
         gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);\r
       }\r
     }\r
-    \r
+\r
     fprintf (pOutFile, "\n//\n// All Opcode Record List \n//\n");\r
     gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, 0);\r
     gCVfrVarDataTypeDB.Dump(pOutFile);\r
@@ -803,7 +937,7 @@ Err1:
 \r
 int\r
 main (\r
-  IN int             Argc, \r
+  IN int             Argc,\r
   IN char            **Argv\r
   )\r
 {\r
@@ -811,7 +945,7 @@ main (
 \r
   SetPrintLevel(WARNING_LOG_LEVEL);\r
   CVfrCompiler         Compiler(Argc, Argv);\r
-  \r
+\r
   Compiler.PreProcess();\r
   Compiler.Compile();\r
   Compiler.AdjustBin();\r
@@ -825,11 +959,11 @@ main (
   }\r
 \r
   if (gCBuffer.Buffer != NULL) {\r
-    delete gCBuffer.Buffer;\r
+    delete[] gCBuffer.Buffer;\r
   }\r
-  \r
+\r
   if (gRBuffer.Buffer != NULL) {\r
-    delete gRBuffer.Buffer;\r
+    delete[] gRBuffer.Buffer;\r
   }\r
 \r
   return GetUtilityStatus ();\r