Merged UEFI support from R8 tree
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 20 Feb 2008 07:32:26 +0000 (07:32 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 20 Feb 2008 07:32:26 +0000 (07:32 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1009 7335b38e-4728-0410-8992-fb3ffe349368

13 files changed:
Source/C/VfrCompile/EfiVfr.h
Source/C/VfrCompile/VfrCompile.g [deleted file]
Source/C/VfrCompile/VfrCompiler.cpp [new file with mode: 0644]
Source/C/VfrCompile/VfrCompiler.h [new file with mode: 0644]
Source/C/VfrCompile/VfrError.cpp [new file with mode: 0644]
Source/C/VfrCompile/VfrError.h [new file with mode: 0644]
Source/C/VfrCompile/VfrFormPkg.cpp [new file with mode: 0644]
Source/C/VfrCompile/VfrFormPkg.h [new file with mode: 0644]
Source/C/VfrCompile/VfrServices.cpp [deleted file]
Source/C/VfrCompile/VfrServices.h [deleted file]
Source/C/VfrCompile/VfrSyntax.g [new file with mode: 0644]
Source/C/VfrCompile/VfrUtilityLib.cpp [new file with mode: 0644]
Source/C/VfrCompile/VfrUtilityLib.h [new file with mode: 0644]

index e60e9a5..43e40ab 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2004 - 2005, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2007, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -15,168 +15,39 @@ Module Name:
 \r
 Abstract:\r
 \r
-  Defines and prototypes for the EFI internal forms representation\r
-  setup protocol and drivers\r
+  Defines and prototypes for the UEFI VFR compiler internal use.\r
   \r
 --*/\r
 \r
-#ifndef _EFI_VFR_H_\r
-#define _EFI_VFR_H_\r
+#ifndef _EFIVFR_H_\r
+#define _EFIVFR_H_\r
 \r
-#include <string.h>\r
+#include "Tiano.h"\r
+#include "TianoHii.h"\r
 \r
-#include <Common/UefiBaseTypes.h>\r
-#include <Common/UefiInternalFormRepresentation.h>\r
+#define MAX_PATH                 255\r
+#define MAX_LINE_LEN             4096\r
 \r
-//\r
-// This number should be incremented with each change to the VFR compiler.\r
-// We write the version to the output list file for debug purposes.\r
-//\r
-#define VFR_COMPILER_VERSION  "1.88"\r
+#define EFI_IFR_MAX_LENGTH       0xFF\r
 \r
-//\r
-// Maximum file path for filenames\r
-//\r
-#ifndef MAX_PATH\r
-#define MAX_PATH        255\r
-#endif\r
-#define MAX_QUEUE_COUNT 255\r
-#undef  MAX_LINE_LEN\r
-#define MAX_LINE_LEN    1024\r
-#define PROGRAM_NAME    "VfrCompile"\r
-\r
-//\r
-// We parse C-style structure definitions which can then be referenced\r
-// in VFR statements.\r
-// We need to define an internal structure that can be used to\r
-// track the fields in a structure definition, and another structure\r
-// to keep track of the structure name and subfields.\r
-//\r
-typedef struct _STRUCT_FIELD_DEFINITION {\r
-  struct _STRUCT_FIELD_DEFINITION *Next;\r
-  int                             DataSize;\r
-  int                             Offset;     // from the start of the structure\r
-  int                             ArrayLength;\r
-  char                            IsArray;\r
-  char                            *Name;\r
-} STRUCT_FIELD_DEFINITION;\r
-\r
-typedef struct _STRUCT_DEFINITION {\r
-  struct _STRUCT_DEFINITION *Next;\r
-  int                       Size;\r
-  int                       LineNum;          // line number where the structure was defined\r
-  int                       IsNonNV;          // if this is the non-NV data structure definition\r
-  int                       Referenced;       // if it's referenced anywhere in the VFR\r
-  int                       VarStoreIdValid;  // found a 'varstore' statement for it in the VFR\r
-  unsigned short            VarStoreId;       // key from a varstore IFR statement\r
-  int                       VarStoreLineNum;  // line number where VARSTORE was defined\r
-  char                      *Name;\r
-  STRUCT_FIELD_DEFINITION   *Field;\r
-  STRUCT_FIELD_DEFINITION   *LastField;\r
-} STRUCT_DEFINITION;\r
-\r
-//\r
-// For the IdEqValList variable list of UINT16's, keep track of them using\r
-// a linked list until we know how many there are.\r
-// We also use a linked list of these to keep track of labels used in\r
-// the VFR script so we can catch duplicates.\r
-// We'll also use it to keep track of defined varstore id's so we can\r
-// detect duplicate definitions.\r
-//\r
-typedef struct _UINT16_LIST {\r
-  struct _UINT16_LIST *Next;\r
-  UINT16              Value;\r
-  UINT32              LineNum;\r
-} UINT16_LIST;\r
-\r
-typedef struct _GOTO_REFERENCE {\r
-  struct _GOTO_REFERENCE  *Next;\r
-  UINT32                  RefLineNum; // line number of source file where referenced\r
-  UINT16                  Value;\r
-} GOTO_REFERENCE;\r
-\r
-typedef struct _FORM_ID_VALUE {\r
-  struct _FORM_ID_VALUE *Next;\r
-  UINT32                LineNum;\r
-  UINT16                Value;\r
-} FORM_ID_VALUE;\r
-\r
-//\r
-// We keep track in the parser of all "#line 4 "x.y"" strings so we\r
-// can cross-reference the line numbers in the preprocessor output .i file\r
-// to the original input files.\r
-//\r
-typedef struct _PARSER_LINE_DEFINITION {\r
-  struct _PARSER_LINE_DEFINITION  *Next;\r
-  UINT32                          HashLineNum;  // from the #line stmt\r
-  UINT32                          TokenLineNum; // line number in the .i file\r
-  CHAR8                           *FileName;    // from the #line stmt\r
-} PARSER_LINE_DEFINITION;\r
-\r
-extern PARSER_LINE_DEFINITION *gLineDefinition;\r
-extern PARSER_LINE_DEFINITION *gLastLineDefinition;\r
-\r
-extern\r
-char                          *\r
-ConvertLineNumber (\r
-  UINT32 *LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Given the line number in the preprocessor-output file, use the line number\r
-  information we've saved to determine the source file name and line number\r
-  where the code originally came from. This is required for error reporting.\r
-\r
-Arguments:\r
-  LineNum - the line number in the preprocessor-output file.\r
+#define EFI_VARSTORE_ID_INVALID  0\r
+#define EFI_VAROFFSET_INVALID    0xFFFF\r
+#define EFI_VARSTORE_ID_START    0x20\r
+#define EFI_STRING_ID_INVALID    0x0\r
+#define EFI_IMAGE_ID_INVALID     0xFFFF\r
 \r
-Returns:\r
-  Returns a pointer to the source file name. Also returns the line number \r
-  in the provided LineNum argument\r
+typedef enum {\r
+  QUESTION_NORMAL,\r
+  QUESTION_DATE,\r
+  QUESTION_TIME,\r
+} EFI_QUESION_TYPE;\r
 \r
---*/\r
-;\r
-\r
-typedef struct _IFR_BYTE {\r
-  struct _IFR_BYTE  *Next;\r
-  UINT32            LineNum;\r
-  UINT8             OpcodeByte;\r
-  UINT8             KeyByte;\r
-} IFR_BYTE;\r
-\r
-typedef struct {\r
-  CHAR8 VfrFileName[MAX_PATH];\r
-  CHAR8 VfrListFileName[MAX_PATH];\r
-  INT8  CreateListFile;\r
-  INT8  CreateIfrBinFile;\r
-  CHAR8 IfrOutputFileName[MAX_PATH];\r
-  CHAR8 OutputDirectory[MAX_PATH];\r
-  CHAR8 PreprocessorOutputFileName[MAX_PATH];\r
-  CHAR8 VfrBaseFileName[MAX_PATH];  // name of input VFR file with no path or extension\r
-  CHAR8 *IncludePaths;\r
-  CHAR8 *CPreprocessorOptions;\r
-} OPTIONS;\r
-\r
-extern OPTIONS  gOptions;\r
-\r
-VOID\r
-WriteStandardFileHeader (\r
-  FILE *OutFptr\r
-  )\r
-/*++\r
+typedef enum {\r
+  EQUAL,\r
+  LESS_EQUAL,\r
+  LESS_THAN,\r
+  GREATER_THAN,\r
+  GREATER_EQUAL\r
+} EFI_COMPARE_TYPE;\r
 \r
-Routine Description:\r
-  This function is invoked to emit a standard header to an\r
-  output text file.\r
-  \r
-Arguments:\r
-  OutFptr - file to write the header to\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-;\r
-\r
-#endif // #ifndef _EFI_VFR_H_\r
+#endif\r
diff --git a/Source/C/VfrCompile/VfrCompile.g b/Source/C/VfrCompile/VfrCompile.g
deleted file mode 100644 (file)
index 7b9253b..0000000
+++ /dev/null
@@ -1,3529 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation                                                         \r
-All rights reserved. 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
-\r
-Module Name:\r
-\r
-  VfrCompile.g\r
-\r
-Abstract:\r
-\r
-  PCCTS parser and lexer definitions for the EFI VFR forms compiler\r
-  \r
---*/  \r
-\r
-#header<<\r
-\r
-#include <Common/UefiBaseTypes.h>\r
-#include <Common/UefiMultiPhase.h>\r
-#include <Common/UefiInternalFormRepresentation.h>\r
-#include <Protocol/UgaDraw.h>\r
-#include <Protocol/HiiFramework.h>\r
-\r
-#include "CommonLib.h"\r
-#include "EfiUtilityMsgs.h"\r
-#include "EfiVfr.h"\r
-#include "VfrServices.h"\r
-\r
-#include <ctype.h>\r
-#ifndef __GNUC__\r
-#include <direct.h>\r
-#include <process.h> // for spawn functions\r
-#else\r
-#include <unistd.h>\r
-#endif\r
-\r
->>\r
-\r
-<<\r
-\r
-//\r
-// Base info for DLG-generated scanner\r
-//\r
-#include "DLexerBase.h"    \r
-\r
-//\r
-// Include the scanner file generated by DLG\r
-//\r
-#include "DLGLexer.h"    \r
-\r
-class DLGLexerVfr : public DLGLexer\r
-{\r
-public:\r
-  DLGLexerVfr (DLGFileInput *F) : DLGLexer (F) {};\r
-  INT32 errstd (char *Text) \r
-  { \r
-    printf ("unrecognized input '%s'\n", Text); \r
-  }\r
-\r
-};\r
-\r
-//\r
-// Base token definitions for ANTLR\r
-//\r
-#include "AToken.h"\r
-\r
-//\r
-// This is how we invoke the C preprocessor on the VFR source file\r
-// to resolve #defines, #includes, etc. To make C source files\r
-// shareable between VFR and drivers, define VFRCOMPILE so that\r
-// #ifdefs can be used in shared .h files.\r
-//\r
-#ifdef __GNUC__\r
-#define PREPROCESSOR_COMMAND        "gcc "\r
-#define PREPROCESSOR_OPTIONS        "-x c -E -P -DVFRCOMPILE "\r
-#define FILE_SEP_CHAR '/'\r
-#define FILE_SEP_STRING "/"\r
-#else\r
-#define PREPROCESSOR_COMMAND        "cl.exe "\r
-#define PREPROCESSOR_OPTIONS        "/nologo /P /TC /DVFRCOMPILE "\r
-#define FILE_SEP_CHAR '/'\r
-#define FILE_SEP_STRING "/"\r
-#endif\r
-\r
-typedef ANTLRCommonToken ANTLRToken;\r
-\r
-//\r
-// Specify the filename extensions for the files we generate.\r
-//\r
-#define VFR_BINARY_FILENAME_EXTENSION       ".c"\r
-#define VFR_LIST_FILENAME_EXTENSION         ".lst"\r
-\r
-static \r
-VOID \r
-Usage ();\r
-\r
-static \r
-STATUS \r
-ProcessArgs (\r
-  int         Argc, \r
-  char        *Argv[]\r
-  );\r
-\r
-static \r
-VOID \r
-Cleanup ();\r
-\r
-//\r
-// Globals\r
-//\r
-OPTIONS gOptions;\r
-\r
-int \r
-main (\r
-  int   argc, \r
-  char  **argv\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Application entry point function. Parse command-line arguments, \r
-  invoke the parser, clean up, and return.\r
-\r
-Arguments:\r
-  argc - standard argc passed to main() per C conventions\r
-  argv - standard argv passed to main() per C conventions\r
-\r
-Returns:\r
-  STATUS_SUCCESS - program executed with no errors or warnings\r
-  STATUS_WARNING - program executed with warnings\r
-  STATUS_ERROR   - non-recoverable errors encountered while processing\r
-\r
---*/\r
-{\r
-  FILE      *VfrFptr;\r
-  char      *Cmd;\r
-  char      *Cptr;\r
-  int       Len;\r
-  STATUS    Status;\r
-    \r
-  //\r
-  // Set our program name for the error printing routines.\r
-  // Then set printing limits.\r
-  //\r
-  SetUtilityName (PROGRAM_NAME);\r
-  SetPrintLimits (20, 20, 30);\r
-  //\r
-  // Process the command-line arguments\r
-  //\r
-  if (ProcessArgs (argc, argv) != STATUS_SUCCESS) {\r
-    Usage ();\r
-    Cleanup();\r
-    return STATUS_ERROR;\r
-  }\r
-  VfrFptr = NULL;\r
-  //\r
-  // Verify the VFR script file exists\r
-  //\r
-  if ((VfrFptr = fopen (gOptions.VfrFileName, "r")) == NULL) {\r
-    Error (PROGRAM_NAME, 0, 0, gOptions.VfrFileName, "could not open input VFR file");\r
-    Cleanup();\r
-    return STATUS_ERROR;\r
-  }\r
-  //\r
-  // Now close the file and make a system call to run the preprocessor\r
-  // on it.\r
-  //\r
-  fclose (VfrFptr);\r
-//  Len = strlen (PREPROCESSOR_OPTIONS) + strlen (gOptions.VfrFileName) + 10;\r
-//  if (gOptions.CPreprocessorOptions != NULL) {\r
-//    Len += strlen (gOptions.CPreprocessorOptions) + 1;\r
-//  }\r
-//  if (gOptions.IncludePaths != NULL) {\r
-//    Len += strlen (gOptions.IncludePaths) + 1;\r
-//  }\r
-//  Cmd = (char *)malloc (Len);\r
-//  if (Cmd == NULL) {\r
-//    Error (PROGRAM_NAME, 0, 0, NULL, "could not allocate memory");\r
-//    Cleanup();\r
-//    return STATUS_ERROR;\r
-//  }  \r
-//  strcpy (Cmd, PREPROCESSOR_OPTIONS);\r
-//  if (gOptions.IncludePaths != NULL) {\r
-//    strcat (Cmd, gOptions.IncludePaths);\r
-//    strcat (Cmd, " ");\r
-//  }\r
-//  if (gOptions.CPreprocessorOptions != NULL) {\r
-//    strcat (Cmd, gOptions.CPreprocessorOptions);\r
-//    strcat (Cmd, " ");\r
-//  }\r
-//  strcat (Cmd, gOptions.VfrFileName);\r
-//#ifndef __GNUC__\r
-//  Status = _spawnlp (_P_WAIT, PREPROCESSOR_COMMAND, Cmd, NULL);\r
-//#else\r
-//  {\r
-//    char CommandLine[1000];\r
-//    char *p;\r
-// \r
-//    //\r
-//    // Lean the slashes forward.\r
-//    //\r
-//    for (p = gOptions.PreprocessorOutputFileName; *p; p++) {\r
-//      if (*p=='\\') {\r
-//        *p=FILE_SEP_CHAR;\r
-//      }\r
-//    }\r
-// \r
-//    //\r
-//    // Lean the slashes forward.\r
-//    //\r
-//    for (p = Cmd; *p; p++) {\r
-//      if (*p=='\\') {\r
-//        *p=FILE_SEP_CHAR;\r
-//      }\r
-//      }\r
-// \r
-//    sprintf(CommandLine, "%s %s > %s", PREPROCESSOR_COMMAND, Cmd, gOptions.PreprocessorOutputFileName);\r
-//    Status = system (CommandLine);\r
-//  }\r
-//#endif\r
-//  if (Status != 0) {\r
-//    Error (PROGRAM_NAME, 0, 0, gOptions.VfrFileName, "failed to spawn C preprocessor on VFR file");\r
-//    printf ("Command: '%s %s'\n", PREPROCESSOR_COMMAND, Cmd);\r
-//    Cleanup();\r
-//    return STATUS_ERROR;\r
-//  }\r
-//  free (Cmd);\r
-  //\r
-  // Open the preprocessor output file\r
-  //\r
-  if ((VfrFptr = fopen (gOptions.VfrFileName, "r")) == NULL) {\r
-    Error (PROGRAM_NAME, 0, 0, "failed to open input VFR preprocessor output file", \r
-      gOptions.PreprocessorOutputFileName);\r
-    Cleanup();\r
-    return STATUS_ERROR;\r
-  }\r
-  //\r
-  // Define input VFR file\r
-  //\r
-  DLGFileInput InputFile (VfrFptr);\r
-  //\r
-  // Define an instance of the scanner    \r
-  //\r
-  DLGLexerVfr Scanner (&InputFile);\r
-  //\r
-  // Define token buffer between scanner and parser\r
-  //\r
-  ANTLRTokenBuffer Pipe (&Scanner);    \r
-  //\r
-  // Create a token to use as a model\r
-  //\r
-  ANTLRToken Tok;     \r
-  //\r
-  // Tell the scanner what type the token is\r
-  //\r
-  Scanner.setToken (&Tok);    \r
-  //\r
-  // Create an instance of our parser\r
-  //\r
-  EfiVfrParser Parser (&Pipe);    \r
-  //\r
-  // Initialize the parser    \r
-  //\r
-  Parser.init ();\r
-  Status = GetUtilityStatus ();\r
-  if (Status != STATUS_SUCCESS) {\r
-    Cleanup();\r
-    return Status;\r
-  }  \r
-  //\r
-  // Start the first rule    \r
-  //\r
-  Parser.program ();\r
-  //\r
-  // Close the input script file\r
-  //\r
-  fclose (VfrFptr);\r
-  Parser.WriteIfrBytes ();\r
-  //\r
-  // Call cleanup, which does some extra checking of the script\r
-  //\r
-  Parser.Cleanup ();\r
-  Cleanup();\r
-  //\r
-  // If we had an error somewhere, delete our output files so that\r
-  // a subsequent build will rebuild them.\r
-  //\r
-  Status = GetUtilityStatus ();\r
-  if (Status == STATUS_ERROR) {\r
-    remove (gOptions.IfrOutputFileName);\r
-  }\r
-  return Status;\r
-}\r
-static\r
-VOID\r
-Cleanup ()\r
-/*++\r
-\r
-Routine Description:\r
-  Free up memory allocated during parsing.\r
-\r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  //\r
-  // Free up our string we allocated to track the include paths\r
-  //\r
-  if (gOptions.IncludePaths != NULL) {\r
-    free (gOptions.IncludePaths);\r
-    gOptions.IncludePaths = NULL;\r
-  }\r
-  //\r
-  // Free up our string we allocated to track preprocessor options\r
-  //\r
-  if (gOptions.CPreprocessorOptions != NULL) {\r
-    free (gOptions.CPreprocessorOptions);\r
-    gOptions.CPreprocessorOptions = NULL;\r
-  }\r
-}  \r
-\r
-static\r
-STATUS\r
-ProcessArgs (\r
-  int         Argc, \r
-  char        *Argv[]\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Process the command-line arguments.\r
-\r
-Arguments:\r
-  Argc - standard argc passed to main()\r
-  Argv - standard argv passed to main()\r
-\r
-Returns:\r
-  STATUS_SUCCESS - program should continue (all args ok)\r
-\r
---*/\r
-{\r
-  char    *IncludePaths;\r
-  char    *CPreprocessorOptions;\r
-  int     Len;  \r
-  char    CopyStr[MAX_PATH];\r
-  char    *Cptr;\r
-\r
-  //\r
-  // Put options in known state.\r
-  //\r
-  memset ((char *)&gOptions, 0, sizeof (OPTIONS));\r
-  //\r
-  // Go through all the arguments that start with '-'\r
-  //\r
-  Argc--;\r
-  Argv++;\r
-  while ((Argc > 0) && (Argv[0][0] == '-')) {\r
-    //\r
-    // -? or -h help option -- return an error for printing usage\r
-    //\r
-    if ((stricmp (Argv[0], "-?") == 0) || (stricmp (Argv[0], "-h") == 0)) {\r
-      return STATUS_ERROR;\r
-      break;\r
-    //\r
-    // -l to create a listing output file\r
-    //\r
-    } else if (stricmp (Argv[0], "-l") == 0) {\r
-      gOptions.CreateListFile = 1;\r
-    //\r
-    // -I include_path option for finding include files. We'll pass this\r
-    // to the preprocessor. Turn them all into a single include string.\r
-    //\r
-    } else if (stricmp (Argv[0], "-i") == 0) {\r
-      if ((Argc < 2) || (Argv[1][0] == '-')) {\r
-        Error (PROGRAM_NAME, 0, 0, Argv[0], "missing path argument");\r
-        return STATUS_ERROR;\r
-      }\r
-      Argc--;\r
-      Argv++;\r
-      Len = strlen (" -I ");\r
-      Len += strlen (Argv[0]) + 2;\r
-      if (gOptions.IncludePaths != NULL) {\r
-        Len += strlen (gOptions.IncludePaths);\r
-      }\r
-      IncludePaths = (CHAR8 *)malloc (Len);\r
-      if (IncludePaths == NULL) {\r
-        Error (PROGRAM_NAME, 0, 0, NULL, "memory allocation failure");\r
-        return STATUS_ERROR;\r
-      }\r
-      IncludePaths[0] = 0;\r
-      if (gOptions.IncludePaths != NULL) {\r
-        strcpy (IncludePaths, gOptions.IncludePaths);\r
-        free (gOptions.IncludePaths);\r
-      }\r
-      strcat (IncludePaths, " -I ");\r
-      strcat (IncludePaths, Argv[0]);\r
-      gOptions.IncludePaths = IncludePaths;\r
-    //\r
-    // -od OutputDirectory to define a common directory for output files\r
-    //\r
-    } else if (stricmp (Argv[0], "-od") == 0) {\r
-      if ((Argc < 2) || (Argv[1][0] == '-')) {\r
-        Error (PROGRAM_NAME, 0, 0, Argv[0], "missing output directory name");\r
-        return STATUS_ERROR;\r
-      }\r
-      Argc--;\r
-      Argv++;\r
-      strcpy (gOptions.OutputDirectory, Argv[0]);\r
-    } else if (stricmp (Argv[0], "-ibin") == 0) {\r
-      gOptions.CreateIfrBinFile = 1;\r
-    } else if (stricmp (Argv[0], "-nostrings") == 0) {\r
-      // deprecated option\r
-    //\r
-    // -ppflag C-preprocessor-flag option for passing options to the C preprocessor.\r
-    // Turn them all into a single string.\r
-    //\r
-    } else if (stricmp (Argv[0], "-ppflag") == 0) {\r
-      if (Argc < 2) {\r
-        Error (PROGRAM_NAME, 0, 0, Argv[0], "missing C-preprocessor argument");\r
-        return STATUS_ERROR;\r
-      }\r
-      Argc--;\r
-      Argv++;\r
-      Len = strlen (Argv[0]) + 2;\r
-      if (gOptions.CPreprocessorOptions != NULL) {\r
-        Len += strlen (gOptions.CPreprocessorOptions);\r
-      }\r
-      CPreprocessorOptions = (CHAR8 *)malloc (Len);\r
-      if (CPreprocessorOptions == NULL) {\r
-        Error (PROGRAM_NAME, 0, 0, NULL, "memory allocation failure");\r
-        return STATUS_ERROR;\r
-      }\r
-      CPreprocessorOptions[0] = 0;\r
-      if (gOptions.CPreprocessorOptions != NULL) {\r
-        strcpy (CPreprocessorOptions, gOptions.CPreprocessorOptions);\r
-        free (gOptions.CPreprocessorOptions);\r
-      }\r
-      strcat (CPreprocessorOptions, " ");\r
-      strcat (CPreprocessorOptions, Argv[0]);\r
-      gOptions.CPreprocessorOptions = CPreprocessorOptions;\r
-    } else {\r
-      Error (PROGRAM_NAME, 0, 0, Argv[0], "unrecognized option");\r
-      return STATUS_ERROR;\r
-    }\r
-    Argc--;\r
-    Argv++;\r
-  }\r
-  //\r
-  // Must specify at least the vfr file name\r
-  //\r
-  if (Argc > 1) {\r
-    Error (PROGRAM_NAME, 0, 0, Argv[1], "unrecognized argument after VFR file name");\r
-    return STATUS_ERROR;\r
-  } else if (Argc < 1) {\r
-    Error (PROGRAM_NAME, 0, 0, NULL, "must specify VFR file name");\r
-    return STATUS_ERROR;\r
-  }\r
-  strcpy (gOptions.VfrFileName, Argv[0]);\r
-  //\r
-  // We run the preprocessor on the VFR file to manage #include statements.\r
-  // Unfortunately the preprocessor does not allow you to specify the\r
-  // output name or path of the resultant .i file, so we have to do\r
-  // some work. Here we'll extract the basename of the VFR file, then\r
-  // append .i on the end. \r
-  //\r
-  strcpy (CopyStr, gOptions.VfrFileName);\r
-  Cptr = CopyStr + strlen (CopyStr) - 1;\r
-  for (;(Cptr > CopyStr) && (*Cptr != '\\') && (*Cptr != ':') && (*Cptr != '/'); Cptr--);\r
-  if (Cptr == CopyStr) {\r
-    strcpy (gOptions.PreprocessorOutputFileName, Cptr);\r
-    strcpy (gOptions.VfrBaseFileName, Cptr);\r
-  } else {\r
-    strcpy (gOptions.PreprocessorOutputFileName, Cptr+1);\r
-    strcpy (gOptions.VfrBaseFileName, Cptr+1);\r
-  }\r
-  for (Cptr = gOptions.PreprocessorOutputFileName; *Cptr && (*Cptr != '.'); Cptr++);\r
-  strcpy (Cptr, ".i");\r
-  //\r
-  // Terminate the vfr file basename at the extension\r
-  //\r
-  for (Cptr = gOptions.VfrBaseFileName; *Cptr && (*Cptr != '.'); Cptr++) {\r
-  }\r
-  *Cptr = 0; \r
-  //\r
-  // If they defined an output directory, prepend all output files\r
-  // with the working directory. Output files of interest:\r
-  //    VfrListFileName             -- list file\r
-  //    IfrOutputFileName           -- IFR bytes \r
-  //    StringOutputFileName        -- string bytes\r
-  //    StringListFileName          -- not used\r
-  //    StringDefineFileName        -- #defines of string identifiers\r
-  //\r
-  // We have two cases:\r
-  //   1. Output directory (-od) not specified, in which case output files\r
-  //      go to the current working directory.\r
-  //   2. Output directory specified, in which case the output files\r
-  //      go directly to the specified directory.\r
-  //\r
-  if (gOptions.OutputDirectory[0] == 0) {\r
-    CopyStr[0] = 0;\r
-#ifndef __GNUC__\r
-    _getcwd (CopyStr, sizeof (CopyStr));\r
-#else\r
-    getcwd (CopyStr, sizeof (CopyStr));\r
-#endif\r
-    strcpy (gOptions.OutputDirectory, CopyStr);\r
-  }\r
-  //\r
-  // Make sure output directory has a trailing backslash\r
-  //\r
-  if (gOptions.OutputDirectory[strlen (gOptions.OutputDirectory) - 1] != '\\' ||\r
-      gOptions.OutputDirectory[strlen (gOptions.OutputDirectory) - 1] != '/') {\r
-    strcat (gOptions.OutputDirectory, FILE_SEP_STRING);\r
-  }\r
-  //\r
-  // Create the base output file name as: path\base, copy it to all the output\r
-  // filenames, and then add the appropriate extension to each.\r
-  //\r
-  strcpy (gOptions.VfrListFileName, gOptions.OutputDirectory);\r
-  strcat (gOptions.VfrListFileName, gOptions.VfrBaseFileName);\r
-  strcpy (gOptions.IfrOutputFileName, gOptions.VfrListFileName);\r
-  strcat (gOptions.VfrListFileName, VFR_LIST_FILENAME_EXTENSION);\r
-  strcat (gOptions.IfrOutputFileName, VFR_BINARY_FILENAME_EXTENSION);\r
-  //\r
-  // We set a default list file name, so if they do not\r
-  // want a list file, null out the name now.\r
-  //\r
-  if (gOptions.CreateListFile == 0) {\r
-    gOptions.VfrListFileName[0] = 0;\r
-  }\r
-  return STATUS_SUCCESS;\r
-}\r
-static \r
-VOID \r
-Usage ()\r
-/*++\r
-\r
-Routine Description:\r
-  Print utility usage instructions\r
-\r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  int Index;\r
-  const char *Help[] = {\r
-    " ", \r
-    "VfrCompile version " VFR_COMPILER_VERSION,\r
-    " ",\r
-    "  Usage: VfrCompile {options} [VfrFile]",\r
-    " ",\r
-    "    where options include:",\r
-    "      -? or -h       prints this help",\r
-    "      -l             create an output IFR listing file",\r
-    "      -i IncPath     add IncPath to the search path for VFR included files",\r
-    "      -od OutputDir  deposit all output files to directory OutputDir (default=cwd)",\r
-    "      -ibin          create an IFR HII pack file",\r
-    "    where parameters include:",\r
-    "      VfrFile        name of the input VFR script file",\r
-    " ",\r
-    NULL\r
-    };\r
-  for (Index = 0; Help[Index] != NULL; Index++) {\r
-    fprintf (stdout, "%s\n", Help[Index]);\r
-  }\r
-}\r
-    \r
->>\r
-\r
-\r
-#lexaction\r
-<<\r
-\r
-#include "EfiVfr.h"\r
-\r
-PARSER_LINE_DEFINITION  *gLineDefinition = NULL;\r
-PARSER_LINE_DEFINITION  *gLastLineDefinition = NULL;\r
-\r
-VOID\r
-AddFileLine (\r
-  char      *TokenString,\r
-  UINT32    TokenLine\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  During the lexer phase, if we encounter a #line statement output by\r
-  the preprocessor, this function gets called. We'll save off the info \r
-  for error reporting purposes. The preprocessor line information has the\r
-  form:\r
-    \r
-    #line 3 "FileName.c"  \r
-\r
-Arguments:\r
-  TokenString - the parsed string as shown above\r
-  TokenLine   - the line number in the preprocessed output file \r
-  \r
-Returns:\r
-  NA\r
-\r
---*/\r
-{\r
-  PARSER_LINE_DEFINITION  *LineDef;\r
-  CHAR8                   *Cptr;\r
-  \r
-  //\r
-  // Allocate a structure in which we can keep track of this line information.\r
-  //\r
-  LineDef = (PARSER_LINE_DEFINITION *)malloc (sizeof (PARSER_LINE_DEFINITION));\r
-  memset ((char *)LineDef, 0, sizeof (PARSER_LINE_DEFINITION));\r
-  LineDef->TokenLineNum = TokenLine;\r
-  LineDef->HashLineNum = atoi (TokenString + 6);\r
-  //\r
-  // Find the quotes in the filename, then allocate space in the line\r
-  // def structure for a copy of the filename. Finally, copy it without\r
-  // quotes to the line def.\r
-  //\r
-  for (Cptr = TokenString + 7; *Cptr && (*Cptr != '"'); Cptr++);\r
-  if (*Cptr == '"') {\r
-    LineDef->FileName = (CHAR8 *)malloc (strlen (Cptr));\r
-    Cptr++;\r
-    strcpy (LineDef->FileName, Cptr);\r
-    for (Cptr = LineDef->FileName; *Cptr && (*Cptr != '"'); Cptr++);\r
-    *Cptr = 0;   \r
-    //\r
-    // Now add this new one to the list\r
-    //\r
-    if (gLineDefinition == NULL) {\r
-      gLineDefinition = LineDef;\r
-    } else {\r
-      gLastLineDefinition->Next = LineDef;\r
-    }\r
-    gLastLineDefinition = LineDef;\r
-  } else {\r
-    Error (PROGRAM_NAME, 0, 0, "invalid line definition in preprocessor output file", TokenString);\r
-    free (LineDef);\r
-    return;\r
-  }\r
-}\r
-char *\r
-ConvertLineNumber (\r
-  UINT32 *LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Given the line number in the preprocessor-output file, use the line number\r
-  information we've saved to determine the source file name and line number\r
-  where the code originally came from. This is required for error reporting.\r
-\r
-Arguments:\r
-  LineNum - the line number in the preprocessor-output file.\r
-\r
-Returns:\r
-  Returns a pointer to the source file name. Also returns the line number \r
-  in the provided LineNum argument\r
-\r
---*/\r
-{\r
-  PARSER_LINE_DEFINITION  *LineDef;\r
-  //\r
-  // Step through our linked list of #line information we saved off. \r
-  // For each one, look at its line number, and the line number of the\r
-  // next record, and see if the passed-in line number is in the range.\r
-  // If it is, then convert the line number to the appropriate line number\r
-  // of the original source file.\r
-  //\r
-  for (LineDef = gLineDefinition; LineDef != NULL; LineDef = LineDef->Next) {\r
-    //\r
-    // The given LineNum is the line number from the .i file.\r
-    // Find a line definition whose range includes this line number,\r
-    // convert the line number, and return the filename.\r
-    //\r
-    if (LineDef->TokenLineNum <= *LineNum) {\r
-      if (LineDef->Next != NULL) {\r
-        if (LineDef->Next->TokenLineNum > *LineNum) {\r
-          *LineNum = *LineNum - LineDef->TokenLineNum + LineDef->HashLineNum;\r
-          return LineDef->FileName;\r
-        }\r
-      } else {\r
-        //\r
-        // Last one in the list of line definitions, so has to be right\r
-        //\r
-        *LineNum = *LineNum - LineDef->TokenLineNum + LineDef->HashLineNum;\r
-        return LineDef->FileName;\r
-      }\r
-    }\r
-  }\r
-  return NULL;\r
-}\r
-\r
->>\r
-\r
-//\r
-// Define a lexical class for parsing quoted strings. Basically\r
-// starts with a double quote, and ends with a double quote that\r
-// is not preceeded with a backslash.\r
-//\r
-#lexclass QUOTED_STRING\r
-#token TheString            "~[\"]*\"" << mode (START); >>     \r
-\r
-//\r
-// Define a lexical class for parsing "#pragma pack" statements. \r
-// We do this just for convenience (since we skip them here) so\r
-// that users can include some minimal .h files.\r
-//\r
-#lexclass PRAGMA_PACK\r
-#token "pack"     << skip (); >>\r
-#token "[\ \t]"   << skip (); >> \r
-#token "\("       << skip (); >>\r
-#token "[0-9]*"   << skip (); >>\r
-#token "\)"       << skip (); mode (START); >>\r
-\r
-//\r
-// Define a lexclass for skipping over C++ style comments\r
-//\r
-#lexclass CPP_COMMENT\r
-#token "~[\n]*"       << skip (); >>\r
-#token "\n"           << skip (); mode (START); newline (); >>\r
-\r
-//\r
-// Standard lexclass is START\r
-//\r
-#lexclass START\r
-\r
-//\r
-// Find start of C++ style comments\r
-//\r
-#token "//"     << skip (); mode (CPP_COMMENT); >>\r
-\r
-//\r
-// Skip whitespace\r
-//\r
-#token "[\ \t]"   << skip (); >> \r
-\r
-//\r
-// Skip over newlines, but count them\r
-//\r
-#token "\n"       << skip (); newline (); >>\r
-\r
-//\r
-// Skip pragma pack statements\r
-//\r
-#token "\#pragma" << skip (); mode(PRAGMA_PACK); >>\r
-\r
-//\r
-// Skip over 'extern' in any included .H file\r
-//\r
-#token "extern"   << skip (); >>\r
-\r
-//\r
-// Tokens for the different keywords. Syntax is:\r
-// TokenName("ErrorMessageText")    "TokenString"\r
-//   where:\r
-//     TokenName is the token name (must be capitalized) that is used in the rules\r
-//     ErrorMessageText is the string the compiler emits when it detects a syntax error\r
-//     TokenString is the actual matching string used in the user script\r
-//\r
-#token LineDefinition                           "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << AddFileLine (begexpr (), line ()); skip (); >>\r
-#token FormSet("formset")                       "formset"\r
-#token EndFormSet("endformset")                 "endformset"\r
-#token Title("title")                           "title"\r
-#token FormId("formid")                         "formid"\r
-#token OneOf("oneof")                           "oneof"\r
-#token Prompt("prompt")                         "prompt"\r
-#token OrderedList("orderedlist")               "orderedlist"\r
-#token EndList("endlist")                       "endlist"\r
-#token EndForm("endform")                       "endform"\r
-#token EndOneOf("endoneof")                     "endoneof"\r
-#token Form("form")                             "form"\r
-#token Subtitle("subtitle")                     "subtitle"\r
-#token Help("help")                             "help"\r
-#token VarId("varid")                           "varid"\r
-#token Text("text")                             "text"\r
-#token Option("option")                         "option"\r
-#token Value("value")                           "value"\r
-#token Flags("flags")                           "flags"\r
-#token Date("date")                             "date"\r
-#token EndDate("enddate")                       "enddate"\r
-#token Year("year")                             "year"\r
-#token Month("month")                           "month"\r
-#token Day("day")                               "day"\r
-#token Time("time")                             "time"\r
-#token EndTime("endtime")                       "endtime"\r
-#token Hour("hour")                             "hour"\r
-#token Minute("minute")                         "minute"\r
-#token Second("second")                         "second"\r
-#token AND("AND")                               "AND"\r
-#token OR("OR")                                 "OR"\r
-#token GrayOutIf("grayoutif")                   "grayoutif"\r
-#token NOT("NOT")                               "NOT"\r
-#token Label("label")                           "label"\r
-#token Timeout("timeout")                       "timeout"\r
-#token Inventory("inventory")                   "inventory"\r
-#token StringToken("STRING_TOKEN")              "STRING_TOKEN"\r
-#token NonNvDataMap("_NON_NV_DATA_MAP")         "_NON_NV_DATA_MAP"\r
-#token Struct("struct")                         "struct"\r
-#token Uint64("UINT64")                         "UINT64"\r
-#token Uint32("UINT32")                         "UINT32"\r
-#token Uint16("UINT16")                         "UINT16"\r
-#token Char16("CHAR16")                         "CHAR16"\r
-#token Uint8("UINT8")                           "UINT8"\r
-#token Guid("guid")                             "guid"\r
-#token CheckBox("checkbox")                     "checkbox"\r
-#token EndCheckBox("endcheckbox")               "endcheckbox"\r
-#token Numeric("numeric")                       "numeric"\r
-#token EndNumeric("endnumeric")                 "endnumeric"            \r
-#token Minimum("minimum")                       "minimum"         \r
-#token Maximum("maximum")                       "maximum"         \r
-#token Step("step")                             "step"      \r
-#token Default("default")                       "default"         \r
-#token Password("password")                     "password"          \r
-#token EndPassword("endpassword")               "endpassword"             \r
-#token String("string")                         "string"        \r
-#token EndString("endstring")                   "endstring"           \r
-#token MinSize("minsize")                       "minsize"         \r
-#token MaxSize("maxsize")                       "maxsize"         \r
-#token Encoding("encoding")                     "encoding"\r
-#token SuppressIf("suppressif")                 "suppressif"\r
-#token Hidden("hidden")                         "hidden"\r
-#token Goto("goto")                             "goto"\r
-#token InconsistentIf                           "inconsistentif"\r
-#token EndIf("endif")                           "endif"\r
-#token IdEqId("ideqid")                         "ideqid"\r
-#token IdEqVal("ideqval")                       "ideqval"\r
-#token VarEqVal("vareqval")                     "vareqval"\r
-#token Var("var")                               "var"\r
-#token IdEqValList("ideqvallist")               "ideqvallist"\r
-#token Length("length")                         "length"\r
-#token Values("values")                         "values"\r
-#token Key("key")                               "key"\r
-#token DefaultFlag("DEFAULT")                   "DEFAULT"\r
-#token ManufacturingFlag("MANUFACTURING")       "MANUFACTURING"\r
-#token InteractiveFlag("INTERACTIVE")           "INTERACTIVE"\r
-#token NVAccessFlag("NV_ACCESS")                "NV_ACCESS"\r
-#token ResetRequiredFlag("RESET_REQUIRED")      "RESET_REQUIRED"\r
-#token LateCheckFlag("LATE_CHECK")              "LATE_CHECK"\r
-#token Class("class")                           "class"\r
-#token Subclass("subclass")                     "subclass"\r
-#token TypeDef("typedef")                       "typedef"\r
-#token Restore("restore")                       "restore"\r
-#token Save("save")                             "save"\r
-#token Defaults("defaults")                     "defaults"\r
-#token Banner("banner")                         "banner"\r
-#token Align("align")                           "align"\r
-#token Left("left")                             "left"\r
-#token Right("right")                           "right"\r
-#token Center("center")                         "center"\r
-#token Line("line")                             "line"\r
-#token VarStore("varstore")                     "varstore"\r
-#token Name("name")                             "name"\r
-#token Oem("oem")                               "oem"\r
-#token True("TRUE")                             "TRUE"\r
-#token False("FALSE")                           "FALSE"\r
-#token GreaterThan(">")                         ">"\r
-#token GreaterEqual(">=")                       ">="\r
-#token LessThan("<")                          "<"\r
-#token LessEqual("<=")                        "<="\r
-\r
-//\r
-// Define the class and subclass tokens\r
-//\r
-#token ClassNonDevice("NONDEVICE")                        "NON_DEVICE"\r
-#token ClassDiskDevice("DISK_DEVICE")                     "DISK_DEVICE"\r
-#token ClassVideoDevice("VIDEO_DEVICE")                   "VIDEO_DEVICE"\r
-#token ClassNetworkDevice("NETWORK_DEVICE")               "NETWORK_DEVICE"\r
-#token ClassInputDevice("INPUT_DEVICE")                   "INPUT_DEVICE"\r
-#token ClassOnBoardDevice("ONBOARD_DEVICE")               "ONBOARD_DEVICE"\r
-#token ClassOtherDevice("OTHER_DEVICE")                   "OTHER_DEVICE"\r
-\r
-#token SubclassSetupApplication("SETUP_APPLICATION")      "SETUP_APPLICATION"\r
-#token SubclassGeneralApplication("GENERAL_APPLICATION")  "GENERAL_APPLICATION"\r
-#token SubclassFrontPage("FRONT_PAGE")                    "FRONT_PAGE"\r
-#token SubclassSingleUse("SINGLE_USE")                    "SINGLE_USE"\r
-\r
-#token LanguageIdentifier("language identifier") "[a-z][a-z][a-z]"   // 3 lowercase characters\r
-#token StringIdentifier("string identifier")    "[A-Za-z_][A-Za-z_0-9]*"\r
-#token Number("numeric value")                  "(0x[0-9A-Fa-f]+) | [0-9]+"\r
-#token OpenBrace("{")                           "\{"\r
-#token CloseBrace("}")                          "\}"\r
-#token OpenParen("(")                           "\("\r
-#token CloseParen(")")                          "\)"\r
-#token OpenBracket("[")                         "\["\r
-#token CloseBracket("]")                        "\]"\r
-\r
-//\r
-// Define all other invalid characters so that they get through the lexical phase\r
-// and we can catch them during the parse phase. We get much better error\r
-// messages then. \r
-//\r
-#token InvalidCharacters("invalid characters")  "~[;:=,\.\|]"  \r
-\r
-//\r
-// This is the overall definition of a VFR form definition script.\r
-//\r
-program :\r
-  ( dataStructDefinition )*\r
-  formSetStatement   \r
-  ( vfrStatementVarStore )*\r
-  ( formDefinition )*\r
-  EFS:EndFormSet  ";"                   << WriteOpByte (EFS->getLine(), EFI_IFR_END_FORM_SET_OP); >>\r
-  "@" // end of file\r
-  ;\r
-    \r
-formSetStatement :\r
-  FS:FormSet                            << WriteOpByte (FS->getLine(), EFI_IFR_FORM_SET_OP); >>\r
-  Guid "=" \r
-  OpenBrace \r
-  G1:Number ","\r
-  G2:Number ","\r
-  G3:Number ","\r
-  OpenBrace\r
-  G4:Number ","\r
-  G5:Number ","\r
-  G6:Number ","\r
-  G7:Number ","\r
-  G8:Number ","\r
-  G9:Number ","\r
-  G10:Number ","\r
-  G11:Number \r
-  CloseBrace\r
-  CloseBrace                            << WriteGuidValue (G1->getLine (), G1->getText (), G2->getText (), G3->getText (),\r
-                                                           G4->getText (), G5->getText (), G6->getText (), G7->getText (),\r
-                                                           G8->getText (), G9->getText (), G10->getText (), G11->getText ()\r
-                                                          );\r
-                                         >>\r
-  ","\r
-  Title "=" getStringId ","\r
-  Help  "=" getStringId ","\r
-  //\r
-  // insert padding for an EFI_PHYSICAL_ADDRESS (UINT64)\r
-  //\r
-                                            << WriteDWord (0, 0); WriteDWord (0, 0); >>\r
-  Class "=" CVAL:classDefinition ","        << WriteClass (); >>\r
-  Subclass "=" SVAL:subclassDefinition ","  << WriteSubclass (); >>\r
-                                            << WriteWord (mNvDataStructSize); >>\r
-  ;  \r
-\r
-//\r
-// A form can be of multiple classes, thus allow CLASS_A | CLASS_B | CLASS_C\r
-//\r
-classDefinition :\r
-  validClassNames ( "\|" validClassNames )*\r
-  ;\r
-  \r
-validClassNames :\r
-    CND:ClassNonDevice          << SetClass (CND->getLine(), EFI_NON_DEVICE_CLASS); >>\r
-  | CDD:ClassDiskDevice         << SetClass (CDD->getLine(), EFI_DISK_DEVICE_CLASS); >>\r
-  | CVD:ClassVideoDevice        << SetClass (CVD->getLine(), EFI_VIDEO_DEVICE_CLASS); >>\r
-  | CNW:ClassNetworkDevice      << SetClass (CNW->getLine(), EFI_NETWORK_DEVICE_CLASS); >>\r
-  | CID:ClassInputDevice        << SetClass (CID->getLine(), EFI_INPUT_DEVICE_CLASS); >>\r
-  | COB:ClassOnBoardDevice      << SetClass (COB->getLine(), EFI_ON_BOARD_DEVICE_CLASS); >>\r
-  | COD:ClassOtherDevice        << SetClass (COD->getLine(), EFI_OTHER_DEVICE_CLASS); >>\r
-  | CNUM:Number                 << SetClass (CNUM->getLine(), GetNumber (CNUM->getText(), CNUM->getLine(), 4)); >>\r
-  ; << PrintErrorMessage (LT(1)->getLine(), LT(1)->getText(), "invalid class"); >>\r
-\r
-//\r
-// A form can only be of one subclass type.\r
-//\r
-subclassDefinition :\r
-    SSA:SubclassSetupApplication    << SetSubclass (SSA->getLine(), EFI_SETUP_APPLICATION_SUBCLASS); >>\r
-  | SGA:SubclassGeneralApplication  << SetSubclass (SGA->getLine(), EFI_GENERAL_APPLICATION_SUBCLASS); >>\r
-  | SFP:SubclassFrontPage           << SetSubclass (SFP->getLine(), EFI_FRONT_PAGE_SUBCLASS); >>\r
-  | SSU:SubclassSingleUse           << SetSubclass (SSU->getLine(), EFI_SINGLE_USE_SUBCLASS); >>\r
-  | SNUM:Number                     << SetSubclass (SNUM->getLine(), GetNumber (SNUM->getText(), SNUM->getLine(), 4)); >>\r
-  ; << PrintErrorMessage (LT(1)->getLine(), LT(1)->getText(), "invalid subclass"); >>\r
-\r
-//\r
-// Parse a C type data structure for storing VFR setup data. Allow:\r
-//  typedef struct _XXX_ {\r
-//     (fields)\r
-//  } MY_NV_DATA;\r
-//\r
-dataStructDefinition :\r
-  << int IsNonNV = 0; >>\r
-  { TypeDef } \r
-  S:Struct                          \r
-  (\r
-    NonNvDataMap                    << IsNonNV = 1; >>\r
-  |\r
-    { StringIdentifier }\r
-  )                                 << StartStructDefinition (IsNonNV, S->getLine()); >>\r
-  OpenBrace \r
-  dataStructFields \r
-  CloseBrace NAME:StringIdentifier  << EndStructDefinition (NAME->getText(), NAME->getLine()); >>\r
-  ";"\r
-  ;\r
-\r
-//\r
-// Parse a C type data structure for defining data that is not stored in NV.\r
-//  typedef struct _NON_NV_DATA_MAP {\r
-//     (fields)\r
-//  } NON_NV_DATA_MAP;\r
-//\r
-nonNvDataStructDefinition :\r
-  { TypeDef } \r
-  Struct NonNvDataMap\r
-  { StringIdentifier }\r
-  OpenBrace \r
-  dataStructFields \r
-  CloseBrace NAME:StringIdentifier        << AddStructField (NAME->getText(), NAME->getLine(), 0, 0, 0); >>\r
-  ";"                                             \r
-  ;\r
-\r
-dataStructFields :\r
-  ( dataStructField64 | dataStructField32 | dataStructField16 | dataStructField8 ) *\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   UINT64 Name[4];\r
-//   UINT64 Name;\r
-//\r
-// Used while parsing the NV data map structures.\r
-//\r
-dataStructField64 :\r
-  << int ArrayLength = 1; char IsArray = 0; >>\r
-  "UINT64" \r
-  NAME:StringIdentifier \r
-  ( ";" | OpenBracket IVal:Number CloseBracket ";"  << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> ) \r
-                                                    << AddStructField (NAME->getText(), NAME->getLine(), 8, ArrayLength, IsArray); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   UINT32 Name[4];\r
-//   UINT32 Name;\r
-//\r
-// Used while parsing the NV data map structures.\r
-//\r
-dataStructField32 :\r
-  << int ArrayLength = 1; char IsArray = 0; >>\r
-  "UINT32" \r
-  NAME:StringIdentifier \r
-  ( ";" | OpenBracket IVal:Number CloseBracket ";"  << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> )  \r
-                                                    << AddStructField (NAME->getText(), NAME->getLine(), 4, ArrayLength, IsArray); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   UINT16 Name[4];\r
-//   UINT16 Name;\r
-//\r
-// Used while parsing the NV data map structures.\r
-//\r
-dataStructField16 :\r
-  << int ArrayLength = 1; char IsArray = 0; >>\r
-  ( "UINT16" | "CHAR16" )\r
-  NAME:StringIdentifier \r
-  ( ";" | OpenBracket IVal:Number CloseBracket ";"  << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> ) \r
-                                                    << AddStructField (NAME->getText(), NAME->getLine(), 2, ArrayLength, IsArray); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   UINT8 Name[4];\r
-//   UINT8 Name;\r
-//\r
-// Used while parsing the NV data map structures.\r
-//\r
-dataStructField8 :\r
-  << int ArrayLength = 1; char IsArray = 0; >>\r
-  "UINT8" \r
-  NAME:StringIdentifier \r
-  ( ";" | OpenBracket IVal:Number CloseBracket ";"  << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> ) \r
-                                                    << AddStructField (NAME->getText(), NAME->getLine(), 1, ArrayLength, IsArray); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//    form formid = 1,\r
-//      title  = STRING_TOKEN(STR_FORM_TITLE);\r
-//      -- form statements --\r
-//    endform;\r
-//\r
-//  The Form ID cannot be 0\r
-//\r
-formDefinition :\r
-  FRM:Form FormId                << WriteOpByte (FRM->getLine(), EFI_IFR_FORM_OP); >> \r
-  "=" \r
-  VAL:Number                     << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); AddFormId (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine()); >>\r
-  ","\r
-  Title "=" getStringId ";"      // writes string identifier\r
-  ( vfrStatements )*\r
-  ENDF:EndForm  ";"              << WriteOpByte (ENDF->getLine(), EFI_IFR_END_FORM_OP); >>\r
-  ;\r
-\r
-//\r
-// VFR statements in a formset\r
-//\r
-vfrStatements :\r
-  vfrStatementSubTitle        | \r
-  vfrStatementOneOf           |\r
-  vfrStatementTextText        |\r
-  vfrStatementCheckBox        |\r
-  vfrStatementNumeric         |\r
-  vfrStatementDate            |\r
-  vfrStatementTime            |\r
-  vfrStatementPassword        |\r
-  vfrStatementString          |\r
-  vfrStatementSuppressIf      |\r
-  vfrStatementHidden          |\r
-  vfrStatementGoto            | \r
-  vfrStatementGrayOutIf       |\r
-  vfrStatementInconsistentIf  |\r
-  vfrStatementLabel           |\r
-  vfrStatementBanner          |\r
-  vfrStatementInventory       |\r
-  vfrStatementOrderedList     |\r
-  vfrStatementOem             |\r
-  vfrStatementSaveRestoreDefaults\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   label 100;\r
-//\r
-vfrStatementLabel :\r
-  OPID:Label                              << WriteOpByte (OPID->getLine(), EFI_IFR_LABEL_OP); >>\r
-  VAL:Number                              << \r
-                                              WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); \r
-                                              AddLabel (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine());\r
-                                          >>\r
-  ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   oem 0x12, 0x34, 0x56;\r
-//\r
-vfrStatementOem :\r
-  OPID:Oem                              << WriteOpByte (OPID->getLine(), EFI_IFR_OEM_DEFINED_OP); >>\r
-  ( VAL1:Number << WriteByte (GetNumber (VAL1->getText(), VAL1->getLine(), 1), 0); >> )\r
-  ( "," VAL2:Number << WriteByte (GetNumber (VAL2->getText(), VAL2->getLine(), 1), 0); >> )*\r
-  ";"\r
-  ;\r
-  \r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   inconsistentif NOT .... AND NOT .... OR ... endif;\r
-//\r
-vfrStatementInconsistentIf : \r
-  << ResetFlags (); >>\r
-  IIFOP:InconsistentIf                  << WriteOpByte (IIFOP->getLine(), EFI_IFR_INCONSISTENT_IF_OP); >>\r
-  Prompt "=" getStringId ","\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* "," \r
-  }\r
-  << WriteFlags (); >> //  write the flags field\r
-  vfrBooleanExpression\r
-  EOP:EndIf ";"                         << WriteOpByte (EOP->getLine(), EFI_IFR_END_IF_OP); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-// \r
-// PARSE:\r
-//   TRUE AND (ideqval SomeStruct.SomeMember >= 0x10 OR \r
-//               ideqid SomeStruct.SomeMember < SomeStruct.SomeOtherMember) AND\r
-//            (ideqlist SomeStruct.SomeOtherMember == 0x10, 0x20, 0x30 OR\r
-//               vareqval var(VAR_EQ_TEST_NAME) == 0x1)\r
-//\r
-// For supporting complex express, divide the vfrBooleanExpression to two parts\r
-// so that pred-LL(k) parser can parse incrementally.\r
-//\r
-vfrBooleanExpression :\r
-  leftPartVfrBooleanExp { rightPartVfrBooleanExp }\r
-  ;\r
-  \r
-leftPartVfrBooleanExp :\r
-  OpenParen vfrBooleanExpression CloseParen                                                        |\r
-  (ideqval | ideqid | ideqvallist | vareqval | truefalse)                                          |\r
-  NOPID:NOT leftPartVfrBooleanExp           << WriteOpByte (NOPID->getLine(), EFI_IFR_NOT_OP); >>\r
-  ;\r
-\r
-rightPartVfrBooleanExp :\r
-  AOPID:AND vfrBooleanExpression            << WriteOpByte (AOPID->getLine(), EFI_IFR_AND_OP); >>  |\r
-  OOPID:OR vfrBooleanExpression             << WriteOpByte (OOPID->getLine(), EFI_IFR_OR_OP); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   TRUE\r
-//\r
-truefalse :\r
-  TOPID:True                                << WriteOpByte (TOPID->getLine(), EFI_IFR_TRUE_OP); >> |\r
-  FOPID:False                               << WriteOpByte (FOPID->getLine(), EFI_IFR_FALSE_OP); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   varstore MY_STRUCT_NAME, key = 0x1234, name = "MyVariableName", guid = {...};\r
-//\r
-vfrStatementVarStore : \r
-  OP:VarStore                           << WriteOpByte (OP->getLine(), EFI_IFR_VARSTORE_OP); >>\r
-  STRUCT_NAME:StringIdentifier ","\r
-  Key   "=" KNUM:Number ","\r
-  Name  "=" VAR_NAME:StringIdentifier ","  \r
-  Guid "=" \r
-  OpenBrace \r
-  G1:Number ","\r
-  G2:Number ","\r
-  G3:Number ","\r
-  OpenBrace\r
-  G4:Number ","\r
-  G5:Number ","\r
-  G6:Number ","\r
-  G7:Number ","\r
-  G8:Number ","\r
-  G9:Number ","\r
-  G10:Number ","\r
-  G11:Number \r
-  CloseBrace\r
-  CloseBrace                            << WriteGuidValue (G1->getLine (), G1->getText (), G2->getText (), G3->getText (),\r
-                                                           G4->getText (), G5->getText (), G6->getText (), G7->getText (),\r
-                                                           G8->getText (), G9->getText (), G10->getText (), G11->getText ()\r
-                                                          );\r
-                                           WriteWord (GetNumber (KNUM->getText(), KNUM->getLine(), 2)); \r
-                                           AddVarStore (STRUCT_NAME->getText(), VAR_NAME->getText(), GetNumber (KNUM->getText(), KNUM->getLine(), 2), STRUCT_NAME->getLine());\r
-                                         >>\r
-  \r
-  ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:  \r
-//   vareqval var(0x100) == 0x20\r
-//\r
-vareqval : \r
-  OPID:VarEqVal                           << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_VAR_VAL_OP); >>\r
-  Var OpenParen \r
-  VAR:Number                              << WriteWord (GetNumber (VAR->getText(), VAR->getLine(), 2)); >>\r
-  CloseParen\r
-  compareNumber\r
-  ;\r
-\r
-ideqval : \r
-  OPID:IdEqVal                            << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_VAL_OP); >>\r
-  vfrStructFieldName[0]\r
-  compareNumber\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   ideqid MyNVData3.Field16A == MyNVData3.Field16B\r
-//\r
-// NOTE: Before processing the second variable store in the ideqid statement, set a global flag\r
-//       so that when we parse the second variable we set the secondary variable store id.\r
-//\r
-ideqid : \r
-  OPID:IdEqId                             << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_ID_OP);  >>\r
-  vfrStructFieldName[0]\r
-  compareVfrStructFieldNameNL0\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// compareNumber is the combination of compare operation and Number\r
-//\r
-compareNumber :\r
-  (\r
-  "=="\r
-  VAL1:Number                             << WriteWord (GetNumber (VAL1->getText(), VAL1->getLine(), 2)); >>\r
-  ) |\r
-  (\r
-  GTOPID:GreaterThan\r
-  VAL2:Number                             << WriteWord (GetNumber (VAL2->getText(), VAL2->getLine(), 2));\r
-                                             WriteOpByte (GTOPID->getLine(), EFI_IFR_GT_OP); >>\r
-  ) |\r
-  (\r
-  GEOPID:GreaterEqual\r
-  VAL3:Number                             << WriteWord (GetNumber (VAL3->getText(), VAL3->getLine(), 2));\r
-                                             WriteOpByte (GEOPID->getLine(), EFI_IFR_GE_OP); >>\r
-  ) |\r
-  (\r
-  LTOPID:LessThan\r
-  VAL4:Number                             << WriteWord (GetNumber (VAL4->getText(), VAL4->getLine(), 2));\r
-                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_GE_OP);\r
-                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_NOT_OP); >>\r
-  ) |\r
-  (\r
-  LEOPID:LessEqual\r
-  VAL5:Number                             << WriteWord (GetNumber (VAL5->getText(), VAL5->getLine(), 2));\r
-                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_GT_OP);\r
-                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_NOT_OP); >>\r
-  )\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// compareVfrStructFieldNameNL0 is the combination of compare operation and  vfrStructFieldNameNL[0]\r
-//\r
-compareVfrStructFieldNameNL0 :\r
-  (\r
-  "=="                                    << mIdEqIdStmt = 1; >>\r
-  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0; >>\r
-  ) |\r
-  (\r
-  GTOPID:GreaterThan                      << mIdEqIdStmt = 1; >>\r
-  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;\r
-                                             WriteOpByte (GTOPID->getLine(), EFI_IFR_GT_OP); >>\r
-  ) |\r
-  (\r
-  GEOPID:GreaterEqual                     << mIdEqIdStmt = 1; >>\r
-  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;\r
-                                             WriteOpByte (GEOPID->getLine(), EFI_IFR_GE_OP); >>\r
-  ) |\r
-  (\r
-  LTOPID:LessThan                       << mIdEqIdStmt = 1; >>\r
-  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;\r
-                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_GE_OP);\r
-                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_NOT_OP); >>\r
-  ) |\r
-  (\r
-  LEOPID:LessEqual                      << mIdEqIdStmt = 1; >>\r
-  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;\r
-                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_GT_OP);\r
-                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_NOT_OP); >>\r
-  )\r
-  ;\r
-  \r
-\r
-ideqvallist : \r
-  OPID:IdEqValList                        << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_LIST_OP); >>\r
-  vfrStructFieldName[0] \r
-  "=="\r
-  ( VAL:Number                            << QueueIdEqValList (GetNumber (VAL->getText(), VAL->getLine(), 2)); >> ) +\r
-                                          << FlushQueueIdEqValList(); >>\r
-  ;\r
-    \r
-vfrStatementGoto : \r
-  << UINT32 LineNum, KeyValue = 0; ResetFlags (); >>\r
-  IDG:Goto                          << WriteOpByte (IDG->getLine(), EFI_IFR_REF_OP); >>\r
-  VAL:Number  ","                   << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); \r
-                                       AddGotoReference (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine());\r
-                                    >>\r
-  KP:Prompt   "=" getStringId ","   << LineNum = KP->getLine();  >>\r
-  Help        "=" getStringId\r
-  { \r
-    "," \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )*  << LineNum = FF->getLine(); >>\r
-  }\r
-  {\r
-    "," Key   "=" KNUM:Number       << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>\r
-  }\r
-                                    << WriteFlagsKey (KeyValue, LineNum); >>\r
-  ";"\r
-  ;\r
-    \r
-vfrStatementHidden : \r
-  IDH:Hidden                  << WriteOpByte (IDH->getLine(), EFI_IFR_HIDDEN_OP); >>\r
-  Value "="\r
-  VAL:Number ","              << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); >>\r
-  Key "="\r
-  KVAL:Number                 << WriteWord (GetNumber (KVAL->getText(), KVAL->getLine(), 2)); >>\r
-  ";"\r
-  ;    \r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   suppressif <boolean_expression> { grayoutif } <statements>+ endif;\r
-// Note:\r
-//   You can have: suppressif:grayoutif:statements:endif\r
-//                 suppressif:grayoutif:endif                  -- serves no purpose\r
-//                 suppressif:statements:endif\r
-//                 suppressif:endif                            -- serves no purpose\r
-//\r
-vfrStatementSuppressIf : \r
-  << ResetFlags (); >>\r
-  OPID:SuppressIf                     << WriteOpByte (OPID->getLine(), EFI_IFR_SUPPRESS_IF_OP); SetIfStart (OPID->getLine()); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* ","\r
-  }\r
-  << WriteFlags (); >> //  write the flags field \r
-  vfrBooleanExpression\r
-  ";"\r
-  { suppressIfGrayOutIf } ( suppressIfAndGrayoutIfSubstatements )+\r
-  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>\r
-  ;\r
-\r
-//\r
-// This is the form for a grayoutif nested in a suppressif statement\r
-//\r
-suppressIfGrayOutIf :\r
-  << ResetFlags (); >>\r
-  OPID:GrayOutIf                      << WriteOpByte (OPID->getLine(), EFI_IFR_GRAYOUT_IF_OP); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* "," \r
-  }\r
-  << WriteFlags (); >> //  write the flags field\r
-  vfrBooleanExpression\r
-  ";"\r
-  ; \r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   grayoutif { flags = n, } <boolean_expression> endif;\r
-// Note:\r
-//   You can have: grayoutif:suppressif:statements:endif\r
-//                 grayoutif:statements:endif\r
-//\r
-//\r
-vfrStatementGrayOutIf :\r
-  << ResetFlags (); >>\r
-  OPID:GrayOutIf                      << WriteOpByte (OPID->getLine(), EFI_IFR_GRAYOUT_IF_OP); SetIfStart (OPID->getLine()); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* "," \r
-  }\r
-  << WriteFlags (); >> //  write the flags field\r
-  vfrBooleanExpression\r
-  ";"\r
-  { grayoutIfSuppressIf } ( suppressIfAndGrayoutIfSubstatements )+ \r
-  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>\r
-  ;\r
-\r
-//\r
-// This is the format for a suppressif nested in a grayoutif\r
-//\r
-grayoutIfSuppressIf : \r
-  << ResetFlags (); >>\r
-  OPID:SuppressIf                     << WriteOpByte (OPID->getLine(), EFI_IFR_SUPPRESS_IF_OP); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* ","\r
-  }\r
-  << WriteFlags (); >> //  write the flags field\r
-  vfrBooleanExpression\r
-  ";"\r
-  ;\r
-\r
-//\r
-// These are the VFR statements that are valid inside a suppressif or grayoutif statement.\r
-//\r
-suppressIfAndGrayoutIfSubstatements :\r
-  vfrStatementOneOf           |\r
-  vfrStatementTextText        |\r
-  vfrStatementCheckBox        |\r
-  vfrStatementNumeric         |\r
-  vfrStatementDate            |\r
-  vfrStatementTime            |\r
-  vfrStatementPassword        |\r
-  vfrStatementString          |\r
-  vfrStatementHidden          |\r
-  vfrStatementGoto            | \r
-  vfrStatementLabel           |\r
-  vfrStatementInventory       |\r
-  vfrStatementOrderedList     |\r
-  vfrStatementSaveRestoreDefaults\r
-  ; \r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//    password  varid    = MyNvData.Password,\r
-//              prompt   = STRING_TOKEN(STR_PASSWORD_PROMPT),\r
-//              help     = STRING_TOKEN(STR_PASSWORD_HELP),\r
-//              minsize  = 6,\r
-//              maxsize  = 20,\r
-//              encoding = 1,\r
-//    endpassword; \r
-  \r
-vfrStatementPassword : \r
-  << UINT32 KeyValue = 0; UINT32 LineNum; ResetFlags (); >>\r
-  IDPW:Password                       << WriteOpByte (IDPW->getLine(), EFI_IFR_PASSWORD_OP); >>\r
-  VarId       "=" vfrStructFieldNameArray[0] ","\r
-  Prompt      "=" getStringId ","\r
-  KH:Help     "=" getStringId ","    << LineNum = KH->getLine(); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* ","  << LineNum = FF->getLine(); >>\r
-  }\r
-  {\r
-    Key "=" KNUM:Number ","           << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>\r
-  }\r
-                                      << WriteFlagsKey (KeyValue, LineNum); >>\r
-  MinSize   "=" MIN:Number ","        << WriteByte (GetNumber (MIN->getText(), MIN->getLine(), 1), 0); >>\r
-  MaxSize   "=" MAX:Number ","        << WriteByte (GetNumber (MAX->getText(), MAX->getLine(), 1), 0); >>\r
-  Encoding  "=" ENC:Number ","        << WriteWord (GetNumber (ENC->getText(), ENC->getLine(), 2)); >>\r
-  EndPassword  ";"              \r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-//  PARSE:\r
-//\r
-//    string    varid    = MyNv.String,\r
-//              prompt   = STRING_TOKEN(STR_STRING_PROMPT),\r
-//              help     = STRING_TOKEN(STR_STRING_HELP),\r
-//              flags    = INTERACTIVE,\r
-//              key      = 0x1234,\r
-//              minsize  = 6,\r
-//              maxsize  = 0x14,\r
-//    endstring; \r
-//\r
-// Since flags and key are optional, we can't use Flags->getLine(). Therefore for error\r
-// reporting we save the line number of the "help" keyword.\r
-//\r
-vfrStatementString : \r
-  << unsigned int KeyValue = 0; UINT32 LineNum; ResetFlags (); >>\r
-  IDS:String                                << WriteOpByte (IDS->getLine(), EFI_IFR_STRING_OP); >>\r
-  VarId     "=" vfrStructFieldNameArray[0] ","\r
-  Prompt    "=" getStringId ","\r
-  KH:Help   "=" getStringId ","             << LineNum = KH->getLine(); >>\r
-  { \r
-    FF:Flags "=" \r
-    flagsField ( "\|" flagsField )*         << LineNum = FF->getLine(); >>\r
-    "," \r
-  }\r
-  {\r
-    Key "=" KNUM:Number ","                 << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>\r
-  }\r
-                                            << WriteFlagsKey (KeyValue, LineNum); >>\r
-  MinSize   "=" MIN:Number ","              << WriteByte (GetNumber (MIN->getText(), MIN->getLine(), 1), 0);  >>\r
-  MaxSize   "=" MAX:Number ","              << WriteByte (GetNumber (MAX->getText(), MAX->getLine(), 1), 0); >>\r
-  EndString  ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//    numeric varid   = MyIfrNVData.HowOldAreYouInYears, \r
-//            prompt  = STRING_TOKEN(STR_NUMERIC_PROMPT),\r
-//            help    = STRING_TOKEN(STR_NUMERIC_HELP),\r
-//            flags   = INTERACTIVE,  // flags is optional\r
-//            key     = 0x1234,       // key is optional if (flags & INTERACTIVE = 0)\r
-//            minimum = 0x0,\r
-//            maximum = 0xf0,\r
-//            step    = 1,            // step is option, and step=1 if not specified\r
-//            default = 0;            // default is optional, and default=minimum if not specified\r
-//    endnumeric;\r
-//\r
-// Make flags and key optional. However if flags includes INTERACTIVE, then a key is required.\r
-// That check is done in WriteFlagsKey() function.\r
-//\r
-vfrStatementNumeric :  \r
-  << UINT32 LineNum, KeyValue = 0; ResetFlags (); >>\r
-  IDN:Numeric                         << WriteOpByte (IDN->getLine(), EFI_IFR_NUMERIC_OP); >>\r
-  VarId     "=" vfrStructFieldName[2] ","\r
-  Prompt    "=" getStringId ","\r
-  KH:Help   "=" getStringId ","       << LineNum = KH->getLine(); >>\r
-  { \r
-    FF:Flags "=" flagsField ( "\|" flagsField )* ","     << LineNum = FF->getLine (); >>\r
-  }\r
-  {\r
-    Key "=" KNUM:Number  ","          << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>\r
-  }\r
-                                      << WriteFlagsKey (KeyValue, LineNum); >>\r
-  minMaxStepDefault                   \r
-  EndNumeric ";"                      << WriteMinMaxStepDefault (); >>\r
-  ;\r
-\r
-//\r
-// Parse minimum/maximum/step/default statements. Special cases:\r
-//   - if step not specified, then the value is 1\r
-//   - if default not specified, then the value is the min value specified\r
-//   - if max < min, print a warning and swap the values (changes default too)\r
-//\r
-minMaxStepDefault :\r
-  << InitMinMaxStepDefault (); >>\r
-  Minimum   "=" MIN:Number ","        << SetMinMaxStepDefault (GetNumber (MIN->getText(),  MIN->getLine(), 2), 0, MIN->getLine()); >>\r
-  Maximum   "=" MAX:Number ","        << SetMinMaxStepDefault (GetNumber (MAX->getText(),  MAX->getLine(), 2), 1, MAX->getLine()); >>\r
-  { Step    "=" STEP:Number ","       << SetMinMaxStepDefault (GetNumber (STEP->getText(), STEP->getLine(), 2), 2, STEP->getLine()); >> }\r
-  { Default "=" DEF:Number ","        << SetMinMaxStepDefault (GetNumber (DEF->getText(),  DEF->getLine(), 2), 3, DEF->getLine()); >> }\r
-  ;\r
-\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//    date    year varid  = Date.Year,                        // "Date.Year" is a special case we recognize\r
-//            prompt      = STRING_TOKEN(STR_DATE_PROMPT),\r
-//            help        = STRING_TOKEN(STR_DATE_YEAR_HELP),\r
-//            minimum     = 1939,\r
-//            maximum     = 2101,\r
-//            step        = 1,\r
-//            default     = 1964,\r
-//\r
-//            month varid = Date.Month,    \r
-//            prompt      = STRING_TOKEN(STR_DATE_PROMPT),\r
-//            help        = STRING_TOKEN(STR_DATE_MONTH_HELP),\r
-//            minimum     = 1,\r
-//            maximum     = 12,\r
-//            step        = 1,\r
-//            default     = 1,\r
-//\r
-//            day varid   = Date.Day,\r
-//            prompt      = STRING_TOKEN(STR_DATE_PROMPT),\r
-//            help        = STRING_TOKEN(STR_DATE_DAY_HELP),\r
-//            minimum     = 1,\r
-//            maximum     = 31,\r
-//            step        = 0x1,\r
-//            default     = 1,\r
-//\r
-//    enddate;\r
-//  \r
-vfrStatementDate :  \r
-  Date                            \r
-  IDY:Year VarId "="                  << WriteOpByte (IDY->getLine(), EFI_IFR_DATE_OP); >>\r
-  vfrStructFieldName[2] "," \r
-  dateTimeSubStatement                    \r
-  IDM:Month VarId "="                 << WriteOpByte (IDM->getLine(), EFI_IFR_DATE_OP); >>\r
-  vfrStructFieldName[2] "," \r
-  dateTimeSubStatement                    \r
-  IDD:Day VarId "="                   << WriteOpByte (IDD->getLine(), EFI_IFR_DATE_OP); >> \r
-  vfrStructFieldName[2] ","  \r
-  dateTimeSubStatement    \r
-  EndDate ";"\r
-  ;\r
-  \r
-vfrStatementTime :  \r
-  Time                            \r
-  IDH:Hour VarId "="                  << WriteOpByte (IDH->getLine(), EFI_IFR_TIME_OP); >>\r
-  vfrStructFieldName[2] ","  \r
-  dateTimeSubStatement                    \r
-  IDM:Minute VarId "="                << WriteOpByte (IDM->getLine(), EFI_IFR_TIME_OP); >>\r
-  vfrStructFieldName[2] "," \r
-  dateTimeSubStatement                    \r
-  IDS:Second VarId "="                << WriteOpByte (IDS->getLine(), EFI_IFR_TIME_OP); >>\r
-  vfrStructFieldName[2] "," \r
-  dateTimeSubStatement\r
-  EndTime ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   text  text = STRING_ID;\r
-//   text  text = STRING_ID, text = STRING_ID;\r
-//   text  text = STRING_ID, text = STRING_ID, flags = x, key = y;\r
-//\r
-vfrStatementTextText :\r
-  << ResetFlags (); >>\r
-  IDT:Text                            << WriteOpByte (IDT->getLine(), EFI_IFR_TEXT_OP); >>\r
-  Help "=" getStringId ","\r
-  Text "=" \r
-  getStringId                         // writes string identifier\r
-  { "," Text "=" getStringId\r
-    "," Flags "=" flagsField ( "\|" flagsField )*  << WriteFlags (); >>\r
-    "," \r
-    Key "=" KNUM:Number               << WriteWord (GetNumber(KNUM->getText(), KNUM->getLine(), 2)); >>\r
-  }\r
-  ";" \r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   inventory help = ID, text = ID;\r
-//   inventory help = ID, text = id, text = ID;\r
-//\r
-vfrStatementInventory :\r
-  IDI:Inventory                        << WriteOpByte (IDI->getLine(), EFI_IFR_INVENTORY_OP); >>\r
-  Help        "=" getStringId ","\r
-  Text        "=" getStringId                 // writes string identifier\r
-  { "," Text  "=" getStringId\r
-  }\r
-  ";" \r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//    restore defaults,\r
-//      formid  = 4,\r
-//      prompt  = STRING_TOKEN(STR_RESTORE_DEFAULTS_PROMPT),\r
-//      help    = STRING_TOKEN(STR_RESTORE_DEFAULTS_HELP),\r
-//      flags   = 0,\r
-//      key     = 0;\r
-//\r
-//    save defaults,\r
-//      formid  = 4,\r
-//      prompt  = STRING_TOKEN(STR_SAVE_DEFAULTS_PROMPT),\r
-//      help    = STRING_TOKEN(STR_SAVE_DEFAULTS_HELP),\r
-//      flags   = 0,\r
-//      key     = 0;\r
-//\r
-vfrStatementSaveRestoreDefaults : \r
-  << unsigned int KeyValue = 0; UINT32 LineNum; ResetFlags (); >>\r
-  ( IDS:Save                            << WriteOpByte (IDS->getLine(), EFI_IFR_SAVE_DEFAULTS_OP); >>\r
-  | IDR:Restore                         << WriteOpByte (IDR->getLine(), EFI_IFR_RESTORE_DEFAULTS_OP); >>\r
-  )\r
-  Defaults ","\r
-  FormId    "=" FRMID:Number  ","       << WriteWord (GetNumber (FRMID->getText(), FRMID->getLine(), 2)); \r
-                                           AddGotoReference (GetNumber (FRMID->getText(), FRMID->getLine(), 2), FRMID->getLine());\r
-                                        >>\r
-  Prompt    "=" getStringId ","\r
-  KH:Help   "=" getStringId             << LineNum = KH->getLine(); >>\r
-  { \r
-    "," FF:Flags "=" flagsField ( "\|" flagsField )*  << LineNum = FF->getLine(); >>\r
-  }\r
-  {\r
-    "," Key "=" KNUM:Number             << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>\r
-  }\r
-                                        << WriteFlagsKey (KeyValue, LineNum); >>\r
-  ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   flags = 0x10 | DEFAULT | MANUFACTURING | INTERACTIVE | NV_ACCESS | RESET_REQUIRED | LATE_CHECK\r
-//\r
-// \r
-flagsField :\r
-  VAL:Number                          << SetFlags (GetNumber(VAL->getText(), VAL->getLine(), 4), VAL->getLine()); >>\r
-  | IF:InteractiveFlag                << SetFlags (EFI_IFR_FLAG_INTERACTIVE, IF->getLine());    >>\r
-  | MF:ManufacturingFlag              << SetFlags (EFI_IFR_FLAG_MANUFACTURING, MF->getLine());  >>\r
-  | DF:DefaultFlag                    << SetFlags (EFI_IFR_FLAG_DEFAULT, DF->getLine());        >>\r
-  | NV:NVAccessFlag                   << SetFlags (EFI_IFR_FLAG_NV_ACCESS, NV->getLine());      >>\r
-  | RR:ResetRequiredFlag              << SetFlags (EFI_IFR_FLAG_RESET_REQUIRED, RR->getLine()); >>\r
-  | LC:LateCheckFlag                  << SetFlags (EFI_IFR_FLAG_LATE_CHECK, LC->getLine());     >>\r
-  ;\r
-\r
-dateTimeSubStatement :\r
-  Prompt  "=" getStringId ","\r
-  Help    "=" getStringId ","\r
-                                      << WriteByte (0, 0); WriteWord (0); >> // bogus flags and key\r
-  minMaxStepDefault                   << WriteMinMaxStepDefault (); >>\r
-  ;\r
-  \r
-vfrStatementCheckBox :  \r
-  << UINT32 LineNum, KeyValue = 0; ResetFlags (); >>\r
-  IDCB:CheckBox                       << WriteOpByte (IDCB->getLine(), EFI_IFR_CHECKBOX_OP); >>\r
-  VarId     "=" vfrStructFieldName[1] ","\r
-  Prompt    "=" getStringId ","\r
-  Help      "=" getStringId ","\r
-  FF:Flags  "=" flagsField ( "\|" flagsField )*  "," << LineNum = FF->getLine(); >>\r
-  { \r
-    Key "=" KV:Number  ","           << LineNum = KV->getLine(); KeyValue = GetNumber(KV->getText(), LineNum, 2); >>\r
-  }\r
-                                     << WriteFlagsKey (KeyValue, LineNum); >>\r
-  EndCheckBox ";"\r
-  ;\r
-     \r
-vfrStatementSubTitle :\r
-  IDS:Subtitle Text "="               << WriteOpByte (IDS->getLine(), EFI_IFR_SUBTITLE_OP); >>\r
-  getStringId                         // writes string indentifier\r
-  ";"\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//    banner \r
-//      title = STRING_TOKEN(STR_BANNER_TITLE),\r
-//      line  1,\r
-//      align center;     // or left or right\r
-//\r
-//    banner, \r
-//      title = STRING_TOKEN(STR_BANNER_TITLE), timeout = 100;\r
-//\r
-vfrStatementBanner :\r
-  IDB:Banner { "," }                    << WriteOpByte (IDB->getLine(), EFI_IFR_BANNER_OP); >>\r
-  Title "=" getStringId ","\r
-  ( \r
-    Line VAL:Number ","                 << WriteWord (GetNumber(VAL->getText(), VAL->getLine(), 2)); >>\r
-    Align \r
-    ( Left                              << WriteByte (EFI_IFR_BANNER_ALIGN_LEFT, 0); >>\r
-    | Center                            << WriteByte (EFI_IFR_BANNER_ALIGN_CENTER, 0); >>\r
-    | Right                             << WriteByte (EFI_IFR_BANNER_ALIGN_RIGHT, 0); >>\r
-    ) ";"\r
-  |\r
-    Timeout "=" TO:Number ";"           << WriteWord (GetNumber(TO->getText(), TO->getLine(), 2)); >>\r
-                                        << WriteByte (EFI_IFR_BANNER_TIMEOUT, 0); >>\r
-  )\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   oneof  varid       = MyNv.OneOfData,\r
-//          prompt      = STRING_TOKEN(STR_ONE_OF_PROMPT),\r
-//          help        = STRING_TOKEN(STR_ONE_OF_HELP),\r
-//          option text = STRING_TOKEN(STR_ONE_OF_TEXT), \r
-//          value       = 0, \r
-//          flags       = DEFAULT | INTERACTIVE;\r
-//\r
-// supressif/grayoutif are supported inside oneof stmt.\r
-// We do not restrict the number of oneOfOptionText to >=2, but >=1.\r
-// The situation that all oneOfOptionText are suppressed is also possiable.\r
-//\r
-vfrStatementOneOf :\r
-  << ResetFlags (); >>\r
-  IDOO:OneOf                              << WriteOpByte (IDOO->getLine(), EFI_IFR_ONE_OF_OP); >>\r
-  VarId   "=" vfrStructFieldName[2] ","       \r
-  Prompt  "=" getStringId  ","           // writes string identifier\r
-  Help    "=" getStringId  ","           // writes string identifier\r
-  ( oneOfOptionText )+                   // there must be at least 1 option to be choosed, not 2.\r
-  IDEOO:EndOneOf   ";"                    << TestOneOfFlags (IDEOO->getLine()); WriteOpByte (IDEOO->getLine(), EFI_IFR_END_ONE_OF_OP); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//  \r
-//   orderedlist  varid       = MyNv.OrderedListData,\r
-//                prompt      = STRING_TOKEN(STR_ORDERED_LIST_PROMPT),\r
-//                help        = STRING_TOKEN(STR_ORDERED_LIST_HELP),  \r
-//                option text = STRING_TOKEN(STR_ORDERED_LIST_TEXT), value = 0, flags = INTERACTIVE;\r
-//                -- additional option text -- \r
-//   endlist;\r
-//\r
-vfrStatementOrderedList :\r
-  << ResetFlags (); InitOrderedList(); >>\r
-  IDOL:OrderedList                       << WriteOpByte (IDOL->getLine(), EFI_IFR_ORDERED_LIST_OP); >>\r
-  VarId   "=" vfrStructFieldNameArray[1] ","       \r
-  Prompt  "=" getStringId  ","           // writes string identifier\r
-  Help    "=" getStringId  ","           // writes string identifier\r
-  orderedListOptionText ( orderedListOptionText )+\r
-  IDEOL:EndList   ";"                    << WriteOpByte (IDEOL->getLine(), EFI_IFR_END_OP); EndOrderedList(IDEOL->getLine()); >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   option text = STRING_TOKEN(STRING_ID), value = 0 flags = 99;\r
-//\r
-// Differs from the oneOfOptionText in that we don't allow the DEFAULT flag to\r
-// be set, and value cannot be 0.\r
-//\r
-orderedListOptionText :\r
-  << UINT32 KeyValue = 0; >>\r
-  IDO:Option                          << WriteOpByte (IDO->getLine(), EFI_IFR_ONE_OF_OPTION_OP); >>\r
-  Text      "=" getStringId ","       // writes string identifier\r
-  Value     "=" WVAL:Number ","       << \r
-                                          if (GetNumber(WVAL->getText(), WVAL->getLine(), 2) == 0) {\r
-                                            PrintErrorMessage (WVAL->getLine(), "value=0 is invalid for ordered lists", NULL); \r
-                                          } else {\r
-                                            WriteWord (GetNumber(WVAL->getText(), WVAL->getLine(), 2)); \r
-                                          }\r
-                                      >>\r
-  FF:Flags  "=" orderedListFlagsField  \r
-                ("\|" orderedListFlagsField )*                   \r
-  { \r
-    "," Key "=" KV:Number             << KeyValue = GetNumber (KV->getText(), KV->getLine(), 2); >> \r
-  }\r
-                                      << WriteFlagsKey (KeyValue, FF->getLine()); >>\r
-  ";"                                 << mOptionCount++; >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   flags = 0x10 | DEFAULT | MANUFACTURING | INTERACTIVE | NV_ACCESS | RESET_REQUIRED | LATE_CHECK\r
-//\r
-// The ordered list flags field cannot have a default.\r
-//\r
-orderedListFlagsField :\r
-  VAL:Number                          << SetFlags (GetNumber(VAL->getText(), VAL->getLine(), 4), VAL->getLine()); >>\r
-  | IF:InteractiveFlag                << SetFlags (EFI_IFR_FLAG_INTERACTIVE, IF->getLine());    >>\r
-  | MF:ManufacturingFlag              << SetFlags (EFI_IFR_FLAG_MANUFACTURING, MF->getLine());  >>\r
-  | NV:NVAccessFlag                   << SetFlags (EFI_IFR_FLAG_NV_ACCESS, NV->getLine());      >>\r
-  | RR:ResetRequiredFlag              << SetFlags (EFI_IFR_FLAG_RESET_REQUIRED, RR->getLine()); >>\r
-  | LC:LateCheckFlag                  << SetFlags (EFI_IFR_FLAG_LATE_CHECK, LC->getLine());     >>\r
-  | DF:DefaultFlag                    << PrintWarningMessage (DF->getLine(), "DEFAULT flag not valid for ordered lists", NULL); >>\r
-  ;\r
-\r
-//\r
-// Parse references to VFR structure field names of form "MyNvStructure.Field". \r
-// This implementation is specific to strings, passwords, and references in an \r
-// ordered list statement because we want to specify the size of the entire \r
-// field, rather than just one element. Then call a function to write out its \r
-// offset and length.\r
-//\r
-vfrStructFieldNameArray[int FieldWidth] :\r
-  << int ArrayIndex = 1; char IsArrayIndex = 0; >>\r
-  SName:StringIdentifier \r
-  "." \r
-  SFieldName:StringIdentifier \r
-  { OpenBracket AIndex:Number CloseBracket << ArrayIndex = GetNumber(AIndex->getText(), AIndex->getLine(), 4); IsArrayIndex = 1; >> }\r
-            << \r
-                WriteFieldOffset (1, \r
-                                  SName->getText(), \r
-                                  SName->getLine(), \r
-                                  SFieldName->getText(), \r
-                                  SFieldName->getLine(),\r
-                                  ArrayIndex, \r
-                                  IsArrayIndex,\r
-                                  FieldWidth,\r
-                                  1\r
-                                  ); \r
-            >>\r
-  ;\r
-\r
-//\r
-// Parse references to VFR structure field names of form "MyNvStructure.Field",\r
-// then call a function to write out its offset and length.\r
-//\r
-vfrStructFieldName[int FieldWidth] :\r
-  << int ArrayIndex = 1; char IsArrayIndex = 0; >>\r
-  SName:StringIdentifier \r
-  "." \r
-  SFieldName:StringIdentifier \r
-  { OpenBracket AIndex:Number CloseBracket << ArrayIndex = GetNumber(AIndex->getText(), AIndex->getLine(), 4); IsArrayIndex = 1; >> }\r
-            << \r
-                WriteFieldOffset (1, \r
-                                  SName->getText(), \r
-                                  SName->getLine(), \r
-                                  SFieldName->getText(), \r
-                                  SFieldName->getLine(),\r
-                                  ArrayIndex, \r
-                                  IsArrayIndex,\r
-                                  FieldWidth,\r
-                                  0\r
-                                  ); \r
-            >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//\r
-//   MyNvStructure.FieldName[4]\r
-//\r
-// Parse references to VFR structure field names of form "MyNvStructure.Field",\r
-// then call a function to write out the offset with no length.\r
-//\r
-vfrStructFieldNameNL[int FieldWidth] :\r
-  << int ArrayIndex = 1; char IsArrayIndex = 0; >>\r
-  SName:StringIdentifier \r
-  "." \r
-  SFieldName:StringIdentifier \r
-  { OpenBracket AIndex:Number CloseBracket   << ArrayIndex = GetNumber(AIndex->getText(), AIndex->getLine(), 4); IsArrayIndex = 1; >> }\r
-            << \r
-                WriteFieldOffset (0, \r
-                                  SName->getText(), \r
-                                  SName->getLine(), \r
-                                  SFieldName->getText(), \r
-                                  SFieldName->getLine(),\r
-                                  ArrayIndex, \r
-                                  IsArrayIndex,\r
-                                  FieldWidth,\r
-                                  0\r
-                                  ); \r
-            >>\r
-  ;\r
-\r
-//*****************************************************************************\r
-//\r
-// PARSE:\r
-//   suppressif TRUE OR FALSE;\r
-//   grayoutif FALSE OR TRUE;\r
-//     option text = STRING_TOKEN(STRING_ID), value = 0 flags = 99;\r
-//     option text = STRING_TOKEN(STRING_ID2), value = 1 flags = 98;\r
-//   endif;\r
-//\r
-oneOfOptionText :\r
-  suppressIfOptionText    |\r
-  grayOutIfOptionText     |\r
-  commonOptionText\r
-  ;\r
-\r
-suppressIfOptionText : \r
-  << ResetFlags (); >>\r
-  OPID:SuppressIf                     << WriteOpByte (OPID->getLine(), EFI_IFR_SUPPRESS_IF_OP); SetIfStart (OPID->getLine()); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* ","\r
-  }\r
-  << WriteFlags (); >> //  write the flags field \r
-  vfrBooleanExpression\r
-  ";"\r
-  { suppressIfGrayOutIf } ( commonOptionText )+\r
-  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>\r
-  ;\r
-\r
-grayOutIfOptionText :\r
-  << ResetFlags (); >>\r
-  OPID:GrayOutIf                      << WriteOpByte (OPID->getLine(), EFI_IFR_GRAYOUT_IF_OP); SetIfStart (OPID->getLine()); >>\r
-  { \r
-    FF:Flags  "=" flagsField ( "\|" flagsField )* "," \r
-  }\r
-  << WriteFlags (); >> //  write the flags field\r
-  vfrBooleanExpression\r
-  ";"\r
-  { grayoutIfSuppressIf } ( commonOptionText )+ \r
-  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>\r
-  ;\r
-\r
-commonOptionText : \r
-  << UINT32 KeyValue = 0; >>\r
-  IDO:Option                      << WriteOpByte (IDO->getLine(), EFI_IFR_ONE_OF_OPTION_OP); >>\r
-  Text      "=" getStringId ","   // writes string identifier\r
-  Value     "=" WVal:Number ","   << WriteWord (GetNumber(WVal->getText(), WVal->getLine(), 2)); >>\r
-  FF:Flags  "=" flagsField  ("\|" flagsField )*                   \r
-  { \r
-    "," Key "=" KV:Number         << KeyValue = GetNumber (KV->getText(), KV->getLine(), 2); >> \r
-  }\r
-                                  << WriteFlagsKey (KeyValue, FF->getLine()); >>\r
-  ";"                             << mOptionCount++; >>\r
-  ;\r
-\r
-//\r
-// Gets a string identifier. It must be a numeric value of form:\r
-// \r
-//   STRING_TOKEN(100)\r
-//\r
-getStringId :\r
-  << unsigned short StrId; >>\r
-  StringToken OpenParen\r
-  IdVal:Number             << StrId = GetNumber (IdVal->getText(), IdVal->getLine(), 2); WriteStringIdWord (StrId); >> \r
-  CloseParen\r
-  ;\r
-\r
-//******************************************************************************\r
-//\r
-// Parser class definition. \r
-//  \r
-class EfiVfrParser {\r
-<<\r
-//\r
-// Parser definitions go here    \r
-//\r
-private:\r
-  STRUCT_DEFINITION   *mFirstStructDefinition;\r
-  STRUCT_DEFINITION   *mLastStructDefinition;\r
-  INT32               mNvDataStructSize;                    \r
-  INT32               mNonNvDataStructSize;\r
-  //\r
-  // Flag to indicate that we're processing a ideqid VFR statement so that\r
-  // we can do late checks on the statement.\r
-  //\r
-  INT32               mIdEqIdStmt;\r
-  INT32               mLastNVVariableDataSize;\r
-  GOTO_REFERENCE      *mGotoReferences;\r
-  FORM_ID_VALUE       *mFormIdValues;\r
-  VfrOpcodeHandler    mOpcodeHandler;\r
-  UINT16_LIST         *mUint16List;\r
-  UINT16_LIST         *mLastUint16;\r
-  UINT16_LIST         *mDefinedLabels;\r
-  UINT16_LIST         *mDefinedVarStoreId;\r
-  UINT16_LIST         *mLastDefinedVarStoreId;\r
-  UINT32              mMinimumValue, mMaximumValue, mStepValue, mDefaultValue;\r
-  UINT32              mStmtFlags;\r
-  UINT32              mSubStmtFlags;\r
-  UINT32              mSubStmtFlagsLineNum;\r
-  EFI_GUID            mFormSetGuid;\r
-  UINT8               mNvDataStructDefined;\r
-  UINT16              mClass, mSubclass;\r
-  UINT32              mIfStart;\r
-  UINT32              mOptionCount;  // how many "option" fields in a given statement\r
-  UINT32              mLastVarIdSize;\r
-  UINT8               mOutput;\r
-public:        \r
-\r
-VOID \r
-SetIfStart (\r
-  UINT32 LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Invoked during VFR parsing when an "if" is encountered. Save the\r
-  source line number so we can point to it if we don't find a \r
-  corresponding endif later.\r
-\r
-Arguments:\r
-  LineNum - source line number where the "if" was parsed.\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  mIfStart = LineNum;\r
-}\r
-VOID \r
-SetClass (\r
-  UINT32 LineNum, \r
-  UINT32 Value\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  Invoked during VFR parsing when a "class" statement is found. Check the\r
-  range on the class value and save it for later.\r
-\r
-Arguments:\r
-  LineNum - source line number where the class statement was parsed.\r
-  Value   - the class value\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  if (Value & 0xFFFF0000) {\r
-    PrintWarningMessage (LineNum, NULL, "class value exceeds maximum allowed");\r
-  }\r
-  mClass |= (UINT16)Value;\r
-}\r
-VOID \r
-SetSubclass (\r
-  UINT32 LineNum, \r
-  UINT32 Value\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  Invoked during VFR parsing when a subclass statement is found. Check the\r
-  range on the value and save it for later.\r
-\r
-Arguments:\r
-  LineNum - source line number where the class statement was parsed.\r
-  Value   - the subclass value from the VFR statement\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  if (Value & 0xFFFF0000) {\r
-    PrintWarningMessage (LineNum, NULL, "subclass value exceeds maximum allowed");\r
-  }\r
-  mSubclass |= (UINT16)Value;\r
-}\r
-VOID WriteClass ()\r
-{\r
-  WriteWord (mClass);\r
-  mClass = 0;\r
-}\r
-VOID WriteSubclass ()\r
-{\r
-  WriteWord (mSubclass);\r
-  mSubclass = 0;\r
-}\r
-VOID WriteIfrBytes ()\r
-{\r
-  mOpcodeHandler.WriteIfrBytes ();\r
-}\r
-VOID \r
-WriteFlagsKey (\r
-  UINT32 KeyValue, \r
-  UINT32 LineNum\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  Write out the flags and key values from the previous VFR statement.\r
-  Many statements take a flags/key pair. If not specified, then 0\r
-  values are written out. However do not allow an interactive flags field\r
-  to be specified if no key value is specified. Also, if NV_ACCESS flag\r
-  is set but INTERACTIVE is not, then set interactive and issue a warning.\r
-\r
-Arguments:\r
-  KeyValue  - the key value from the VFR statement\r
-  LineNum   - source line number where the statement was parsed\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  if ((mSubStmtFlags & EFI_IFR_FLAG_INTERACTIVE) && (KeyValue == 0)) {\r
-    PrintErrorMessage (LineNum, NULL, "invalid or missing key value - required with INTERACTIVE");\r
-  }\r
-  if ((mSubStmtFlags & EFI_IFR_FLAG_NV_ACCESS) && !(mSubStmtFlags & EFI_IFR_FLAG_INTERACTIVE)) {\r
-    PrintWarningMessage (LineNum, NULL, "NV_ACCESS without INTERACTIVE has no effect -- setting INTERACTIVE");\r
-    mSubStmtFlags |= EFI_IFR_FLAG_INTERACTIVE;\r
-  }\r
-  WriteFlags ();\r
-  WriteWord (KeyValue);\r
-}\r
-VOID \r
-InitOrderedList ()\r
-{\r
-  mOptionCount = 0;\r
-}  \r
-VOID \r
-EndOrderedList (\r
-  UINT32 LineNum\r
-  )\r
-{\r
-  if (mLastVarIdSize < mOptionCount) {\r
-    PrintErrorMessage (LineNum, NULL, "number of options exceeds the variable store size");\r
-  }\r
-}\r
-VOID \r
-ResetFlags ()\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Flags are set for each substatement in a given one-of statement.\r
-  To make sure there are no conflicts, for example setting DEFAULT on\r
-  more than one substatement, we keep track of the flags at a statement\r
-  level and a substatement level. This function resets the flags so \r
-  we get a fresh start.\r
-\r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  mStmtFlags = 0;\r
-  mSubStmtFlagsLineNum = 0;\r
-  mSubStmtFlags = 0;\r
-}\r
-//\r
-// Test validity of flags value for a one-of statement.\r
-//\r
-VOID \r
-TestOneOfFlags (\r
-  UINT32 LineNum\r
-  ) \r
-{\r
-  //\r
-  // One of the fields must have had the default bit set\r
-  //\r
-  if ((mStmtFlags & EFI_IFR_FLAG_DEFAULT) == 0) {\r
-    PrintWarningMessage (LineNum, "default value must be specified", NULL);\r
-  }\r
-}\r
-VOID \r
-SetFlags (\r
-  UINT32 Flags, \r
-  UINT32 LineNum\r
-  ) \r
-{\r
-  //\r
-  // Check for redefinitions and invalid combinations\r
-  //\r
-  if (mStmtFlags & Flags & EFI_IFR_FLAG_MANUFACTURING) {\r
-    PrintErrorMessage (LineNum, "MANUFACTURING", "a field with this flag already defined");\r
-  }\r
-  if (mStmtFlags & Flags & EFI_IFR_FLAG_DEFAULT) {\r
-    PrintErrorMessage (LineNum, "DEFAULT", "a field with this flag already defined");\r
-  }\r
-  mSubStmtFlags |= Flags;\r
-  mSubStmtFlagsLineNum = LineNum;\r
-}\r
-VOID \r
-WriteFlags ()\r
-{\r
-  //\r
-  // Check value for validity\r
-  //\r
-  if (mSubStmtFlags & ~(EFI_IFR_FLAG_DEFAULT | \r
-                        EFI_IFR_FLAG_MANUFACTURING | \r
-                        EFI_IFR_FLAG_INTERACTIVE | \r
-                        EFI_IFR_FLAG_NV_ACCESS | \r
-                        EFI_IFR_FLAG_RESET_REQUIRED | \r
-                        EFI_IFR_FLAG_LATE_CHECK )) {\r
-    PrintWarningMessage (mSubStmtFlagsLineNum, "invalid bits defined in flag", NULL);\r
-  }\r
-  WriteByte ((UINT8)mSubStmtFlags, 'F');\r
-  //\r
-  // We can now clear the substatement flags\r
-  //\r
-  mStmtFlags |= mSubStmtFlags;\r
-  mSubStmtFlags = 0;\r
-}\r
-//\r
-// When we parse a min/max/step/default sequence, save off the values for\r
-// later use. Call this first to init the values.\r
-//\r
-VOID \r
-InitMinMaxStepDefault ()\r
-{\r
-  mMinimumValue         = 0;\r
-  mMaximumValue         = 0;\r
-  mStepValue            = 1;\r
-  mDefaultValue         = 0;\r
-}  \r
-VOID \r
-WriteMinMaxStepDefault ()\r
-{\r
-  WriteWord (mMinimumValue);\r
-  WriteWord (mMaximumValue);\r
-  WriteWord (mStepValue);\r
-  WriteWord (mDefaultValue);\r
-}  \r
-VOID \r
-SetMinMaxStepDefault (\r
-  UINT16  Value, \r
-  INT32   MMSD, \r
-  INT32   LineNum\r
-  ) \r
-{\r
-  UINT16 TempValue;\r
-  //\r
-  // Min specified\r
-  //\r
-  if (MMSD == 0) {\r
-    mMinimumValue = Value;\r
-    mDefaultValue = Value;\r
-  //\r
-  // Max specified\r
-  //\r
-  } else if (MMSD == 1) {\r
-    mMaximumValue = Value;\r
-    //\r
-    // If min > max, then swap the values. That includes resetting the default\r
-    // value as well.\r
-    //\r
-    if (mMinimumValue > mMaximumValue) {\r
-      PrintWarningMessage (LineNum, NULL, "maximum < minimum");      \r
-      TempValue = Value;\r
-      mMaximumValue = mMinimumValue;\r
-      mMinimumValue = TempValue;\r
-      mDefaultValue = mMinimumValue;\r
-    }\r
-  //\r
-  // Step specified\r
-  //\r
-  } else if (MMSD == 2) { \r
-    mStepValue = Value;\r
-  //\r
-  // Default specified. Make sure min <= default <= max.\r
-  //\r
-  } else if (MMSD == 3) {\r
-    mDefaultValue = Value;\r
-    if (mMinimumValue > Value) {\r
-      PrintErrorMessage (LineNum, NULL, "default value < minimum value");\r
-    } else if (Value > mMaximumValue) {\r
-      PrintErrorMessage (LineNum, NULL, "default value > maximum value");\r
-    }\r
-  } else {\r
-    PrintErrorMessage (LineNum, "application error", "internal MMSD error");    \r
-  }\r
-}\r
-VOID \r
-AddLabel (\r
-  UINT32 LabelNumber, \r
-  UINT32 LineNum\r
-  ) \r
-{\r
-  UINT16_LIST *Label;\r
-\r
-  //\r
-  // Added a label from the user VFR script. Make sure they haven't already \r
-  // defined the same label elsewhere\r
-  //\r
-  for (Label = mDefinedLabels; Label != NULL; Label = Label->Next) {\r
-    if (Label->Value == LabelNumber) {\r
-      PrintErrorMessage (LineNum, NULL, "label already defined");\r
-      PrintErrorMessage (Label->LineNum, NULL, "previous definition of redefined label");\r
-      break;\r
-    }\r
-  }\r
-  Label = (UINT16_LIST *)malloc (sizeof (UINT16_LIST));\r
-  if (Label == NULL) {\r
-    PrintErrorMessage (0, NULL, "memory allocation error");\r
-    return;\r
-  }\r
-  memset ((char *)Label, 0, sizeof (UINT16_LIST));\r
-  Label->Value = LabelNumber;\r
-  Label->LineNum = LineNum;\r
-  Label->Next = mDefinedLabels;\r
-  mDefinedLabels = Label;\r
-}\r
-VOID \r
-QueueIdEqValList (\r
-  UINT16 Value\r
-  )\r
-{\r
-  UINT16_LIST   *U16;\r
-  \r
-  U16 = (UINT16_LIST *)malloc (sizeof (UINT16_LIST));\r
-  if (U16 == NULL) {\r
-    Error (PROGRAM_NAME, 0, 0, NULL, "memory allocation failed");\r
-  } else {\r
-    memset ((char *)U16, 0, sizeof (UINT16_LIST));\r
-    U16->Value = Value;\r
-    if (mUint16List == NULL) {\r
-      mUint16List = U16;\r
-    } else {\r
-      mLastUint16->Next = U16;\r
-    } \r
-    mLastUint16 = U16;\r
-  }\r
-}    \r
-VOID \r
-FlushQueueIdEqValList ()\r
-{\r
-  UINT32 Count;\r
-  \r
-  //\r
-  // We queued up a list of IdEqValList items. The IFR requires a count\r
-  // followed by the actual values. Do it.\r
-  //\r
-  Count = 0;\r
-  mLastUint16 = mUint16List;\r
-  while (mLastUint16 != NULL) {\r
-    Count++;\r
-    mLastUint16 = mLastUint16->Next;\r
-  }\r
-  // BUGBUG -- check for more than 16K items?\r
-  WriteWord (Count);\r
-  //\r
-  // Now write the values.\r
-  //\r
-  mLastUint16 = mUint16List;\r
-  while (mLastUint16 != NULL) {\r
-    WriteWord ((UINT32)mLastUint16->Value);\r
-    mLastUint16 = mLastUint16->Next;\r
-  }\r
-  //\r
-  // Free up the list\r
-  //  \r
-  mLastUint16 = mUint16List;\r
-  while (mUint16List != NULL) {\r
-    mLastUint16 = mUint16List->Next;\r
-    free (mUint16List);\r
-    mUint16List = mLastUint16;\r
-  }\r
-}\r
-VOID \r
-PrintErrorMessage (\r
-  UINT32              LineNum,\r
-  CHAR8               *Msg1,\r
-  CHAR8               *Msg2\r
-  )\r
-{\r
-  char *FileName;\r
-  \r
-  if (LineNum != 0) {\r
-    FileName = ConvertLineNumber ((UINT32 *)&LineNum);\r
-    Error (FileName, LineNum, 0, Msg1, Msg2);\r
-  } else {\r
-    Error (PROGRAM_NAME, 0, 0, Msg1, Msg2);\r
-  }\r
-}\r
-VOID \r
-PrintWarningMessage (\r
-  UINT32              LineNum,\r
-  CHAR8               *Msg1,\r
-  CHAR8               *Msg2\r
-  )\r
-{\r
-  char *FileName;\r
-  \r
-  if (LineNum != 0) {\r
-    FileName = ConvertLineNumber ((UINT32 *)&LineNum);\r
-    Warning (FileName, LineNum, 0, Msg1, Msg2);\r
-  } else {\r
-    Warning (PROGRAM_NAME, 0, 0, Msg1, Msg2);\r
-  }\r
-}\r
-VOID \r
-syn (\r
-  ANTLRAbstractToken  *Tok, \r
-  ANTLRChar           *Egroup, \r
-  SetWordType         *Eset, \r
-  ANTLRTokenType      ETok, \r
-  INT32               Huh\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Called by the parser base class as a result of parse syntax errors.\r
-\r
-Arguments:\r
-  Tok     - token that caused the error\r
-  Egroup  - not sure\r
-  Eset    - index in token table of the expected token\r
-  Huh     - not sure\r
-\r
-Returns:\r
-  NA\r
-\r
---*/\r
-{\r
-  char    *FileName;\r
-  UINT32  LineNum;\r
-  \r
-  LineNum = Tok->getLine ();\r
-  FileName = ConvertLineNumber ((UINT32 *)&LineNum);\r
-  //\r
-  // Sometimes the token number is 0, in which case I don't know what to\r
-  // print.\r
-  //\r
-  if (ETok == 0) {\r
-    Error (FileName, LineNum, 0, Tok->getText (), "unexpected token");\r
-  } else {\r
-    //\r
-    // If we were expecting an endif, then report the line where the corresponding\r
-    // IF began.\r
-    //\r
-    if ((strcmp (_token_tbl[ETok], "endif") == 0) && (mIfStart != 0)) {\r
-      LineNum = mIfStart;\r
-      FileName = ConvertLineNumber (&LineNum);\r
-      Error (FileName, LineNum, 0, "statement missing corresponding endif", NULL);\r
-    } else {\r
-      Error (FileName, LineNum, 0, Tok->getText (), "expected %s", _token_tbl[ETok]);\r
-    }\r
-  }\r
-}\r
-\r
-VOID \r
-init()        \r
-/*++\r
-\r
-Routine Description:\r
-  Initializations function for our parser.\r
-\r
-Arguments:\r
-  None.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  ANTLRParser::init();\r
-\r
-  //\r
-  // Used for queuing a variable list of UINT16's\r
-  //\r
-  mUint16List               = NULL;\r
-  mLastUint16               = NULL;\r
-  mFirstStructDefinition    = NULL;\r
-  mLastStructDefinition     = NULL;\r
-  mNvDataStructSize         = 0;\r
-  mNonNvDataStructSize      = 0;\r
-  mNvDataStructDefined      = 0;\r
-  mGotoReferences           = NULL;\r
-  mFormIdValues             = NULL;\r
-  mDefinedLabels            = NULL;\r
-  mClass                    = 0;\r
-  mSubclass                 = 0;\r
-  mIfStart                  = 0;\r
-  mDefinedVarStoreId        = NULL;\r
-  mLastDefinedVarStoreId    = NULL;\r
-  mIdEqIdStmt               = 0;\r
-  mLastNVVariableDataSize   = 0;\r
-    \r
-  memset ((char *)&mFormSetGuid, 0, sizeof (EFI_GUID));\r
-}\r
-//\r
-// Destructor for the parser.\r
-//\r
-~EfiVfrParser(VOID)\r
-{\r
-  Cleanup();\r
-}\r
-VOID\r
-Cleanup (VOID)\r
-/*++\r
-\r
-Routine Description:\r
-  Free memory allocated during parsing\r
-\r
-Arguments:\r
-  None.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  STRUCT_DEFINITION         *NextStruct;\r
-  STRUCT_FIELD_DEFINITION   *NextField;\r
-  UINT8                     Buff[6];\r
-  UINT16_LIST               *NextU16List;\r
-  \r
-  //\r
-  // Free up the structure definitions if any\r
-  //\r
-  while (mFirstStructDefinition != NULL) {\r
-    //\r
-    // Free up all the fields for this struct\r
-    //\r
-    while (mFirstStructDefinition->Field != NULL) {\r
-      NextField = mFirstStructDefinition->Field->Next;\r
-      free (mFirstStructDefinition->Field->Name);\r
-      free (mFirstStructDefinition->Field);\r
-      mFirstStructDefinition->Field = NextField;\r
-    }\r
-    NextStruct = mFirstStructDefinition->Next;\r
-    free (mFirstStructDefinition->Name);\r
-    free (mFirstStructDefinition);\r
-    mFirstStructDefinition = NextStruct;\r
-  }\r
-  //\r
-  // Free up the goto references and form id defines\r
-  //\r
-  FreeGotoReferences ();\r
-  //\r
-  // Free up label list\r
-  //\r
-  while (mDefinedLabels != NULL) {\r
-    NextU16List = mDefinedLabels->Next;\r
-    delete (mDefinedLabels);\r
-    mDefinedLabels = NextU16List;\r
-  }\r
-  //\r
-  // Free up the list of defined variable storage IDs\r
-  //\r
-  while (mDefinedVarStoreId != NULL) {\r
-    NextU16List = mDefinedVarStoreId->Next;\r
-    delete (mDefinedVarStoreId);\r
-    mDefinedVarStoreId = NextU16List;\r
-  }\r
-}\r
-\r
-INT32 \r
-AtoX (\r
-  CHAR8   *HexString, \r
-  INT32   NumBytes, \r
-  UINT32  *HexValue\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Given a pointer to a ascii hex string, convert to a number with the given\r
-  number of bytes.\r
-\r
-Arguments:\r
-  HexString   - pointer to a string of format 30BCA\r
-  Size        - number of bytes to convert\r
-  HexValue    - return result\r
-\r
-Returns:\r
-  The number of bytes converted.\r
-\r
---*/\r
-{\r
-  INT32 Count;\r
-  INT32 Value;\r
-\r
-  *HexValue = 0;\r
-  Count = 0;\r
-  while (Count < NumBytes) {\r
-    if ((*HexString >= '0') && (*HexString <= '9')) {\r
-      Value = *HexString - '0';\r
-    } else if ((*HexString >= 'a') && (*HexString <= 'f')) {\r
-      Value = *HexString - 'a' + 10;\r
-    } else if ((*HexString >= 'A') && (*HexString <= 'F')) {\r
-      Value = *HexString - 'A' + 10;\r
-    } else {\r
-      return Count;\r
-    }\r
-    HexString++;\r
-    *HexValue = (*HexValue << 4) | Value;\r
-    if ((*HexString >= '0') && (*HexString <= '9')) {\r
-      Value = *HexString - '0';\r
-    } else if ((*HexString >= 'a') && (*HexString <= 'f')) {\r
-      Value = *HexString - 'a' + 10;\r
-    } else if ((*HexString >= 'A') && (*HexString <= 'F')) {\r
-      Value = *HexString - 'A' + 10;\r
-    } else {\r
-      return Count;\r
-    }\r
-    *HexValue = (*HexValue << 4) | Value;\r
-    HexString++;\r
-    Count++;\r
-  }\r
-  return Count;\r
-}\r
-VOID \r
-WriteGuidValue (\r
-  UINT32       TokenLineNum,\r
-  CHAR8        *G1, \r
-  CHAR8        *G2,\r
-  CHAR8        *G3,\r
-  CHAR8        *G4,\r
-  CHAR8        *G5,\r
-  CHAR8        *G6,\r
-  CHAR8        *G7,\r
-  CHAR8        *G8,\r
-  CHAR8        *G9,\r
-  CHAR8        *G10,\r
-  CHAR8        *G11\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  A Guid was parsed, likely of format:\r
-  #define MY_GUID { 0x12345678, 0xAABB, 0xCCDD, 0xEE, 0xFF, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }\r
-\r
-  Write out the value.\r
-\r
-Arguments:\r
-  TokenLineNum   - line number where the guid was used\r
-  G1-G11         - the 11 fields of the guid value\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  UINT32        Value;\r
-  INT32         Loop;\r
-\r
-  mFormSetGuid.Data1 = GetNumber (G1, TokenLineNum, 4);\r
-  mFormSetGuid.Data2 = (UINT16)GetNumber (G2, TokenLineNum, 2);\r
-  mFormSetGuid.Data3 = (UINT16)GetNumber (G3, TokenLineNum, 2);\r
-  mFormSetGuid.Data4[0] = (UINT8)GetNumber (G4, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[1] = (UINT8)GetNumber (G5, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[2] = (UINT8)GetNumber (G6, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[3] = (UINT8)GetNumber (G7, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[4] = (UINT8)GetNumber (G8, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[5] = (UINT8)GetNumber (G9, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[6] = (UINT8)GetNumber (G10, TokenLineNum, 1);\r
-  mFormSetGuid.Data4[7] = (UINT8)GetNumber (G11, TokenLineNum, 1);\r
-  \r
-  WriteDWord (mFormSetGuid.Data1, 'G');\r
-  WriteWord (mFormSetGuid.Data2);\r
-  WriteWord (mFormSetGuid.Data3);\r
-  WriteByte (mFormSetGuid.Data4[0], 0);\r
-  WriteByte (mFormSetGuid.Data4[1], 0);\r
-  WriteByte (mFormSetGuid.Data4[2], 0);\r
-  WriteByte (mFormSetGuid.Data4[3], 0);\r
-  WriteByte (mFormSetGuid.Data4[4], 0);\r
-  WriteByte (mFormSetGuid.Data4[5], 0);\r
-  WriteByte (mFormSetGuid.Data4[6], 0);\r
-  WriteByte (mFormSetGuid.Data4[7], 0);\r
-}\r
-VOID \r
-WriteFieldOffset (\r
-  INT8    WriteLength,\r
-  CHAR8   *StructName, \r
-  INT32   LineNum1, \r
-  CHAR8   *FieldName, \r
-  INT32   LineNum2,\r
-  INT32   ArrayIndex,\r
-  INT8    IsArrayIndex,\r
-  INT32   FieldWidth,\r
-  INT8    WriteArraySize\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  A VFR script referenced the NV store structure. Given the structure's name\r
-  and the field's name, write the offset of the field to the output file.\r
-\r
-Arguments:\r
-  WriteLength     - write the field length byte out\r
-  StructName      - name of the NV store structure\r
-  LineNum1        - line number in the VFR where we are (for error printing)\r
-  FieldName       - the name of the field within the NV store structure\r
-  LineNum2        - line number in the VFR where FieldName is referenced \r
-  ArrayIndex      - the index specified, for example NV_DATA.Field[ArrayIndex]\r
-  IsArrayIndex    - non-zero if an array index was specified\r
-  FieldWidth      - expected size for the Field (1 byte? 2 bytes?)\r
-  WriteArraySize  - write the size of the entire field, not the size of a single element\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  STRUCT_DEFINITION         *StructDef;\r
-  STRUCT_FIELD_DEFINITION   *FieldDef;\r
-  UINT32                    Offset;\r
-  UINT32                    VarSize;\r
-  CHAR8                     Msg[100];\r
-  //\r
-  // If we're writing an array size, then they better have referenced the field without an\r
-  // index. \r
-  //\r
-  if (WriteArraySize && IsArrayIndex) {\r
-    sprintf (Msg, "array index specified where an array is required");\r
-    PrintErrorMessage (LineNum2, FieldName, Msg);\r
-    return;\r
-  }\r
-  //\r
-  // Look through our list of known structures for a match\r
-  //\r
-  for (StructDef = mFirstStructDefinition; StructDef != NULL; StructDef = StructDef->Next) {\r
-    //\r
-    // Check for matching structure name\r
-    //\r
-    if (strcmp (StructDef->Name, StructName) == 0) {\r
-      //\r
-      // Mark it as referenced (for debug purposes only). Check the\r
-      // flag that indicates that we have already found a varstore VFR\r
-      // statement for it.\r
-      //\r
-      StructDef->Referenced++;\r
-      if (StructDef->VarStoreIdValid == 0) {\r
-        //\r
-        // Set it valid so we don't flag it multiple times, then emit the error\r
-        //\r
-        StructDef->VarStoreIdValid = 1;\r
-        PrintErrorMessage (LineNum1, StructName, "varstore statement missing for this variable store");\r
-      }\r
-      //\r
-      // Let the opcode-handler know which variable storage we're now using\r
-      //\r
-      if (mIdEqIdStmt) {\r
-        mOpcodeHandler.SetSecondaryVarStoreId (StructDef->VarStoreId);\r
-      } else {\r
-        mOpcodeHandler.SetVarStoreId (StructDef->VarStoreId);\r
-      }\r
-      //\r
-      // Found matching structure name. Now find the matching field name\r
-      //\r
-      for (FieldDef = StructDef->Field; FieldDef != NULL; FieldDef = FieldDef->Next) {\r
-        if (strcmp (FieldDef->Name, FieldName) == 0) {\r
-          //\r
-          // Make sure the variable size is valid\r
-          //\r
-          if ((FieldWidth != 0) && (FieldDef->DataSize > FieldWidth)) {\r
-            sprintf (Msg, "field width exceeds %d byte%c", FieldWidth, FieldWidth == 1 ? ' ' : 's');\r
-            PrintErrorMessage (LineNum2, FieldName, Msg);\r
-          }\r
-          //\r
-          // If they specified an index (MyVfrData.FieldX[10]), then make sure that the\r
-          // data structure was declared as an array, and that the index is in bounds.\r
-          // If they did not specify an index, then we'll assume 0. This is required for\r
-          // strings.\r
-          //\r
-          if (IsArrayIndex) {\r
-            VarSize = FieldDef->DataSize;\r
-            if (FieldDef->IsArray == 0) {\r
-              PrintErrorMessage (LineNum2, FieldName, "field is not declared as an array");\r
-              return;\r
-            }\r
-            if (FieldDef->ArrayLength < ArrayIndex) {\r
-              PrintErrorMessage (LineNum2, FieldName, "array index exceeds declared size of field");\r
-              return;\r
-            }\r
-          } else {\r
-            if (FieldDef->IsArray) {\r
-              VarSize = FieldDef->DataSize * FieldDef->ArrayLength;\r
-            } else {\r
-              VarSize = FieldDef->DataSize;\r
-            }\r
-          }\r
-          //\r
-          // If we're in the middle of a ideqid VFR statement, then this is the second\r
-          // variable ID that we're now processing. Make sure that its size is the same\r
-          // as the first variable.\r
-          // \r
-          if (mIdEqIdStmt) {\r
-            if (mLastVarIdSize != VarSize) {\r
-              PrintErrorMessage (LineNum2, FieldName, "variables must have the same size");\r
-              return;\r
-            }\r
-          }\r
-          mLastVarIdSize = VarSize;\r
-          //\r
-          // If we're supposed to write an array size, then require it to be an array\r
-          //\r
-          if (WriteArraySize && !FieldDef->IsArray) {\r
-            PrintErrorMessage (LineNum2, FieldName, "array required");\r
-            return;\r
-          }\r
-          //\r
-          // Write the variable offset and size. If we're in the non-NV structure, then\r
-          // set the offset beyond the NV data structure size.\r
-          //\r
-          Offset = FieldDef->Offset + FieldDef->DataSize * (ArrayIndex - 1);\r
-          if (StructDef->IsNonNV) Offset += mNvDataStructSize; \r
-          WriteWord (Offset);\r
-          if (WriteLength) {\r
-            if (WriteArraySize) {\r
-              if (FieldDef->DataSize * FieldDef->ArrayLength > 255) {\r
-                PrintErrorMessage (LineNum2, FieldName, "array size exceeds 255 maximum encoding limit");\r
-                return;\r
-              }\r
-              WriteByte (FieldDef->DataSize * FieldDef->ArrayLength, 0);\r
-            } else {\r
-              WriteByte (FieldDef->DataSize, 0);\r
-            }\r
-          }\r
-          return;\r
-        }\r
-      }\r
-      sprintf (Msg, "structure %s does not have a field named '%s'", StructName, FieldName);\r
-      PrintErrorMessage (LineNum2, Msg, NULL);\r
-      PrintErrorMessage (StructDef->LineNum, "see structure definition", NULL);\r
-      return;\r
-    }\r
-  }\r
-  //\r
-  // The structure was not found in the defined list. See if it's the "Date" structure\r
-  //\r
-  if (strcmp (StructName, "Date") == 0) {\r
-    //\r
-    // BUGBUG -- remove support for Date and Time as valid structure \r
-    // names. They should use the NON_NV_DATA_MAP structure for this.\r
-    //\r
-    // Someone specified Date.Years|Months|Days\r
-    // BUGBUG -- define some constants for the IDs used here\r
-    // Length == 0 implies that this is not user NV data storage.\r
-    //\r
-    if (strcmp (FieldName, "Year") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 0);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else if (strcmp (FieldName, "Month") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 2);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else if (strcmp (FieldName, "Day") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 4);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else {\r
-      PrintErrorMessage (LineNum1, FieldName, "expected valid field name TheYear/TheMonth/TheDay");\r
-    }\r
-    return;\r
-  } else if (strcmp (StructName, "Time") == 0) {\r
-    //\r
-    // Someone specified Time.Hours|Minutes|Seconds\r
-    // BUGBUG -- define some constants for the IDs used here\r
-    //\r
-    if (strcmp (FieldName, "Hours") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 6);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else if (strcmp (FieldName, "Minutes") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 8);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else if (strcmp (FieldName, "Seconds") == 0) {\r
-      //\r
-      // Write ID (offset), ID, and size\r
-      //\r
-      WriteWord (mNvDataStructSize + mNonNvDataStructSize + 10);\r
-      if (WriteLength) {\r
-        WriteByte (0, 0);\r
-      }\r
-    } else {\r
-      PrintErrorMessage (LineNum1, FieldName, "expected valid field name Hours/Minutes/Seconds");\r
-    }\r
-    return;\r
-  } else {\r
-    PrintErrorMessage (LineNum1, StructName, "undefined structure");\r
-    return;\r
-  }\r
-}\r
-VOID\r
-StartStructDefinition (\r
-  INT32  IsNonNV,\r
-  INT32  LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Called when we encounter a new "struct _MY_STRUCT..." statement while parsing. \r
-  Initialize internal data and structures for parsing the fields of the structure.\r
-\r
-Arguments:\r
-  LineNum  - line number in the source file (for error reporting purposes)\r
-  IsNonNv  - flag indicating (if nonzero) that the variable referred to is not in\r
-             the standard NV store.\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  STRUCT_DEFINITION *StructDef;\r
-  //\r
-  // Allocate memory for the structure record\r
-  //\r
-  StructDef = (STRUCT_DEFINITION *)malloc (sizeof (STRUCT_DEFINITION));\r
-  memset (StructDef, 0, sizeof (STRUCT_DEFINITION));\r
-  StructDef->LineNum = LineNum;\r
-  //\r
-  // Set flag indicating non-NV data structure or not\r
-  //\r
-  StructDef->IsNonNV = IsNonNV;\r
-  //\r
-  // Add it to the end of our linked list. If it's the first one\r
-  // defined, then it's the default varstore ID, so set it valid.\r
-  //\r
-  if (mFirstStructDefinition == NULL) {\r
-    mFirstStructDefinition = StructDef;\r
-    StructDef->VarStoreIdValid = 1;\r
-  } else {\r
-    mLastStructDefinition->Next = StructDef;\r
-  }\r
-  mLastStructDefinition = StructDef;\r
-}\r
-VOID\r
-EndStructDefinition (\r
-  CHAR8  *StructName,\r
-  INT32  LineNum\r
-  )\r
-{\r
-  STRUCT_DEFINITION         *StructDef;\r
-  STRUCT_FIELD_DEFINITION   *FieldDef;\r
-  UINT32                    Offset;\r
-  //\r
-  // Make sure they have not already defined a structure with this name\r
-  //\r
-  for (StructDef = mFirstStructDefinition; StructDef != NULL; StructDef = StructDef->Next) {\r
-    if ((StructDef->Name != NULL) && (strcmp (StructDef->Name, StructName) == 0)) {\r
-      PrintErrorMessage (LineNum, StructName, "structure with this name already defined");\r
-      //\r
-      // Fall through and fill in the rest of the structure information. We do\r
-      // this because the structure has already been added to our global list,\r
-      // so will be used elsewhere, so we want it to contain valid fields.\r
-      //\r
-    }\r
-  }    \r
-  //\r
-  // Allocate memory for the structure name \r
-  //\r
-  mLastStructDefinition->Name = (char *)malloc (strlen (StructName) + 1);\r
-  strcpy (mLastStructDefinition->Name, StructName);\r
-  //\r
-  // Compute the structure size, and the offsets to each field\r
-  //\r
-  Offset = 0;\r
-  for (FieldDef = mLastStructDefinition->Field; FieldDef != NULL; FieldDef = FieldDef->Next) {\r
-    FieldDef->Offset = Offset;\r
-    Offset += FieldDef->ArrayLength * FieldDef->DataSize;\r
-  }\r
-  mLastStructDefinition->Size = Offset;\r
-  //\r
-  // Go through all the structure we have so far and figure out (if we can)\r
-  // the size of the non-NV storage. We also assume that the first structure\r
-  // definition is the primary/default storage for the VFR form.\r
-  //\r
-  if (mNonNvDataStructSize == 0) {\r
-    for (StructDef = mFirstStructDefinition; StructDef != NULL; StructDef = StructDef->Next) {\r
-      if (StructDef->IsNonNV) {\r
-        mNonNvDataStructSize = StructDef->Size;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  if (mNvDataStructSize == 0) {\r
-    for (StructDef = mFirstStructDefinition; StructDef != NULL; StructDef = StructDef->Next) {\r
-      if (StructDef->IsNonNV == 0) {\r
-        mNvDataStructSize = StructDef->Size;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-}\r
-VOID \r
-AddStructField (\r
-  CHAR8   *FieldName, \r
-  INT32   LineNum, \r
-  INT32   DataSize,\r
-  INT32   ArrayLength,\r
-  INT8    IsArray\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  We're parsing the VFR structure definition. Add another defined field to \r
-  our definition.\r
-\r
-Arguments:\r
-  FieldName   - name of the field in the structure.\r
-  LineNum     - the line number from the input (preprocessor output) file\r
-  DataSize    - the size of the field (1, 2, or 4 bytes)\r
-  ArrayLength - the number of elements (for array)\r
-  IsArray     - non-zero if the field is an array\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  STRUCT_FIELD_DEFINITION *FieldDef;\r
-  STRUCT_FIELD_DEFINITION *Temp;\r
-  //\r
-  // Make sure we don't already have a field of this name in our structure\r
-  //\r
-  for (FieldDef = mLastStructDefinition->Field; FieldDef != NULL; FieldDef = FieldDef->Next) {\r
-    if (strcmp (FieldDef->Name, FieldName) == 0) {\r
-      PrintErrorMessage (LineNum, FieldName, "field with this name already defined");\r
-      return;\r
-    }\r
-  } \r
-  //\r
-  // If it's an array, then they better not have a size of 0. For example:\r
-  //   UINT8 MyBytes[0];\r
-  //\r
-  if (IsArray && (ArrayLength <= 0)) {\r
-    PrintErrorMessage (LineNum, FieldName, "invalid array size");\r
-    return;\r
-  }    \r
-  //\r
-  // Allocate memory for a new structure field definition\r
-  //    \r
-  FieldDef = (STRUCT_FIELD_DEFINITION *)malloc (sizeof (STRUCT_FIELD_DEFINITION));\r
-  memset ((char *)FieldDef, 0, sizeof (STRUCT_FIELD_DEFINITION));\r
-  FieldDef->ArrayLength  = ArrayLength;\r
-  FieldDef->DataSize     = DataSize;\r
-  FieldDef->IsArray      = IsArray;\r
-  FieldDef->Name = (char *)malloc (strlen (FieldName) + 1);\r
-  strcpy (FieldDef->Name, FieldName);\r
-  //\r
-  // Add it to the end of the field list for the currently active structure\r
-  //\r
-  if (mLastStructDefinition->Field == NULL) {\r
-    mLastStructDefinition->Field = FieldDef;\r
-  } else {\r
-    mLastStructDefinition->LastField->Next = FieldDef;\r
-  }\r
-  mLastStructDefinition->LastField = FieldDef;\r
-}\r
-VOID\r
-AddVarStore (\r
-  CHAR8  *StructName,       // actual name of the structure\r
-  CHAR8  *VarName,          // actual NV variable name\r
-  UINT16 VarStoreId,        // key value\r
-  INT32  LineNum            // parse line number (for error reporting)\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Called while parsing a varstore statement. Add the variable store \r
-  to our linked list.\r
-\r
-Arguments:\r
-  StructName    - the name of the typedef'ed structure to use\r
-  VarName       - the NV variable name as specified in the varstore statement\r
-  VarStoreId    - the variable store ID as specified in the varstore statememt\r
-  LineNum       - the line number from the input (preprocessor output) file\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  STRUCT_DEFINITION *StructDef;\r
-  UINT16_LIST       *L16Ptr;\r
-  //\r
-  // Go through our list of previously-defined variable store IDs and\r
-  // make sure this one is not a duplicate in name or key value.\r
-  //\r
-  for (L16Ptr = mDefinedVarStoreId; L16Ptr != NULL; L16Ptr = L16Ptr->Next) {\r
-    if (L16Ptr->Value == VarStoreId) {\r
-      PrintErrorMessage (LineNum, "variable storage key already used", NULL);\r
-      PrintErrorMessage (L16Ptr->LineNum, "previous usage of storage key", NULL);\r
-    }\r
-  }\r
-  // \r
-  // Key value of 0 is invalid since that's assigned by default to the default\r
-  // variable store (the first structure parsed).\r
-  //\r
-  if (VarStoreId == 0) {\r
-    PrintErrorMessage (LineNum, "variable storage key of 0 is invalid", NULL);\r
-  }\r
-  //\r
-  // Create a new element to add to the list\r
-  //\r
-  L16Ptr = (UINT16_LIST *)malloc(sizeof (UINT16_LIST));\r
-  memset (L16Ptr, 0, sizeof (UINT16_LIST));\r
-  L16Ptr->LineNum = LineNum;\r
-  L16Ptr->Value = VarStoreId;\r
-  if (mDefinedVarStoreId == NULL) {\r
-    mDefinedVarStoreId = L16Ptr;\r
-  } else {\r
-    mLastDefinedVarStoreId->Next = L16Ptr;\r
-  }\r
-  mLastDefinedVarStoreId = L16Ptr;\r
-  //\r
-  // Find the structure definition with this name\r
-  //\r
-  for (StructDef = mFirstStructDefinition; StructDef != NULL; StructDef = StructDef->Next) {\r
-    if (strcmp (StructDef->Name, StructName) == 0) {\r
-      //\r
-      // Make sure they did not already define a variable storage ID \r
-      // for this structure.\r
-      //\r
-      if (StructDef->VarStoreId != 0) {\r
-        PrintErrorMessage (LineNum, StructName, "variable storage already defined for this structure");\r
-        PrintErrorMessage (StructDef->VarStoreLineNum, StructName, "previous definition for variable storage");\r
-      }\r
-      StructDef->VarStoreId       = VarStoreId;\r
-      StructDef->VarStoreIdValid  = 1;\r
-      StructDef->VarStoreLineNum  = LineNum;\r
-      WriteWord (StructDef->Size);\r
-      while (*VarName) {\r
-        WriteByte(*VarName, 0);\r
-        VarName++;\r
-      }\r
-      WriteByte(0,0);\r
-      return;\r
-    }\r
-  }    \r
-  PrintErrorMessage (LineNum, StructName, "structure with this name not defined");\r
-}\r
-VOID \r
-WriteDWord (\r
-  UINT32    Value, \r
-  UINT8     KeyByte\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  During parsing, we came upon some code that requires a 32-bit value be\r
-  written to the VFR binary file. Queue up the 4 bytes.\r
-\r
-Arguments:\r
-  Value   - the 32-bit value to write\r
-  KeyByte - a single character which gets written out beside the first byte.\r
-            This is used to tag the data in the output file so that during \r
-            debug you have an idea what the value is.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  //\r
-  // Write 4 bytes, little endian. Specify a key byte only on the first one\r
-  //\r
-  mOpcodeHandler.AddByte ((UINT8)Value, KeyByte);\r
-  Value \>>= 8;\r
-  mOpcodeHandler.AddByte ((UINT8)Value, 0);\r
-  Value \>>= 8;\r
-  mOpcodeHandler.AddByte ((UINT8)Value, 0);\r
-  Value \>>= 8;\r
-  mOpcodeHandler.AddByte ((UINT8)Value, 0);\r
-}\r
-VOID \r
-WriteOpByte (\r
-  UINT32    LineNum,\r
-  UINT8     ByteValue\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  \r
-  During parsing, we came upon a new VFR opcode. At this point we flush\r
-  the output queue and then queue up this byte (with 'O' for opcode tag).\r
-\r
-Arguments:\r
-\r
-  ByteValue   - opcode value\r
-\r
-Returns:\r
-\r
-  None.\r
-\r
---*/\r
-{\r
-  mOpcodeHandler.AddOpcodeByte (ByteValue, LineNum);\r
-}\r
-VOID \r
-WriteByte (\r
-  UINT8   ByteValue, \r
-  UINT8   Key\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  \r
-  During parsing of the VFR we spoonfeed this function with bytes to write to\r
-  the output VFR binary file. This function simply queues up the bytes, and\r
-  the queue gets flushed each time a new VFR opcode is encountered.\r
-\r
-Arguments:\r
-\r
-  ByteValue   - raw byte to write\r
-  Key         - character to tag the byte with when we write ByteValue to the\r
-                output file.\r
-\r
-Returns:\r
-\r
-  None.\r
-\r
---*/\r
-{\r
-  mOpcodeHandler.AddByte (ByteValue, Key);\r
-}\r
-VOID \r
-WriteWord (\r
-  UINT32  Value\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  During VFR parsing we came upon a case where we need to write out a \r
-  16-bit value. Queue it up.\r
-\r
-Arguments:\r
-  Value - value to write.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  mOpcodeHandler.AddByte ((UINT8)Value, 0);\r
-  mOpcodeHandler.AddByte ((UINT8)((Value \>> 8) & 0xFF), 0);\r
-}\r
-VOID \r
-WriteStringIdWord (\r
-  UINT16 WordValue\r
-  )\r
-{\r
-  mOpcodeHandler.AddByte ((UINT8)WordValue, 'S');\r
-  mOpcodeHandler.AddByte ((UINT8)((WordValue \>> 8) & 0xFF), 0);\r
-}\r
-VOID\r
-FreeGotoReferences ()\r
-/*++\r
-\r
-Routine Description:\r
-  Called during cleanup to free up the memory we allocated when\r
-  keeping track of VFR goto statements.\r
-\r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  GOTO_REFERENCE  *CurrRef;\r
-  GOTO_REFERENCE  *NextRef;\r
-  FORM_ID_VALUE   *CurrFormId;\r
-  FORM_ID_VALUE   *NextFormId;\r
-  UINT8           Found;\r
-  CHAR8           Name[20];\r
-\r
-  //\r
-  // Go through all the "goto" references and make sure there was a \r
-  // form ID of that value defined.\r
-  //\r
-  for (CurrRef = mGotoReferences; CurrRef != NULL; CurrRef = CurrRef->Next) {\r
-    Found = 0;\r
-    for (CurrFormId = mFormIdValues; CurrFormId != NULL; CurrFormId = CurrFormId->Next) {\r
-      if (CurrRef->Value == CurrFormId->Value) {\r
-        Found = 1;\r
-        break;\r
-      }\r
-    }\r
-    if (!Found) {\r
-      sprintf (Name, "%d", (UINT32)CurrRef->Value);\r
-      PrintErrorMessage (CurrRef->RefLineNum, Name, "undefined form ID");\r
-    }  \r
-  }  \r
-  //\r
-  // Now free up the form id and goto references\r
-  //\r
-  CurrFormId = mFormIdValues;\r
-  while (CurrFormId != NULL) {\r
-    NextFormId = CurrFormId->Next;\r
-    free (CurrFormId);\r
-    CurrFormId = NextFormId;\r
-  }\r
-  mFormIdValues = NULL;\r
-  CurrRef = mGotoReferences;\r
-  while (CurrRef != NULL) {\r
-    NextRef = CurrRef->Next;\r
-    free (CurrRef);\r
-    CurrRef = NextRef;\r
-  }  \r
-  mGotoReferences = NULL;\r
-}\r
-VOID\r
-AddGotoReference (\r
-  UINT32  GotoNumber,\r
-  UINT32  LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  During VFR parsing we came upon a goto statement. Since we support\r
-  forward references, save the referenced label and at the end of parsing\r
-  we'll check that the label was actually defined somewhere.\r
-\r
-Arguments:\r
-  GotoNumber  - the label number referenced\r
-  LineNum     - the line number where the reference was made (used for\r
-                error reporting)\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  GOTO_REFERENCE *NewRef;\r
-  \r
-  NewRef = (GOTO_REFERENCE *)malloc (sizeof (GOTO_REFERENCE));\r
-  if (NewRef == NULL) {\r
-    Error (PROGRAM_NAME, 0, 0, NULL, "memory allocation failure");\r
-    return;\r
-  }\r
-  memset ((char *)NewRef, 0, sizeof (GOTO_REFERENCE));\r
-  NewRef->Value = (UINT16)GotoNumber;\r
-  NewRef->RefLineNum = LineNum;\r
-  NewRef->Next = mGotoReferences;\r
-  mGotoReferences = NewRef;\r
-}\r
-VOID\r
-AddFormId (\r
-  INT32   FormIdValue,\r
-  UINT32  LineNum\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function is called when we parse "form formid = 3" statements.\r
-  We save the form ID valud so we can verify that duplicates are not\r
-  defined. Also, these are the targets of goto statements, so when we're\r
-  done parsing the script we also go through all the goto statements to\r
-  check that there was a target FormId defined as referenced by each\r
-  goto statement.\r
-  \r
-  Note that formid = 0 is invalid.\r
-\r
-Arguments:\r
-  FormIdValue  - the parsed value for the Form ID\r
-  LineNum      - line number of the source file we're parsing\r
-\r
-Returns:\r
-  NA\r
-\r
---*/\r
-{\r
-  FORM_ID_VALUE *NewFormId;\r
-  char          *FileName;\r
-  char          *FileName2;\r
-  UINT32        LineNum2;  \r
-  //\r
-  // Verify that FormId != 0\r
-  //\r
-  if (FormIdValue == 0) {\r
-    FileName = ConvertLineNumber (&LineNum);\r
-    Error (FileName, LineNum, 0, "form ID cannot be 0", NULL);\r
-    return;\r
-  }\r
-  //\r
-  // First go through all previously defined form IDs and make sure they have not defined\r
-  // duplicates.\r
-  //\r
-  for (NewFormId = mFormIdValues; NewFormId != NULL; NewFormId = NewFormId->Next) {\r
-    if ((UINT16)FormIdValue == NewFormId->Value) {\r
-      FileName = ConvertLineNumber (&LineNum);\r
-      LineNum2 = NewFormId->LineNum;\r
-      FileName2 = ConvertLineNumber (&LineNum2);\r
-      Error (FileName, LineNum, 0, NULL, "form ID %d already defined", FormIdValue);\r
-      Error (FileName2, LineNum2, 0, NULL, "form ID %d previous definition", FormIdValue);\r
-      return;\r
-    }\r
-  }\r
-  //\r
-  // Allocate memory for a new one \r
-  //\r
-  NewFormId = (FORM_ID_VALUE *)malloc (sizeof (FORM_ID_VALUE));\r
-  if (NewFormId == NULL) {\r
-    Error (PROGRAM_NAME, 0, 0, NULL, "memory allocation failure");\r
-    return;\r
-  }\r
-  memset ((char *)NewFormId, 0, sizeof (FORM_ID_VALUE));\r
-  NewFormId->LineNum = LineNum;\r
-  NewFormId->Next = mFormIdValues;\r
-  NewFormId->Value = (UINT16)FormIdValue;\r
-  mFormIdValues = NewFormId;\r
-}\r
-UINT32\r
-GetNumber (\r
-  CHAR8   *NumStr,\r
-  UINT32  LineNum,\r
-  UINT32  NumBytes\r
-  )\r
-{\r
-  UINT32 Value;\r
-  \r
-  if ((NumStr[0] == '0') && (NumStr[1] == 'x')) {\r
-    AtoX (NumStr + 2, 4, &Value);\r
-  } else {\r
-    Value = (UINT32)atoi (NumStr);\r
-  }\r
-  //\r
-  // Check range\r
-  //\r
-  if ((NumBytes < 4) && (Value & ((UINT32)0xFFFFFFFF << (NumBytes * 8)))) {\r
-    PrintErrorMessage (LineNum, NumStr, "value out of range");\r
-    return 0;\r
-  }\r
-  return Value;\r
-}\r
-\r
->>\r
-\r
-} // end grammar class\r
-\r
diff --git a/Source/C/VfrCompile/VfrCompiler.cpp b/Source/C/VfrCompile/VfrCompiler.cpp
new file mode 100644 (file)
index 0000000..5ce9858
--- /dev/null
@@ -0,0 +1,613 @@
+#include "stdio.h"\r
+#include "string.h"\r
+#include "process.h"\r
+#include "VfrCompiler.h"\r
+\r
+\r
+VOID\r
+CVfrCompiler::SET_RUN_STATUS (\r
+  IN COMPILER_RUN_STATUS Status\r
+  )\r
+{\r
+  mRunStatus = Status;\r
+}\r
+\r
+BOOLEAN\r
+CVfrCompiler::IS_RUN_STATUS (\r
+  IN COMPILER_RUN_STATUS Status\r
+  )\r
+{\r
+  return mRunStatus == Status;\r
+}\r
+\r
+VOID\r
+CVfrCompiler::OptionInitialization (\r
+  IN INT32      Argc, \r
+  IN INT8       **Argv\r
+  )\r
+{\r
+  INT32         Index;\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
+  mOptions.IncludePaths                  = NULL;\r
+  mOptions.SkipCPreprocessor             = FALSE;\r
+  mOptions.CPreprocessorOptions          = NULL;\r
+\r
+  for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) {\r
+    if ((_stricmp(Argv[Index], "-?") == 0) || (_stricmp(Argv[Index], "-h") == 0)) {\r
+      Usage ();\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
+        printf ("%s -i - missing path argument\n", PROGRAM_NAME);\r
+        goto Fail;\r
+      }\r
+\r
+      AppendIncludePath(Argv[Index]);\r
+    } else if (_stricmp(Argv[Index], "-od") == 0) {\r
+      Index++;\r
+      if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
+        printf ("%s -od - missing output directory name\n", PROGRAM_NAME);\r
+        goto Fail;\r
+      }\r
+      strcpy (mOptions.OutputDirectory, Argv[Index]);\r
+      strcat (mOptions.OutputDirectory, "\\");\r
+    } else if (_stricmp(Argv[Index], "-ibin") == 0) {\r
+      mOptions.CreateIfrPkgFile = TRUE;\r
+    } else if (_stricmp(Argv[Index], "-nostrings") == 0) {\r
+    } else if (_stricmp(Argv[Index], "-nopp") == 0) {\r
+      mOptions.SkipCPreprocessor = TRUE;\r
+    } else if (_stricmp(Argv[Index], "-ppflag") == 0) {\r
+      Index++;\r
+      if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
+        printf ("%s -od - missing C-preprocessor argument\n", PROGRAM_NAME);\r
+        goto Fail;\r
+      }\r
+\r
+      AppendCPreprocessorOptions (Argv[Index]);\r
+    } else {\r
+      printf ("%s unrecognized option %s\n", PROGRAM_NAME, Argv[Index]);\r
+      Usage ();\r
+      goto Fail;\r
+    }\r
+  }\r
+\r
+  if (Index != Argc - 1) {\r
+    printf ("%s must specify VFR file name", PROGRAM_NAME);\r
+    Usage ();\r
+    goto Fail;\r
+  } else {\r
+    strcpy (mOptions.VfrFileName, Argv[Index]);\r
+  }\r
+\r
+  if (SetBaseFileName() != 0) {\r
+    goto Fail;\r
+  }\r
+  if (SetPkgOutputFileName () != 0) {\r
+    goto Fail;\r
+  }\r
+  if (SetCOutputFileName() != 0) {\r
+    goto Fail;\r
+  }\r
+  if (SetPreprocessorOutputFileName () != 0) {\r
+    goto Fail;\r
+  }\r
+  if (SetRecordListFileName () != 0) {\r
+    goto Fail;\r
+  }\r
+  return;\r
+\r
+Fail:\r
+  SET_RUN_STATUS (STATUS_FAILED);\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
+  if (mOptions.IncludePaths != NULL) {\r
+    delete mOptions.IncludePaths;\r
+    mOptions.IncludePaths                = NULL;\r
+  } \r
+  if (mOptions.CPreprocessorOptions != NULL) {\r
+    delete mOptions.CPreprocessorOptions;\r
+    mOptions.CPreprocessorOptions        = NULL;\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrCompiler::AppendIncludePath (\r
+  IN INT8       *PathStr\r
+  )\r
+{\r
+  UINT32  Len           = 0;\r
+  INT8    *IncludePaths = NULL;\r
+\r
+  Len = strlen (" -I ") + strlen (PathStr) + 1;\r
+  if (mOptions.IncludePaths != NULL) {\r
+    Len += strlen (mOptions.IncludePaths);\r
+  }\r
+  IncludePaths = new INT8[Len];\r
+  if (IncludePaths == NULL) {\r
+    printf ("%s memory allocation failure\n", PROGRAM_NAME);\r
+    return;\r
+  }\r
+  IncludePaths[0] = '\0';\r
+  if (mOptions.IncludePaths != NULL) {\r
+    strcat (IncludePaths, mOptions.IncludePaths);\r
+  }\r
+  strcat (IncludePaths, " -I ");\r
+  strcat (IncludePaths, PathStr);\r
+  if (mOptions.IncludePaths != NULL) {\r
+    delete mOptions.IncludePaths;\r
+  }\r
+  mOptions.IncludePaths = IncludePaths;\r
+}\r
+\r
+VOID\r
+CVfrCompiler::AppendCPreprocessorOptions (\r
+  IN INT8       *Options\r
+  )\r
+{\r
+  UINT32  Len           = 0;\r
+  INT8    *Opt          = NULL;\r
+\r
+  Len = strlen (Options) + strlen (" ") + 1;\r
+  if (mOptions.CPreprocessorOptions != NULL) {\r
+    Len += strlen (mOptions.CPreprocessorOptions);\r
+  }\r
+  Opt = new INT8[Len];\r
+  if (Opt == NULL) {\r
+    printf ("%s memory allocation failure\n", PROGRAM_NAME);\r
+    return;\r
+  }\r
+  Opt[0] = 0;\r
+  if (mOptions.CPreprocessorOptions != NULL) {\r
+    strcat (Opt, mOptions.CPreprocessorOptions);\r
+  }\r
+  strcat (Opt, " ");\r
+  strcat (Opt, Options);\r
+  if (mOptions.CPreprocessorOptions != NULL) {\r
+    delete mOptions.CPreprocessorOptions;\r
+  }\r
+  mOptions.CPreprocessorOptions = Opt;\r
+}\r
+\r
+INT8\r
+CVfrCompiler::SetBaseFileName (\r
+  VOID\r
+  )\r
+{\r
+  INT8          *pFileName, *pPath, *pExt;\r
+\r
+  if (mOptions.VfrFileName[0] == '\0') {\r
+    return -1;\r
+  }\r
+\r
+  pFileName = mOptions.VfrFileName;\r
+  while ((pPath = strchr (pFileName, '\\')) != NULL) {\r
+    pFileName = pPath + 1;\r
+  }\r
+\r
+  if (pFileName == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  if ((pExt = strchr (pFileName, '.')) == NULL) {\r
+    return -1;\r
+  }\r
+\r
+  strncpy (mOptions.VfrBaseFileName, pFileName, pExt - pFileName);\r
+  mOptions.VfrBaseFileName[pExt - pFileName] = '\0';\r
+\r
+  return 0;\r
+}\r
+\r
+INT8\r
+CVfrCompiler::SetPkgOutputFileName (\r
+  VOID\r
+  )\r
+{\r
+  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+    return -1;\r
+  }\r
+\r
+  strcpy (mOptions.PkgOutputFileName, mOptions.OutputDirectory);\r
+  strcat (mOptions.PkgOutputFileName, mOptions.VfrBaseFileName);\r
+  strcat (mOptions.PkgOutputFileName, VFR_PACKAGE_FILENAME_EXTENSION);\r
+\r
+  return 0;\r
+}\r
+\r
+INT8\r
+CVfrCompiler::SetCOutputFileName (\r
+  VOID\r
+  )\r
+{\r
+  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+    return -1;\r
+  }\r
+\r
+  strcpy (mOptions.COutputFileName, mOptions.OutputDirectory);\r
+  strcat (mOptions.COutputFileName, mOptions.VfrBaseFileName);\r
+  strcat (mOptions.COutputFileName, ".c");\r
+\r
+  return 0;\r
+}\r
+\r
+INT8\r
+CVfrCompiler::SetPreprocessorOutputFileName (\r
+  VOID\r
+  )\r
+{\r
+  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+    return -1;\r
+  }\r
+\r
+  strcpy (mOptions.PreprocessorOutputFileName, mOptions.OutputDirectory);\r
+  strcat (mOptions.PreprocessorOutputFileName, mOptions.VfrBaseFileName);\r
+  strcat (mOptions.PreprocessorOutputFileName, VFR_PREPROCESS_FILENAME_EXTENSION);\r
+\r
+  return 0;\r
+}\r
+\r
+INT8\r
+CVfrCompiler::SetRecordListFileName (\r
+  VOID\r
+  )\r
+{\r
+  if (mOptions.VfrBaseFileName[0] == '\0') {\r
+    return -1;\r
+  }\r
+\r
+  strcpy (mOptions.RecordListFile, mOptions.OutputDirectory);\r
+  strcat (mOptions.RecordListFile, mOptions.VfrBaseFileName);\r
+  strcat (mOptions.RecordListFile, VFR_RECORDLIST_FILENAME_EXTENSION);\r
+\r
+  return 0;\r
+}\r
+\r
+CVfrCompiler::CVfrCompiler (\r
+  IN INT32      Argc, \r
+  IN INT8       **Argv\r
+  )\r
+{\r
+  mPreProcessCmd = PREPROCESSOR_COMMAND;\r
+  mPreProcessOpt = PREPROCESSOR_OPTIONS;\r
+\r
+  OptionInitialization(Argc, Argv);\r
+\r
+  if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {\r
+    return;\r
+  }\r
+\r
+  SET_RUN_STATUS(STATUS_INITIALIZED);\r
+}\r
+\r
+CVfrCompiler::~CVfrCompiler (\r
+  VOID\r
+  )\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
+  }\r
+\r
+  SET_RUN_STATUS(STATUS_DEAD);\r
+}\r
+\r
+VOID \r
+CVfrCompiler::Usage (\r
+  VOID\r
+  )\r
+{\r
+  UINT32 Index;\r
+  CONST  INT8 *Help[] = {\r
+    " ", \r
+    "VfrCompile version " VFR_COMPILER_VERSION,\r
+    " ",\r
+    "  Usage: VfrCompile {options} [VfrFile]",\r
+    " ",\r
+    "    where options include:",\r
+    "      -? or -h       prints this help",\r
+    "      -l             create an output IFR listing file",\r
+    "      -i IncPath     add IncPath to the search path for VFR included files",\r
+    "      -od OutputDir  deposit all output files to directory OutputDir (default=cwd)",\r
+    "      -ibin          create an IFR HII pack file",\r
+    "      -nopp          do not preprocess",\r
+    "      -ppflag        C-preprocessor argument",\r
+    "    where parameters include:",\r
+    "      VfrFile        name of the input VFR script file",\r
+    " ",\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::PreProcess (\r
+  VOID\r
+  )\r
+{\r
+  FILE    *pVfrFile      = NULL;\r
+  UINT32  CmdLen         = 0;\r
+  INT8    *PreProcessCmd = NULL;\r
+\r
+  if (!IS_RUN_STATUS(STATUS_INITIALIZED)) {\r
+    goto Fail;\r
+  }\r
+\r
+  if (mOptions.SkipCPreprocessor == TRUE) {\r
+    goto Out;\r
+  }\r
+\r
+  if ((pVfrFile = fopen (mOptions.VfrFileName, "r")) == NULL) {\r
+    printf ("%s could not open input VFR file - %s\n", PROGRAM_NAME, mOptions.VfrFileName);\r
+    goto Fail;\r
+  }\r
+  fclose (pVfrFile);\r
+\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
+  if (mOptions.IncludePaths != NULL) {\r
+    CmdLen += strlen (mOptions.IncludePaths);\r
+  }\r
+\r
+  PreProcessCmd = new INT8[CmdLen + 10];\r
+  if (PreProcessCmd == NULL) {\r
+    printf ("%s could not allocate memory\n", PROGRAM_NAME);\r
+    goto Fail;\r
+  }\r
+  strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " ");\r
+  strcat (PreProcessCmd, mPreProcessOpt), strcat (PreProcessCmd, " ");\r
+  if (mOptions.IncludePaths != NULL) {\r
+    strcat (PreProcessCmd, mOptions.IncludePaths), strcat (PreProcessCmd, " ");\r
+  }\r
+  if (mOptions.CPreprocessorOptions != NULL) {\r
+    strcat (PreProcessCmd, mOptions.CPreprocessorOptions), strcat (PreProcessCmd, " ");\r
+  }\r
+  strcat (PreProcessCmd, mOptions.VfrFileName), strcat (PreProcessCmd, " > ");\r
+  strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName);\r
+\r
+  if (system (PreProcessCmd) != 0) {\r
+    printf ("%s failed to spawn C preprocessor on VFR file \n\t - %s\n", PROGRAM_NAME, PreProcessCmd);\r
+    goto Fail;\r
+  }\r
+\r
+  delete PreProcessCmd;\r
+\r
+Out:\r
+  SET_RUN_STATUS (STATUS_PREPROCESSED);\r
+  return;\r
+\r
+Fail:\r
+  if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
+    SET_RUN_STATUS (STATUS_FAILED);\r
+  }\r
+  delete PreProcessCmd;\r
+}\r
+\r
+extern UINT8 VfrParserStart (IN FILE *);\r
+\r
+VOID\r
+CVfrCompiler::Compile (\r
+  VOID\r
+  )\r
+{\r
+  FILE *pInFile    = NULL;\r
+  INT8 *InFileName = NULL;\r
+\r
+  if (!IS_RUN_STATUS(STATUS_PREPROCESSED)) {\r
+    goto Fail;\r
+  }\r
+\r
+  InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
+\r
+  gCVfrErrorHandle.SetInputFile (InFileName);\r
+\r
+  if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
+    printf ("%s failed to open input file - %s\n", PROGRAM_NAME, InFileName);\r
+    goto Fail;\r
+  }\r
+\r
+  if (VfrParserStart (pInFile) != 0) {\r
+    goto Fail;\r
+  }\r
+\r
+  fclose (pInFile);\r
+\r
+  if (gCFormPkg.HavePendingUnassigned () == TRUE) {\r
+    gCFormPkg.PendingAssignPrintAll ();\r
+    goto Fail;\r
+  }\r
+\r
+  SET_RUN_STATUS (STATUS_COMPILEED);\r
+  return;\r
+\r
+Fail:\r
+  if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
+    printf ("%s compile error!\n", PROGRAM_NAME);\r
+    SET_RUN_STATUS (STATUS_FAILED);\r
+  }\r
+  if (pInFile != NULL) {\r
+    fclose (pInFile);\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrCompiler::GenBinary (\r
+  VOID\r
+  )\r
+{\r
+  FILE                    *pFile = NULL;\r
+\r
+  if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
+    goto Fail;\r
+  }\r
+\r
+  if (mOptions.CreateIfrPkgFile == TRUE) {\r
+    if ((pFile = fopen (mOptions.PkgOutputFileName, "wb")) == NULL) {\r
+      printf ("can not open %s\n", mOptions.PkgOutputFileName);\r
+      goto Fail;\r
+    }\r
+    if (gCFormPkg.BuildPkg (pFile) != VFR_RETURN_SUCCESS) {\r
+      fclose (pFile);\r
+      goto Fail;\r
+    }\r
+    fclose (pFile);\r
+  }\r
+\r
+  SET_RUN_STATUS (STATUS_GENBINARY);\r
+  return;\r
+\r
+Fail:\r
+  if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
+    SET_RUN_STATUS (STATUS_FAILED);\r
+  }\r
+}\r
+\r
+static const char *gSourceFileHeader[] = {\r
+  "//",\r
+  "//  DO NOT EDIT -- auto-generated file",\r
+  "//",\r
+  "//  This file is generated by the vfrcompiler utility",\r
+  "//",\r
+  NULL\r
+};\r
+\r
+VOID\r
+CVfrCompiler::GenCFile (\r
+  VOID\r
+  )\r
+{\r
+  FILE                    *pFile;\r
+  UINT32                  Index;\r
+\r
+  if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
+    goto Fail;\r
+  }\r
+\r
+  if ((pFile = fopen (mOptions.COutputFileName, "w")) == NULL) {\r
+    printf ("failed to open output C file - %s\n", mOptions.COutputFileName);\r
+    goto Fail;\r
+  }\r
+\r
+  for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
+    fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
+  }\r
+\r
+  gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
+\r
+  if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile) != VFR_RETURN_SUCCESS) {\r
+    fclose (pFile);\r
+    goto Fail;\r
+  }\r
+  fclose (pFile);\r
+\r
+  SET_RUN_STATUS (STATUS_FINISHED);\r
+  return;\r
+\r
+Fail:\r
+  if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
+    SET_RUN_STATUS (STATUS_FAILED);\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrCompiler::GenRecordListFile (\r
+  VOID\r
+  )\r
+{\r
+  INT8   *InFileName = NULL;\r
+  FILE   *pInFile    = NULL;\r
+  FILE   *pOutFile   = NULL;\r
+  INT8   LineBuf[MAX_LINE_LEN];\r
+  UINT32 LineNo;\r
+\r
+  InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
+\r
+  if (mOptions.CreateRecordListFile == TRUE) {\r
+    if ((InFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {\r
+      return;\r
+    }\r
+\r
+    if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
+      printf ("%s failed to open input VFR preprocessor output file - %s\n", PROGRAM_NAME, InFileName);\r
+      return;\r
+    }\r
+\r
+    if ((pOutFile = fopen (mOptions.RecordListFile, "w")) == NULL) {\r
+      printf ("%s failed to open record list file for writing - %s\n", PROGRAM_NAME, mOptions.RecordListFile);\r
+      goto Err1;\r
+    }\r
+\r
+    fprintf (pOutFile, "//\n//  VFR compiler version " VFR_COMPILER_VERSION "\n//\n");\r
+    LineNo = 0;\r
+    while (!feof (pInFile)) {\r
+      if (fgets (LineBuf, MAX_LINE_LEN, pInFile) != NULL) {\r
+        fprintf (pOutFile, "%s", LineBuf);\r
+        LineNo++;\r
+        gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);\r
+      }\r
+    }\r
+\r
+    fclose (pOutFile);\r
+    fclose (pInFile);\r
+  }\r
+\r
+  return;\r
+\r
+Err1:\r
+  fclose (pInFile);\r
+}\r
+\r
+INT32\r
+main (\r
+  IN INT32             Argc, \r
+  IN INT8              **Argv\r
+  )\r
+{\r
+  COMPILER_RUN_STATUS  Status;\r
+  CVfrCompiler         Compiler(Argc, Argv);\r
+\r
+  Compiler.PreProcess();\r
+  Compiler.Compile();\r
+  Compiler.GenBinary();\r
+  Compiler.GenCFile();\r
+  Compiler.GenRecordListFile ();\r
+\r
+  Status = Compiler.RunStatus ();\r
+  if ((Status == STATUS_DEAD) || (Status == STATUS_FAILED)) {\r
+    return 2;\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
diff --git a/Source/C/VfrCompile/VfrCompiler.h b/Source/C/VfrCompile/VfrCompiler.h
new file mode 100644 (file)
index 0000000..0c710c2
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef _VFRCOMPILER_H_\r
+#define _VFRCOMPILER_H_\r
+\r
+#include "Tiano.h"\r
+#include "EfiTypes.h"\r
+#include "EfiVfr.h"\r
+#include "VfrFormPkg.h"\r
+#include "VfrUtilityLib.h"\r
+\r
+#define PROGRAM_NAME                       "VfrCompile"\r
+#define VFR_COMPILER_VERSION               "UEFI 2.1"\r
+\r
+//\r
+// This is how we invoke the C preprocessor on the VFR source file\r
+// to resolve #defines, #includes, etc. To make C source files\r
+// shareable between VFR and drivers, define VFRCOMPILE so that\r
+// #ifdefs can be used in shared .h files.\r
+//\r
+#define PREPROCESSOR_COMMAND                "cl "\r
+#define PREPROCESSOR_OPTIONS                "/nologo /E /TC /DVFRCOMPILE "\r
+\r
+//\r
+// Specify the filename extensions for the files we generate.\r
+//\r
+#define VFR_PREPROCESS_FILENAME_EXTENSION   ".i"\r
+#define VFR_PACKAGE_FILENAME_EXTENSION      ".hpk"\r
+#define VFR_RECORDLIST_FILENAME_EXTENSION   ".lst"\r
+\r
+typedef struct {\r
+  INT8    VfrFileName[MAX_PATH];\r
+  INT8    RecordListFile[MAX_PATH];\r
+  INT8    PkgOutputFileName[MAX_PATH];\r
+  INT8    COutputFileName[MAX_PATH];\r
+  bool    CreateRecordListFile;\r
+  bool    CreateIfrPkgFile;\r
+  INT8    OutputDirectory[MAX_PATH];\r
+  INT8    PreprocessorOutputFileName[MAX_PATH];\r
+  INT8    VfrBaseFileName[MAX_PATH];  // name of input VFR file with no path or extension\r
+  INT8    *IncludePaths;\r
+  bool    SkipCPreprocessor;\r
+  INT8    *CPreprocessorOptions;\r
+} OPTIONS;\r
+\r
+typedef enum {\r
+  STATUS_INITIALIZED = 1,\r
+  STATUS_PREPROCESSED,\r
+  STATUS_COMPILEED,\r
+  STATUS_GENBINARY,\r
+  STATUS_FINISHED,\r
+  STATUS_FAILED,\r
+  STATUS_DEAD,\r
+} COMPILER_RUN_STATUS;\r
+\r
+class CVfrCompiler {\r
+private:\r
+  COMPILER_RUN_STATUS  mRunStatus;\r
+  OPTIONS              mOptions;\r
+  INT8                 *mPreProcessCmd;\r
+  INT8                 *mPreProcessOpt;\r
+\r
+  VOID    OptionInitialization (IN INT32 , IN INT8 **);\r
+  VOID    AppendIncludePath (IN INT8 *);\r
+  VOID    AppendCPreprocessorOptions (IN INT8 *);\r
+  INT8    SetBaseFileName (VOID);\r
+  INT8    SetPkgOutputFileName (VOID);\r
+  INT8    SetCOutputFileName(VOID);\r
+  INT8    SetPreprocessorOutputFileName (VOID);\r
+  INT8    SetRecordListFileName (VOID);\r
+\r
+  VOID    SET_RUN_STATUS (IN COMPILER_RUN_STATUS);\r
+  BOOLEAN IS_RUN_STATUS (IN COMPILER_RUN_STATUS);\r
+\r
+public:\r
+  COMPILER_RUN_STATUS RunStatus (VOID) {\r
+    return mRunStatus;\r
+  }\r
+\r
+public:\r
+  CVfrCompiler (IN INT32 , IN INT8 **);\r
+  ~CVfrCompiler ();\r
+\r
+  VOID                Usage (VOID);\r
+\r
+  VOID                PreProcess (VOID);\r
+  VOID                Compile (VOID);\r
+  VOID                GenBinary (VOID);\r
+  VOID                GenCFile (VOID);\r
+  VOID                GenRecordListFile (VOID);\r
+};\r
+\r
+#endif\r
diff --git a/Source/C/VfrCompile/VfrError.cpp b/Source/C/VfrCompile/VfrError.cpp
new file mode 100644 (file)
index 0000000..77667e5
--- /dev/null
@@ -0,0 +1,222 @@
+#include "stdio.h"\r
+#include "string.h"\r
+#include "stdlib.h"\r
+#include "VfrError.h"\r
+\r
+static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {\r
+  { VFR_RETURN_SUCCESS, NULL },\r
+  { VFR_RETURN_ERROR_SKIPED, NULL },\r
+  { VFR_RETURN_FATAL_ERROR, "fatal error!!" },\r
+\r
+  { VFR_RETURN_MISMATCHED, "unexpected token" },\r
+  { VFR_RETURN_INVALID_PARAMETER, "Invalid parameter" },\r
+  { VFR_RETURN_OUT_FOR_RESOURCES, "system out of memory" },\r
+  { VFR_RETURN_UNSUPPORTED, "unsupported" },\r
+  { VFR_RETURN_REDEFINED, "already defined" },\r
+  { VFR_RETURN_FORMID_REDEFINED, "form id already defined" },\r
+  { VFR_RETURN_QUESTIONID_REDEFINED, "question id already defined" },\r
+  { VFR_RETURN_VARSTOREID_REDEFINED, "varstore id already defined" },\r
+  { VFR_RETURN_UNDEFINED, "undefined" },\r
+  { VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION, "some variable has not defined by a question"},\r
+  { VFR_RETURN_GET_EFIVARSTORE_ERROR, "get efi varstore error"},\r
+  { VFR_RETURN_EFIVARSTORE_USE_ERROR, "can not use the efi varstore like this" },\r
+  { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, "unsupport efi varstore size should be <= 8 bytes" },\r
+  { VFR_RETURN_GET_NVVARSTORE_ERROR, "get name value varstore error" },\r
+  { VFR_RETURN_QVAR_REUSE, "variable reused by more than one question" }, \r
+  { VFR_RETURN_FLAGS_UNSUPPORTED, "flags unsupported" }, \r
+  { VFR_RETURN_ERROR_ARRARY_NUM, "array number error" },\r
+  { VFR_RETURN_DATA_STRING_ERROR, "data field string error or not support"},\r
+  { VFR_RETURN_CODEUNDEFINED, "Undefined Error Code" }\r
+};\r
+\r
+CVfrErrorHandle::CVfrErrorHandle (\r
+  VOID\r
+  )\r
+{\r
+  mInputFileName       = NULL;\r
+  mScopeRecordListHead = NULL;\r
+  mScopeRecordListTail = NULL;\r
+  mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;\r
+}\r
+\r
+CVfrErrorHandle::~CVfrErrorHandle (\r
+  VOID\r
+  )\r
+{\r
+  SVfrFileScopeRecord *pNode = NULL;\r
+\r
+  if (mInputFileName != NULL) {\r
+    delete mInputFileName;\r
+  }\r
+\r
+  while (mScopeRecordListHead != NULL) {\r
+    pNode = mScopeRecordListHead;\r
+    mScopeRecordListHead = mScopeRecordListHead->mNext;\r
+    delete pNode;\r
+  }\r
+\r
+  mScopeRecordListHead = NULL;\r
+  mScopeRecordListTail = NULL;\r
+  mVfrErrorHandleTable = NULL;\r
+}\r
+\r
+VOID\r
+CVfrErrorHandle::SetInputFile (\r
+  IN INT8     *InputFile\r
+  )\r
+{\r
+  if (InputFile != NULL) {\r
+    mInputFileName = new INT8[strlen(InputFile) + 1];\r
+    strcpy (mInputFileName, InputFile);\r
+  }\r
+}\r
+\r
+SVfrFileScopeRecord::SVfrFileScopeRecord (\r
+  IN INT8     *Record, \r
+  IN UINT32   LineNum\r
+  )\r
+{\r
+  UINT32      Index;\r
+  INT8        *FileName = NULL;\r
+  INT8        *Str      = NULL;\r
+\r
+  mWholeScopeLine      = LineNum;\r
+  mNext                = NULL;\r
+\r
+  Str = strchr (Record, ' ');\r
+  mScopeLineStart = atoi (++Str);\r
+\r
+  Str = strchr (Str, '\"');\r
+  FileName = ++Str;\r
+\r
+  while((Str = strstr (FileName, "\\\\")) != NULL) {\r
+    FileName = Str + 2;\r
+  }\r
+  if ((mFileName = new INT8[strlen(FileName)]) != NULL) {\r
+    for (Index = 0; FileName[Index] != '\"'; Index++) {\r
+      mFileName[Index] = FileName[Index];\r
+    }\r
+    mFileName[Index] = '\0';\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+SVfrFileScopeRecord::~SVfrFileScopeRecord (\r
+  VOID\r
+  )\r
+{\r
+  if (mFileName != NULL) {\r
+    delete mFileName;\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrErrorHandle::ParseFileScopeRecord (\r
+  IN INT8      *Record, \r
+  IN UINT32    WholeScopeLine\r
+  )\r
+{\r
+  INT8                *FullPathName = NULL;\r
+  SVfrFileScopeRecord *pNode        = NULL;\r
+\r
+  if (Record == NULL) {\r
+    return;\r
+  }\r
+\r
+  if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {\r
+    return;\r
+  }\r
+\r
+  if (mScopeRecordListHead == NULL) {\r
+    mScopeRecordListTail = mScopeRecordListHead = pNode;\r
+  } else {\r
+    mScopeRecordListTail->mNext = pNode;\r
+    mScopeRecordListTail        = pNode;\r
+  }\r
+}\r
+\r
+VOID\r
+CVfrErrorHandle::GetFileNameLineNum (\r
+  IN  UINT32 LineNum,\r
+  OUT INT8   **FileName,\r
+  OUT UINT32 *FileLine\r
+  )\r
+{\r
+  SVfrFileScopeRecord *pNode    = NULL;\r
+\r
+  if ((FileName == NULL) || (FileLine == NULL)) {\r
+    return;\r
+  }\r
+\r
+  *FileName = NULL;\r
+  *FileLine = 0xFFFFFFFF;\r
+\r
+  //\r
+  // Some errors occur before scope record list been built.\r
+  //\r
+  if (mScopeRecordListHead == NULL) {\r
+    *FileLine = LineNum;\r
+    *FileName = mInputFileName;\r
+    return ;\r
+  }\r
+\r
+  for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {\r
+    if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {\r
+      *FileName = pNode->mFileName;\r
+      *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
+      return ;\r
+    }\r
+  }\r
+\r
+  *FileName = pNode->mFileName;\r
+  *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;\r
+}\r
+\r
+VOID\r
+CVfrErrorHandle::PrintError (\r
+  IN UINT32               LineNum,\r
+  IN INT8                 *TokName,\r
+  IN INT8                 *ErrorMsg\r
+  )\r
+{\r
+  INT8                   *FileName = NULL;\r
+  UINT32                 FileLine;\r
+\r
+  GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
+  printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);\r
+}\r
+\r
+UINT8\r
+CVfrErrorHandle::HandleError (\r
+  IN EFI_VFR_RETURN_CODE  ErrorCode,\r
+  IN UINT32               LineNum,\r
+  IN INT8                 *TokName\r
+  )\r
+{\r
+  UINT32                 Index;\r
+  INT8                   *FileName = NULL;\r
+  UINT32                 FileLine;\r
+  INT8                   *ErrorMsg = NULL;\r
+\r
+  if (mVfrErrorHandleTable == NULL) {\r
+    return 1;\r
+  }\r
+\r
+  for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {\r
+    if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {\r
+      ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (ErrorMsg != NULL) {\r
+    GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
+    printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);\r
+    return 1;\r
+  } else {\r
+    return 0;\r
+  }\r
+}\r
+\r
+CVfrErrorHandle gCVfrErrorHandle;\r
diff --git a/Source/C/VfrCompile/VfrError.h b/Source/C/VfrCompile/VfrError.h
new file mode 100644 (file)
index 0000000..a9d7278
--- /dev/null
@@ -0,0 +1,69 @@
+#ifndef _VFRERROR_H_\r
+#define _VFRERROR_H_\r
+\r
+#include "Tiano.h"\r
+#include "EfiTypes.h"\r
+\r
+typedef enum {\r
+  VFR_RETURN_SUCCESS = 0,\r
+  VFR_RETURN_ERROR_SKIPED,\r
+  VFR_RETURN_FATAL_ERROR,\r
+  VFR_RETURN_MISMATCHED,\r
+  VFR_RETURN_INVALID_PARAMETER,\r
+  VFR_RETURN_OUT_FOR_RESOURCES,\r
+  VFR_RETURN_UNSUPPORTED,\r
+  VFR_RETURN_REDEFINED,\r
+  VFR_RETURN_FORMID_REDEFINED,\r
+  VFR_RETURN_QUESTIONID_REDEFINED,\r
+  VFR_RETURN_VARSTOREID_REDEFINED,\r
+  VFR_RETURN_UNDEFINED,\r
+  VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION,\r
+  VFR_RETURN_GET_EFIVARSTORE_ERROR,\r
+  VFR_RETURN_EFIVARSTORE_USE_ERROR,\r
+  VFR_RETURN_EFIVARSTORE_SIZE_ERROR,\r
+  VFR_RETURN_GET_NVVARSTORE_ERROR,\r
+  VFR_RETURN_QVAR_REUSE,\r
+  VFR_RETURN_FLAGS_UNSUPPORTED,\r
+  VFR_RETURN_ERROR_ARRARY_NUM,\r
+  VFR_RETURN_DATA_STRING_ERROR,\r
+  VFR_RETURN_CODEUNDEFINED\r
+} EFI_VFR_RETURN_CODE;\r
+\r
+typedef struct _SVFR_ERROR_HANDLE {\r
+  EFI_VFR_RETURN_CODE    mErrorCode;\r
+  INT8                   *mErrorMsg;\r
+} SVFR_ERROR_HANDLE;\r
+\r
+struct SVfrFileScopeRecord {\r
+  INT8                  *mFileName;\r
+  UINT32                mWholeScopeLine;\r
+  UINT32                mScopeLineStart;\r
+  SVfrFileScopeRecord *mNext;\r
+\r
+  SVfrFileScopeRecord (IN INT8 *, IN UINT32);\r
+  ~SVfrFileScopeRecord();\r
+};\r
+\r
+class CVfrErrorHandle {\r
+private:\r
+  INT8                *mInputFileName;\r
+  SVFR_ERROR_HANDLE   *mVfrErrorHandleTable;\r
+  SVfrFileScopeRecord *mScopeRecordListHead;\r
+  SVfrFileScopeRecord *mScopeRecordListTail;\r
+\r
+public:\r
+  CVfrErrorHandle (VOID);\r
+  ~CVfrErrorHandle (VOID);\r
+\r
+  VOID  SetInputFile (IN INT8 *);\r
+  VOID  ParseFileScopeRecord (IN INT8 *, IN UINT32);\r
+  VOID  GetFileNameLineNum (IN UINT32, OUT INT8 **, OUT UINT32 *);\r
+  UINT8 HandleError (IN EFI_VFR_RETURN_CODE, IN UINT32 LineNum = 0, IN INT8 *TokName = "\0");\r
+  VOID  PrintError (IN UINT32 LineNum = 0, IN INT8 *TokName = "\0", IN INT8 *ErrorMsg = "\0");\r
+};\r
+\r
+#define CHECK_ERROR_RETURN(f, v) do { EFI_VFR_RETURN_CODE r; if ((r = (f)) != (v)) { return r; } } while (0)\r
+\r
+extern CVfrErrorHandle gCVfrErrorHandle;\r
+\r
+#endif\r
diff --git a/Source/C/VfrCompile/VfrFormPkg.cpp b/Source/C/VfrCompile/VfrFormPkg.cpp
new file mode 100644 (file)
index 0000000..2ac1b68
--- /dev/null
@@ -0,0 +1,830 @@
+#include "stdio.h"\r
+#include "VfrFormPkg.h"\r
+\r
+/*\r
+ * The definition of CFormPkg's member function\r
+ */\r
+\r
+SPendingAssign::SPendingAssign (\r
+  IN INT8   *Key, \r
+  IN VOID   *Addr, \r
+  IN UINT32 Len, \r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  if (Key != NULL) {\r
+    mKey = new INT8[strlen (Key) + 1];\r
+    if (mKey != NULL) {\r
+      strcpy (mKey, Key);\r
+    }\r
+  } else {\r
+    mKey = NULL;\r
+  }\r
+  mAddr   = Addr;\r
+  mLen    = Len;\r
+  mFlag   = PENDING;\r
+  mLineNo = LineNo;\r
+  mNext   = NULL;\r
+}\r
+\r
+SPendingAssign::~SPendingAssign (\r
+  VOID\r
+  )\r
+{\r
+  if (mKey != NULL) {\r
+    delete mKey;\r
+  }\r
+  mAddr   = NULL;\r
+  mLen    = 0;\r
+  mLineNo = 0;\r
+  mNext   = NULL;\r
+}\r
+\r
+VOID\r
+SPendingAssign::SetAddrAndLen (\r
+  IN VOID   *Addr, \r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  mAddr   = Addr;\r
+  mLineNo = LineNo;\r
+}\r
+\r
+VOID\r
+SPendingAssign::AssignValue (\r
+  IN VOID   *Addr, \r
+  IN UINT32 Len\r
+  )\r
+{\r
+  memcpy (mAddr, Addr, (mLen < Len ? mLen : Len));\r
+  mFlag = ASSIGNED;\r
+}\r
+\r
+INT8 *\r
+SPendingAssign::GetKey (\r
+  VOID\r
+  )\r
+{\r
+  return mKey;\r
+}\r
+\r
+CFormPkg::CFormPkg (\r
+  IN UINT32 BufferSize = 4096\r
+  )\r
+{\r
+  CHAR8       *BufferStart;\r
+  CHAR8       *BufferEnd;\r
+  SBufferNode *Node;\r
+\r
+  mPkgLength           = 0;\r
+  mBufferNodeQueueHead = NULL;\r
+  mCurrBufferNode      = NULL;\r
+\r
+  Node = new SBufferNode;\r
+  if (Node == NULL) {\r
+    return ;\r
+  }\r
+  BufferStart = new CHAR8[BufferSize];\r
+  if (BufferStart == NULL) {\r
+    return;\r
+  }\r
+  BufferEnd   = BufferStart + BufferSize;\r
+\r
+  memset (BufferStart, 0, BufferSize);\r
+  Node->mBufferStart   = BufferStart;\r
+  Node->mBufferEnd     = BufferEnd;\r
+  Node->mBufferFree    = BufferStart;\r
+  Node->mNext          = NULL;\r
+\r
+  mBufferSize          = BufferSize;\r
+  mBufferNodeQueueHead = Node;\r
+  mBufferNodeQueueTail = Node;\r
+  mCurrBufferNode      = Node;\r
+}\r
+\r
+CFormPkg::~CFormPkg ()\r
+{\r
+  SBufferNode    *pBNode;\r
+  SPendingAssign *pPNode;\r
+\r
+  while (mBufferNodeQueueHead != NULL) {\r
+    pBNode = mBufferNodeQueueHead;\r
+    mBufferNodeQueueHead = mBufferNodeQueueHead->mNext;\r
+    if (pBNode->mBufferStart != NULL) {\r
+      delete pBNode->mBufferStart;\r
+      delete pBNode;\r
+    }\r
+  }\r
+  mBufferNodeQueueTail = NULL;\r
+  mCurrBufferNode      = NULL;\r
+\r
+  while (PendingAssignList != NULL) {\r
+    pPNode = PendingAssignList;\r
+    PendingAssignList = PendingAssignList->mNext;\r
+    delete pPNode;\r
+  }\r
+  PendingAssignList = NULL;\r
+}\r
+\r
+CHAR8 *\r
+CFormPkg::IfrBinBufferGet (\r
+  IN UINT32 Len\r
+  )\r
+{\r
+  CHAR8 *BinBuffer = NULL;\r
+\r
+  if ((Len == 0) || (Len > mBufferSize)) {\r
+    return NULL;\r
+  }\r
+\r
+  if ((mCurrBufferNode->mBufferFree + Len) <= mCurrBufferNode->mBufferEnd) {\r
+    BinBuffer = mCurrBufferNode->mBufferFree;\r
+    mCurrBufferNode->mBufferFree += Len;\r
+  } else {\r
+    SBufferNode *Node;\r
+\r
+    Node = new SBufferNode;\r
+    if (Node == NULL) {\r
+      return NULL;\r
+    }\r
+\r
+    Node->mBufferStart = new CHAR8[mBufferSize];\r
+    if (Node->mBufferStart == NULL) {\r
+      delete Node;\r
+      return NULL;\r
+    } else {\r
+      memset (Node->mBufferStart, 0, mBufferSize);\r
+      Node->mBufferEnd  = Node->mBufferStart + mBufferSize;\r
+      Node->mBufferFree = Node->mBufferStart;\r
+      Node->mNext       = NULL;\r
+    }\r
+\r
+    if (mBufferNodeQueueTail == NULL) {\r
+      mBufferNodeQueueHead = mBufferNodeQueueTail = Node;\r
+    } else {\r
+      mBufferNodeQueueTail->mNext = Node;\r
+      mBufferNodeQueueTail = Node;\r
+    }\r
+    mCurrBufferNode = Node;\r
+\r
+    //\r
+    // Now try again.\r
+    //\r
+    BinBuffer = mCurrBufferNode->mBufferFree;\r
+    mCurrBufferNode->mBufferFree += Len;\r
+  }\r
+\r
+  mPkgLength += Len;\r
+\r
+  return BinBuffer;\r
+}\r
+\r
+inline\r
+UINT32\r
+CFormPkg::GetPkgLength (\r
+  VOID\r
+  )\r
+{\r
+  return mPkgLength;\r
+}\r
+\r
+VOID\r
+CFormPkg::Open (\r
+  VOID\r
+  )\r
+{\r
+  mReadBufferNode   = mBufferNodeQueueHead;\r
+  mReadBufferOffset = 0;\r
+}\r
+\r
+VOID\r
+CFormPkg::Close (\r
+  VOID\r
+  )\r
+{\r
+  mReadBufferNode   = NULL;\r
+  mReadBufferOffset = 0;\r
+}\r
+\r
+UINT32\r
+CFormPkg::Read (\r
+  IN CHAR8     *Buffer, \r
+  IN UINT32    Size\r
+  )\r
+{\r
+  UINT32       Index;\r
+\r
+  if ((Size == 0) || (Buffer == NULL)) {\r
+    return 0;\r
+  }\r
+\r
+  if (mReadBufferNode == NULL) {\r
+       return 0;\r
+  }\r
+\r
+  for (Index = 0; Index < Size; Index++) {\r
+    if ((mReadBufferNode->mBufferStart + mReadBufferOffset) < mReadBufferNode->mBufferFree) {\r
+      Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];\r
+    } else {\r
+      if ((mReadBufferNode = mReadBufferNode->mNext) == NULL) {\r
+        return Index;\r
+      } else {\r
+        mReadBufferOffset = 0;\r
+        Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];\r
+      }\r
+    }\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CFormPkg::BuildPkgHdr (\r
+  OUT EFI_HII_PACKAGE_HEADER **PkgHdr\r
+  )\r
+{\r
+  if (PkgHdr == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  if (((*PkgHdr) = new EFI_HII_PACKAGE_HEADER) == NULL) {\r
+    return VFR_RETURN_OUT_FOR_RESOURCES;\r
+  }\r
+\r
+  (*PkgHdr)->Type = EFI_HII_PACKAGE_FORM;\r
+  (*PkgHdr)->Length = mPkgLength + sizeof (EFI_HII_PACKAGE_HEADER);\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CFormPkg::BuildPkg (\r
+  IN FILE  *Output\r
+  )\r
+{\r
+  EFI_VFR_RETURN_CODE     Ret;\r
+  CHAR8                   Buffer[1024];\r
+  UINT32                  Size;\r
+  EFI_HII_PACKAGE_HEADER  *PkgHdr;\r
+\r
+  if (Output == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {\r
+    return Ret;\r
+  }\r
+  fwrite (PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER), 1, Output);\r
+  delete PkgHdr;\r
+\r
+  Open ();\r
+  while ((Size = Read (Buffer, 1024)) != 0) {\r
+    fwrite (Buffer, Size, 1, Output);\r
+  }\r
+  Close ();\r
+\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID\r
+CFormPkg::_WRITE_PKG_LINE (\r
+  IN FILE   *pFile,\r
+  IN UINT32 LineBytes,\r
+  IN INT8   *LineHeader,\r
+  IN INT8   *BlkBuf,\r
+  IN UINT32 BlkSize\r
+  )\r
+{\r
+  UINT32    Index;\r
+\r
+  if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
+    return;\r
+  }\r
+\r
+  for (Index = 0; Index < BlkSize; Index++) {\r
+    if ((Index % LineBytes) == 0) {\r
+      fprintf (pFile, "\n%s", LineHeader);\r
+    }\r
+    fprintf (pFile, "0x%02X,  ", (UINT8)BlkBuf[Index]);\r
+  }\r
+}\r
+\r
+VOID\r
+CFormPkg::_WRITE_PKG_END (\r
+  IN FILE   *pFile,\r
+  IN UINT32 LineBytes,\r
+  IN INT8   *LineHeader,\r
+  IN INT8   *BlkBuf,\r
+  IN UINT32 BlkSize\r
+  )\r
+{\r
+  UINT32    Index;\r
+\r
+  if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
+    return;\r
+  }\r
+\r
+  for (Index = 0; Index < BlkSize - 1; Index++) {\r
+    if ((Index % LineBytes) == 0) {\r
+      fprintf (pFile, "\n%s", LineHeader);\r
+    }\r
+    fprintf (pFile, "0x%02X,  ", (UINT8)BlkBuf[Index]);\r
+  }\r
+\r
+  if ((Index % LineBytes) == 0) {\r
+    fprintf (pFile, "\n%s", LineHeader);\r
+  }\r
+  fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);\r
+}\r
+\r
+#define BYTES_PRE_LINE 0x10\r
+\r
+EFI_VFR_RETURN_CODE \r
+CFormPkg::GenCFile (\r
+  IN INT8 *BaseName,\r
+  IN FILE *pFile\r
+  )\r
+{\r
+  EFI_VFR_RETURN_CODE          Ret;\r
+  INT8                         Buffer[BYTES_PRE_LINE * 8];\r
+  EFI_HII_PACKAGE_HEADER       *PkgHdr;\r
+  UINT32                       PkgLength  = 0;\r
+  UINT32                       ReadSize   = 0;\r
+\r
+  if ((BaseName == NULL) || (pFile == NULL)) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  fprintf (pFile, "\nunsigned char %sBin[] = {\n", BaseName);\r
+\r
+  if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {\r
+    return Ret;\r
+  }\r
+\r
+  fprintf (pFile, "  // ARRAY LENGTH\n");\r
+  PkgLength = PkgHdr->Length + sizeof (UINT32);\r
+  _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, "  ", (INT8 *)&PkgLength, sizeof (UINT32));\r
+\r
+  fprintf (pFile, "\n\n  // PACKAGE HEADER\n");\r
+  _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, "  ", (INT8 *)PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
+  PkgLength = sizeof (EFI_HII_PACKAGE_HEADER);\r
+\r
+  fprintf (pFile, "\n\n  // PACKAGE DATA\n");\r
+  Open ();\r
+  while ((ReadSize = Read ((CHAR8 *)Buffer, BYTES_PRE_LINE * 8)) != 0) {\r
+    PkgLength += ReadSize;\r
+    if (PkgLength < PkgHdr->Length) {\r
+      _WRITE_PKG_LINE (pFile, BYTES_PRE_LINE, "  ", Buffer, ReadSize);\r
+    } else {\r
+      _WRITE_PKG_END (pFile, BYTES_PRE_LINE, "  ", Buffer, ReadSize);\r
+    }\r
+  }\r
+  Close ();\r
+\r
+  delete PkgHdr;\r
+  fprintf (pFile, "\n};\n");\r
+\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CFormPkg::AssignPending (\r
+  IN INT8   *Key, \r
+  IN VOID   *ValAddr, \r
+  IN UINT32 ValLen,\r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  SPendingAssign *pNew;\r
+\r
+  pNew = new SPendingAssign (Key, ValAddr, ValLen, LineNo);\r
+  if (pNew == NULL) {\r
+    return VFR_RETURN_OUT_FOR_RESOURCES;\r
+  }\r
+\r
+  pNew->mNext       = PendingAssignList;\r
+  PendingAssignList = pNew;\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID\r
+CFormPkg::DoPendingAssign (\r
+  IN INT8   *Key, \r
+  IN VOID   *ValAddr, \r
+  IN UINT32 ValLen\r
+  )\r
+{\r
+  SPendingAssign *pNode;\r
+\r
+  if ((Key == NULL) || (ValAddr == NULL)) {\r
+    return;\r
+  }\r
+\r
+  for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (strcmp (pNode->mKey, Key) == 0) {\r
+      pNode->AssignValue (ValAddr, ValLen);\r
+    }\r
+  }\r
+}\r
+\r
+bool\r
+CFormPkg::HavePendingUnassigned (\r
+  VOID\r
+  )\r
+{\r
+  SPendingAssign *pNode;\r
+\r
+  for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mFlag == PENDING) {\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+VOID\r
+CFormPkg::PendingAssignPrintAll (\r
+  VOID\r
+  )\r
+{\r
+  SPendingAssign *pNode;\r
+\r
+  for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mFlag == PENDING) {\r
+      gCVfrErrorHandle.PrintError (pNode->mLineNo, pNode->mKey, "can not assign value because not defined");\r
+    }\r
+  }\r
+}\r
+\r
+CFormPkg gCFormPkg;\r
+\r
+SIfrRecord::SIfrRecord (\r
+  VOID\r
+  )\r
+{\r
+  mIfrBinBuf = NULL;\r
+  mBinBufLen = 0;\r
+  mLineNo    = 0xFFFFFFFF;\r
+  mOffset    = 0xFFFFFFFF;\r
+  mNext      = NULL;\r
+}\r
+\r
+SIfrRecord::~SIfrRecord (\r
+  VOID\r
+  )\r
+{\r
+  if (mIfrBinBuf != NULL) {\r
+    delete mIfrBinBuf;\r
+    mIfrBinBuf = NULL;\r
+  }\r
+  mLineNo      = 0xFFFFFFFF;\r
+  mOffset      = 0xFFFFFFFF;\r
+  mBinBufLen   = 0;\r
+  mNext        = NULL;\r
+}\r
+\r
+CIfrRecordInfoDB::CIfrRecordInfoDB (\r
+  VOID\r
+  )\r
+{\r
+  mSwitch            = FALSE;\r
+  mRecordCount       = EFI_IFR_RECORDINFO_IDX_START;\r
+  mIfrRecordListHead = NULL;\r
+  mIfrRecordListTail = NULL;\r
+}\r
+\r
+CIfrRecordInfoDB::~CIfrRecordInfoDB (\r
+  VOID\r
+  )\r
+{\r
+  SIfrRecord *pNode;\r
+\r
+  while (mIfrRecordListHead != NULL) {\r
+    pNode = mIfrRecordListHead;\r
+    mIfrRecordListHead = mIfrRecordListHead->mNext;\r
+    delete pNode;\r
+  }\r
+}\r
+\r
+SIfrRecord *\r
+CIfrRecordInfoDB::GetRecordInfoFromIdx (\r
+  IN UINT32 RecordIdx\r
+  )\r
+{\r
+  UINT32     Idx;\r
+  SIfrRecord *pNode = NULL;\r
+\r
+  if (RecordIdx == EFI_IFR_RECORDINFO_IDX_INVALUD) {\r
+    return NULL;\r
+  }\r
+\r
+  for (Idx = (EFI_IFR_RECORDINFO_IDX_START + 1), pNode = mIfrRecordListHead; \r
+       (Idx != RecordIdx) && (pNode != NULL); \r
+       Idx++, pNode = pNode->mNext)\r
+  ;\r
+\r
+  return pNode;\r
+}\r
+\r
+UINT32\r
+CIfrRecordInfoDB::IfrRecordRegister (\r
+  IN UINT32 LineNo, \r
+  IN CHAR8  *IfrBinBuf, \r
+  IN UINT8  BinBufLen,\r
+  IN UINT32 Offset\r
+  )\r
+{\r
+  SIfrRecord *pNew;\r
+\r
+  if (mSwitch == FALSE) {\r
+    return EFI_IFR_RECORDINFO_IDX_INVALUD;\r
+  }\r
+\r
+  if ((pNew = new SIfrRecord) == NULL) {\r
+    return EFI_IFR_RECORDINFO_IDX_INVALUD;\r
+  }\r
+\r
+  if (mIfrRecordListHead == NULL) {\r
+    mIfrRecordListHead = pNew;\r
+    mIfrRecordListTail = pNew;\r
+  } else {\r
+    mIfrRecordListTail->mNext = pNew;\r
+    mIfrRecordListTail = pNew;\r
+  }\r
+  mRecordCount++;\r
+\r
+  return mRecordCount;\r
+}\r
+\r
+VOID\r
+CIfrRecordInfoDB::IfrRecordInfoUpdate (\r
+  IN UINT32 RecordIdx, \r
+  IN UINT32 LineNo,\r
+  IN CHAR8  *BinBuf,\r
+  IN UINT8  BinBufLen,\r
+  IN UINT32 Offset\r
+  )\r
+{\r
+  SIfrRecord *pNode;\r
+\r
+  if ((pNode = GetRecordInfoFromIdx (RecordIdx)) == NULL) {\r
+    return;\r
+  }\r
+\r
+  pNode->mLineNo    = LineNo;\r
+  pNode->mOffset    = Offset;\r
+  pNode->mBinBufLen = BinBufLen;\r
+  if (BinBuf != NULL) {\r
+    if (pNode->mIfrBinBuf != NULL) {\r
+      delete pNode->mIfrBinBuf;\r
+    }\r
+    pNode->mIfrBinBuf = new CHAR8[BinBufLen];\r
+    if (pNode->mIfrBinBuf != NULL) {\r
+      memcpy (pNode->mIfrBinBuf, BinBuf, BinBufLen);\r
+    }\r
+  }\r
+}\r
+\r
+VOID\r
+CIfrRecordInfoDB::IfrRecordOutput (\r
+  IN FILE   *File,\r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  SIfrRecord *pNode;\r
+  UINT8      Index;\r
+\r
+  if (mSwitch == FALSE) {\r
+    return;\r
+  }\r
+\r
+  if (File == NULL) {\r
+    return;\r
+  }\r
+\r
+  for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mLineNo == LineNo) {\r
+      fprintf (File, ">%08X: ", pNode->mOffset);\r
+      if (pNode->mIfrBinBuf != NULL) {\r
+        for (Index = 0; Index < pNode->mBinBufLen; Index++) {\r
+          fprintf (File, "%02X ", pNode->mIfrBinBuf[Index]);\r
+        }\r
+      }\r
+      fprintf (File, "\n");\r
+    }\r
+  }\r
+}\r
+\r
+CIfrRecordInfoDB gCIfrRecordInfoDB;\r
+\r
+VOID\r
+CIfrObj::_EMIT_PENDING_OBJ (\r
+  VOID\r
+  )\r
+{\r
+  CHAR8  *ObjBinBuf = NULL;\r
+\r
+  ObjBinBuf = gCFormPkg.IfrBinBufferGet (mObjBinLen);\r
+  if (ObjBinBuf != NULL) {\r
+    memcpy (ObjBinBuf, mObjBinBuf, mObjBinLen);\r
+  }\r
+\r
+  if (mObjBinBuf != NULL) {\r
+    delete mObjBinBuf;\r
+  }\r
+}\r
+\r
+/*\r
+ * The definition of CIfrObj's member function\r
+ */\r
+static struct {\r
+  UINT8  mSize;\r
+  UINT8  mScope;\r
+} gOpcodeSizesScopeTable[] = {\r
+  { 0, 0 },                                    // EFI_IFR_INVALID - 0x00\r
+  { sizeof (EFI_IFR_FORM), 1 },                // EFI_IFR_FORM_OP\r
+  { sizeof (EFI_IFR_SUBTITLE), 1 },            // EFI_IFR_SUBTITLE_OP\r
+  { sizeof (EFI_IFR_TEXT), 0 },                // EFI_IFR_TEXT_OP\r
+  { sizeof (EFI_IFR_IMAGE), 0 },               // EFI_IFR_IMAGE_OP\r
+  { sizeof (EFI_IFR_ONE_OF), 1 },              // EFI_IFR_ONE_OF_OP - 0x05\r
+  { sizeof (EFI_IFR_CHECKBOX), 1},             // EFI_IFR_CHECKBOX_OP\r
+  { sizeof (EFI_IFR_NUMERIC), 1 },             // EFI_IFR_NUMERIC_OP\r
+  { sizeof (EFI_IFR_PASSWORD), 1 },            // EFI_IFR_PASSWORD_OP\r
+  { sizeof (EFI_IFR_ONE_OF_OPTION), 0 },       // EFI_IFR_ONE_OF_OPTION_OP\r
+  { sizeof (EFI_IFR_SUPPRESS_IF), 1 },         // EFI_IFR_SUPPRESS_IF - 0x0A\r
+  { sizeof (EFI_IFR_LOCKED), 0 },              // EFI_IFR_LOCKED_OP\r
+  { sizeof (EFI_IFR_ACTION), 1 },              // EFI_IFR_ACTION_OP\r
+  { sizeof (EFI_IFR_RESET_BUTTON), 1 },        // EFI_IFR_RESET_BUTTON_OP\r
+  { sizeof (EFI_IFR_FORM_SET), 1 },            // EFI_IFR_FORM_SET_OP -0xE\r
+  { sizeof (EFI_IFR_REF), 0 },                 // EFI_IFR_REF_OP\r
+  { sizeof (EFI_IFR_NO_SUBMIT_IF), 1},         // EFI_IFR_NO_SUBMIT_IF_OP -0x10\r
+  { sizeof (EFI_IFR_INCONSISTENT_IF), 1 },     // EFI_IFR_INCONSISTENT_IF_OP\r
+  { sizeof (EFI_IFR_EQ_ID_VAL), 0 },           // EFI_IFR_EQ_ID_VAL_OP\r
+  { sizeof (EFI_IFR_EQ_ID_ID), 0 },            // EFI_IFR_EQ_ID_ID_OP\r
+  { sizeof (EFI_IFR_EQ_ID_LIST), 0 },          // EFI_IFR_EQ_ID_LIST_OP - 0x14\r
+  { sizeof (EFI_IFR_AND), 0 },                 // EFI_IFR_AND_OP\r
+  { sizeof (EFI_IFR_OR), 0 },                  // EFI_IFR_OR_OP\r
+  { sizeof (EFI_IFR_NOT), 0 },                 // EFI_IFR_NOT_OP\r
+  { sizeof (EFI_IFR_RULE), 1 },                // EFI_IFR_RULE_OP\r
+  { sizeof (EFI_IFR_GRAY_OUT_IF), 1 },         // EFI_IFR_GRAYOUT_IF_OP - 0x19\r
+  { sizeof (EFI_IFR_DATE), 1 },                // EFI_IFR_DATE_OP\r
+  { sizeof (EFI_IFR_TIME), 1 },                // EFI_IFR_TIME_OP\r
+  { sizeof (EFI_IFR_STRING), 1 },              // EFI_IFR_STRING_OP\r
+  { sizeof (EFI_IFR_REFRESH), 1 },             // EFI_IFR_REFRESH_OP\r
+  { sizeof (EFI_IFR_DISABLE_IF), 1 },          // EFI_IFR_DISABLE_IF_OP - 0x1E\r
+  { 0, 0 },                                    // 0x1F\r
+  { sizeof (EFI_IFR_TO_LOWER), 0 },            // EFI_IFR_TO_LOWER_OP - 0x20\r
+  { sizeof (EFI_IFR_TO_UPPER), 0 },            // EFI_IFR_TO_UPPER_OP - 0x21\r
+  { 0, 0 },                                    // 0x22\r
+  { sizeof (EFI_IFR_ORDERED_LIST), 1 },        // EFI_IFR_ORDERED_LIST_OP - 0x23\r
+  { sizeof (EFI_IFR_VARSTORE), 0 },            // EFI_IFR_VARSTORE_OP\r
+  { sizeof (EFI_IFR_VARSTORE_NAME_VALUE), 0 }, // EFI_IFR_VARSTORE_NAME_VALUE_OP\r
+  { sizeof (EFI_IFR_VARSTORE_EFI), 0 },        // EFI_IFR_VARSTORE_EFI_OP\r
+  { sizeof (EFI_IFR_VARSTORE_DEVICE), 1 },     // EFI_IFR_VARSTORE_DEVICE_OP\r
+  { sizeof (EFI_IFR_VERSION), 0 },             // EFI_IFR_VERSION_OP - 0x28\r
+  { sizeof (EFI_IFR_END), 0 },                 // EFI_IFR_END_OP\r
+  { sizeof (EFI_IFR_MATCH), 1 },               // EFI_IFR_MATCH_OP - 0x2A\r
+  { 0, 0 }, { 0, 0} , { 0, 0} , { 0, 0} ,      // 0x2B ~ 0x2E\r
+  { sizeof (EFI_IFR_EQUAL), 0 },               // EFI_IFR_EQUAL_OP - 0x2F\r
+  { sizeof (EFI_IFR_NOT_EQUAL), 0 },           // EFI_IFR_NOT_EQUAL_OP\r
+  { sizeof (EFI_IFR_GREATER_THAN), 0 },        // EFI_IFR_GREATER_THAN_OP\r
+  { sizeof (EFI_IFR_GREATER_EQUAL), 0 },       // EFI_IFR_GREATER_EQUAL_OP\r
+  { sizeof (EFI_IFR_LESS_THAN), 0 },           // EFI_IFR_LESS_THAN_OP\r
+  { sizeof (EFI_IFR_LESS_EQUAL), 0 },          // EFI_IFR_LESS_EQUAL_OP - 0x34\r
+  { sizeof (EFI_IFR_BITWISE_AND), 0 },         // EFI_IFR_BITWISE_AND_OP\r
+  { sizeof (EFI_IFR_BITWISE_OR), 0 },          // EFI_IFR_BITWISE_OR_OP\r
+  { sizeof (EFI_IFR_BITWISE_NOT), 0 },         // EFI_IFR_BITWISE_NOT_OP\r
+  { sizeof (EFI_IFR_SHIFT_LEFT), 0 },          // EFI_IFR_SHIFT_LEFT_OP\r
+  { sizeof (EFI_IFR_SHIFT_RIGHT), 0 },         // EFI_IFR_SHIFT_RIGHT_OP\r
+  { sizeof (EFI_IFR_ADD), 0 },                 // EFI_IFR_ADD_OP - 0x3A\r
+  { sizeof (EFI_IFR_SUBTRACT), 0 },            // EFI_IFR_SUBTRACT_OP\r
+  { sizeof (EFI_IFR_MULTIPLY), 0 },            // EFI_IFR_MULTIPLY_OP\r
+  { sizeof (EFI_IFR_DIVIDE), 0 },              // EFI_IFR_DIVIDE_OP\r
+  { sizeof (EFI_IFR_MODULO), 0 },              // EFI_IFR_MODULO_OP - 0x3E\r
+  { sizeof (EFI_IFR_RULE_REF), 0 },            // EFI_IFR_RULE_REF_OP\r
+  { sizeof (EFI_IFR_QUESTION_REF1), 0 },       // EFI_IFR_QUESTION_REF1_OP\r
+  { sizeof (EFI_IFR_QUESTION_REF2), 0 },       // EFI_IFR_QUESTION_REF2_OP - 0x41\r
+  { sizeof (EFI_IFR_UINT8), 0},                // EFI_IFR_UINT8\r
+  { sizeof (EFI_IFR_UINT16), 0},               // EFI_IFR_UINT16\r
+  { sizeof (EFI_IFR_UINT32), 0},               // EFI_IFR_UINT32\r
+  { sizeof (EFI_IFR_UINT64), 0},               // EFI_IFR_UTNT64\r
+  { sizeof (EFI_IFR_TRUE), 0 },                // EFI_IFR_TRUE_OP - 0x46\r
+  { sizeof (EFI_IFR_FALSE), 0 },               // EFI_IFR_FALSE_OP\r
+  { sizeof (EFI_IFR_TO_UINT), 0 },             // EFI_IFR_TO_UINT_OP\r
+  { sizeof (EFI_IFR_TO_STRING), 0 },           // EFI_IFR_TO_STRING_OP\r
+  { sizeof (EFI_IFR_TO_BOOLEAN), 0 },          // EFI_IFR_TO_BOOLEAN_OP\r
+  { sizeof (EFI_IFR_MID), 0 },                 // EFI_IFR_MID_OP\r
+  { sizeof (EFI_IFR_FIND), 0 },                // EFI_IFR_FIND_OP\r
+  { sizeof (EFI_IFR_TOKEN), 0 },               // EFI_IFR_TOKEN_OP\r
+  { sizeof (EFI_IFR_STRING_REF1), 0 },         // EFI_IFR_STRING_REF1_OP - 0x4E\r
+  { sizeof (EFI_IFR_STRING_REF2), 0 },         // EFI_IFR_STRING_REF2_OP\r
+  { sizeof (EFI_IFR_CONDITIONAL), 0 },         // EFI_IFR_CONDITIONAL_OP\r
+  { sizeof (EFI_IFR_QUESTION_REF3), 0 },       // EFI_IFR_QUESTION_REF3_OP\r
+  { sizeof (EFI_IFR_ZERO), 0 },                // EFI_IFR_ZERO_OP\r
+  { sizeof (EFI_IFR_ONE), 0 },                 // EFI_IFR_ONE_OP\r
+  { sizeof (EFI_IFR_ONES), 0 },                // EFI_IFR_ONES_OP\r
+  { sizeof (EFI_IFR_UNDEFINED), 0 },           // EFI_IFR_UNDEFINED_OP\r
+  { sizeof (EFI_IFR_LENGTH), 0 },              // EFI_IFR_LENGTH_OP\r
+  { sizeof (EFI_IFR_DUP), 0 },                 // EFI_IFR_DUP_OP - 0x57\r
+  { sizeof (EFI_IFR_THIS), 0 },                // EFI_IFR_THIS_OP\r
+  { sizeof (EFI_IFR_SPAN), 0 },                // EFI_IFR_SPAN_OP\r
+  { sizeof (EFI_IFR_VALUE), 1 },               // EFI_IFR_VALUE_OP\r
+  { sizeof (EFI_IFR_DEFAULT), 0 },             // EFI_IFR_DEFAULT_OP\r
+  { sizeof (EFI_IFR_DEFAULTSTORE), 0 },        // EFI_IFR_DEFAULTSTORE_OP - 0x5C\r
+  { 0, 0},                                     // 0x5D\r
+  { sizeof (EFI_IFR_CATENATE), 0 },            // EFI_IFR_CATENATE_OP\r
+  { sizeof (EFI_IFR_GUID), 0 },                // EFI_IFR_GUID_OP\r
+};\r
+\r
+#ifdef CIFROBJ_DEUBG\r
+static struct {\r
+  INT8 *mIfrName;\r
+} gIfrObjPrintDebugTable[] = {\r
+  "EFI_IFR_INVALID",    "EFI_IFR_FORM",                 "EFI_IFR_SUBTITLE",      "EFI_IFR_TEXT",            "EFI_IFR_IMAGE",         "EFI_IFR_ONE_OF",\r
+  "EFI_IFR_CHECKBOX",   "EFI_IFR_NUMERIC",              "EFI_IFR_PASSWORD",      "EFI_IFR_ONE_OF_OPTION",   "EFI_IFR_SUPPRESS_IF",   "EFI_IFR_LOCKED",\r
+  "EFI_IFR_ACTION",     "EFI_IFR_RESET_BUTTON",         "EFI_IFR_FORM_SET",      "EFI_IFR_REF",             "EFI_IFR_NO_SUBMIT_IF",  "EFI_IFR_INCONSISTENT_IF",\r
+  "EFI_IFR_EQ_ID_VAL",  "EFI_IFR_EQ_ID_ID",             "EFI_IFR_EQ_ID_LIST",    "EFI_IFR_AND",             "EFI_IFR_OR",            "EFI_IFR_NOT",\r
+  "EFI_IFR_RULE",       "EFI_IFR_GRAY_OUT_IF",          "EFI_IFR_DATE",          "EFI_IFR_TIME",            "EFI_IFR_STRING",        "EFI_IFR_REFRESH",\r
+  "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID",              "EFI_IFR_TO_LOWER",      "EFI_IFR_TO_UPPER",        "EFI_IFR_INVALID",       "EFI_IFR_ORDERED_LIST",\r
+  "EFI_IFR_VARSTORE",   "EFI_IFR_VARSTORE_NAME_VALUE",  "EFI_IFR_VARSTORE_EFI",  "EFI_IFR_VARSTORE_DEVICE", "EFI_IFR_VERSION",       "EFI_IFR_END",\r
+  "EFI_IFR_MATCH",      "EFI_IFR_INVALID",              "EFI_IFR_INVALID",       "EFI_IFR_INVALID",         "EFI_IFR_INVALID",       "EFI_IFR_EQUAL",\r
+  "EFI_IFR_NOT_EQUAL",  "EFI_IFR_GREATER_THAN",         "EFI_IFR_GREATER_EQUAL", "EFI_IFR_LESS_THAN",       "EFI_IFR_LESS_EQUAL",    "EFI_IFR_BITWISE_AND",\r
+  "EFI_IFR_BITWISE_OR", "EFI_IFR_BITWISE_NOT",          "EFI_IFR_SHIFT_LEFT",    "EFI_IFR_SHIFT_RIGHT",     "EFI_IFR_ADD",           "EFI_IFR_SUBTRACT",\r
+  "EFI_IFR_MULTIPLY",   "EFI_IFR_DIVIDE",               "EFI_IFR_MODULO",        "EFI_IFR_RULE_REF",        "EFI_IFR_QUESTION_REF1", "EFI_IFR_QUESTION_REF2",\r
+  "EFI_IFR_UINT8",      "EFI_IFR_UINT16",               "EFI_IFR_UINT32",        "EFI_IFR_UINT64",          "EFI_IFR_TRUE",          "EFI_IFR_FALSE",\r
+  "EFI_IFR_TO_UINT",    "EFI_IFR_TO_STRING",            "EFI_IFR_TO_BOOLEAN",    "EFI_IFR_MID",             "EFI_IFR_FIND",          "EFI_IFR_TOKEN",\r
+  "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2",          "EFI_IFR_CONDITIONAL",   "EFI_IFR_QUESTION_REF3",   "EFI_IFR_ZERO",          "EFI_IFR_ONE",\r
+  "EFI_IFR_ONES",       "EFI_IFR_UNDEFINED",            "EFI_IFR_LENGTH",        "EFI_IFR_DUP",             "EFI_IFR_THIS",          "EFI_IFR_SPAN",\r
+  "EFI_IFR_VALUE",      "EFI_IFR_DEFAULT",              "EFI_IFR_DEFAULTSTORE",  "EFI_IFR_INVALID",         "EFI_IFR_CATENATE",      "EFI_IFR_GUID",\r
+};\r
+\r
+VOID\r
+CIFROBJ_DEBUG_PRINT (\r
+  IN UINT8 OpCode\r
+  )\r
+{\r
+  printf ("======Create IFR [%s]\n", gIfrObjPrintDebugTable[OpCode].mIfrName);\r
+}\r
+#else\r
+\r
+#define CIFROBJ_DEBUG_PRINT(OpCode)\r
+\r
+#endif\r
+\r
+bool gCreateOp = TRUE;\r
+\r
+CIfrObj::CIfrObj (\r
+  IN  UINT8   OpCode,\r
+  OUT CHAR8   **IfrObj,\r
+  IN  UINT8   ObjBinLen,\r
+  IN  BOOLEAN DelayEmit\r
+  )\r
+{\r
+  mDelayEmit   = DelayEmit;\r
+  mPkgOffset   = gCFormPkg.GetPkgLength ();\r
+  mObjBinLen   = (ObjBinLen == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : ObjBinLen;\r
+  mObjBinBuf   = ((DelayEmit == FALSE) && (gCreateOp == TRUE)) ? gCFormPkg.IfrBinBufferGet (mObjBinLen) : new CHAR8[EFI_IFR_MAX_LENGTH];\r
+  mRecordIdx   = (gCreateOp == TRUE) ? gCIfrRecordInfoDB.IfrRecordRegister (0xFFFFFFFF, mObjBinBuf, mObjBinLen, mPkgOffset) : EFI_IFR_RECORDINFO_IDX_INVALUD;\r
+\r
+  if (IfrObj != NULL) {\r
+    *IfrObj    = mObjBinBuf;\r
+  }\r
+\r
+  CIFROBJ_DEBUG_PRINT (OpCode);\r
+}\r
+\r
+CIfrObj::~CIfrObj (\r
+  VOID\r
+  )\r
+{\r
+  if ((mDelayEmit == TRUE) && ((gCreateOp == TRUE))) {\r
+    _EMIT_PENDING_OBJ ();\r
+  }\r
+\r
+  gCIfrRecordInfoDB.IfrRecordInfoUpdate (mRecordIdx, mLineNo, mObjBinBuf, mObjBinLen, mPkgOffset);\r
+}\r
+\r
+/*\r
+ * The definition of CIfrObj's member function\r
+ */\r
+UINT8 gScopeCount = 0;\r
+\r
+CIfrOpHeader::CIfrOpHeader (\r
+  IN UINT8 OpCode, \r
+  IN VOID *StartAddr,\r
+  IN UINT8 Length \r
+  ) : mHeader ((EFI_IFR_OP_HEADER *)StartAddr) \r
+{\r
+  mHeader->OpCode = OpCode;\r
+  mHeader->Length = (Length == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : Length;\r
+  mHeader->Scope  = (gOpcodeSizesScopeTable[OpCode].mScope + gScopeCount > 0) ? 1 : 0;\r
+}\r
+\r
+CIfrOpHeader::CIfrOpHeader (\r
+  IN CIfrOpHeader &OpHdr\r
+  )\r
+{\r
+  mHeader = OpHdr.mHeader;\r
+}\r
+\r
+UINT32 CIfrForm::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };\r
diff --git a/Source/C/VfrCompile/VfrFormPkg.h b/Source/C/VfrCompile/VfrFormPkg.h
new file mode 100644 (file)
index 0000000..67afbdd
--- /dev/null
@@ -0,0 +1,2252 @@
+#ifndef _EFIIFRCLASS_H_\r
+#define _EFIIFRCLASS_H_\r
+\r
+#include "string.h"\r
+#include "EfiVfr.h"\r
+#include "VfrError.h"\r
+#include "VfrUtilityLib.h"\r
+\r
+/*\r
+ * The functions below are used for flags setting\r
+ */\r
+static inline BOOLEAN _FLAGS_ZERO (\r
+  IN UINT8 &Flags\r
+  )\r
+{\r
+  return Flags == 0;\r
+}\r
+\r
+static inline VOID _FLAG_CLEAR (\r
+  IN UINT8 &Flags,\r
+  IN UINT8 Mask\r
+  )\r
+{\r
+  Flags &= (~Mask);\r
+}\r
+\r
+static inline UINT8 _FLAG_TEST_AND_CLEAR (\r
+  IN UINT8 &Flags,\r
+  IN UINT8 Mask\r
+  )\r
+{\r
+  UINT8 Ret = Flags & Mask;\r
+  Flags &= (~Mask);\r
+  return Ret;\r
+}\r
+\r
+static inline UINT8 _IS_EQUAL (\r
+  IN UINT8 &Flags,\r
+  IN UINT8 Value\r
+  )\r
+{\r
+  return Flags == Value;\r
+}\r
+\r
+/*\r
+ * The definition of CIfrBin\r
+ */\r
+typedef enum {\r
+  PENDING,\r
+  ASSIGNED\r
+} ASSIGN_FLAG;\r
+\r
+struct SPendingAssign {\r
+  INT8                    *mKey;  // key ! unique\r
+  VOID                    *mAddr;\r
+  UINT32                  mLen;\r
+  ASSIGN_FLAG             mFlag;\r
+  UINT32                  mLineNo;\r
+  struct SPendingAssign   *mNext;\r
+\r
+  SPendingAssign (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);\r
+  ~SPendingAssign ();\r
+\r
+  VOID   SetAddrAndLen (IN VOID *, IN UINT32);\r
+  VOID   AssignValue (IN VOID *, IN UINT32);\r
+  INT8 * GetKey (VOID);\r
+};\r
+\r
+struct SBufferNode {\r
+  CHAR8              *mBufferStart;\r
+  CHAR8              *mBufferEnd;\r
+  CHAR8              *mBufferFree;\r
+  struct SBufferNode *mNext;\r
+};\r
+\r
+class CFormPkg {\r
+private:\r
+  UINT32              mBufferSize;\r
+  SBufferNode         *mBufferNodeQueueHead;\r
+  SBufferNode         *mBufferNodeQueueTail;\r
+  SBufferNode         *mCurrBufferNode;\r
+\r
+  SBufferNode         *mReadBufferNode;\r
+  UINT32              mReadBufferOffset;\r
+\r
+  UINT32              mPkgLength;\r
+\r
+  VOID                _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN INT8 *, IN INT8 *, IN UINT32);\r
+  VOID                _WRITE_PKG_END (IN FILE *, IN UINT32 , IN INT8 *, IN INT8 *, IN UINT32);\r
+\r
+private:\r
+  SPendingAssign      *PendingAssignList;\r
+\r
+public:\r
+  CFormPkg (IN UINT32 BufferSize);\r
+  ~CFormPkg ();\r
+\r
+  CHAR8             * IfrBinBufferGet (IN UINT32);\r
+  inline UINT32       GetPkgLength (VOID);\r
+\r
+  VOID                Open ();\r
+  UINT32              Read (IN CHAR8 *, IN UINT32);\r
+  VOID                Close ();\r
+\r
+  EFI_VFR_RETURN_CODE BuildPkgHdr (OUT EFI_HII_PACKAGE_HEADER **);\r
+  EFI_VFR_RETURN_CODE BuildPkg (IN FILE *);\r
+  EFI_VFR_RETURN_CODE GenCFile (IN INT8 *, IN FILE *);\r
+\r
+public:\r
+  EFI_VFR_RETURN_CODE AssignPending (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);\r
+  VOID                DoPendingAssign (IN INT8 *, IN VOID *, IN UINT32);\r
+  bool                HavePendingUnassigned (VOID);\r
+  VOID                PendingAssignPrintAll (VOID);\r
+};\r
+\r
+extern CFormPkg gCFormPkg;\r
+\r
+struct SIfrRecord {\r
+  UINT32     mLineNo;\r
+  CHAR8      *mIfrBinBuf;\r
+  UINT8      mBinBufLen;\r
+  UINT32     mOffset;\r
+  SIfrRecord *mNext;\r
+\r
+  SIfrRecord (VOID);\r
+  ~SIfrRecord (VOID);\r
+};\r
+\r
+#define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF\r
+#define EFI_IFR_RECORDINFO_IDX_START   0x0\r
+\r
+class CIfrRecordInfoDB {\r
+private:\r
+  bool       mSwitch;\r
+  UINT32     mRecordCount;\r
+  SIfrRecord *mIfrRecordListHead;\r
+  SIfrRecord *mIfrRecordListTail;\r
+\r
+  SIfrRecord * GetRecordInfoFromIdx (IN UINT32);\r
+public:\r
+  CIfrRecordInfoDB (VOID);\r
+  ~CIfrRecordInfoDB (VOID);\r
+\r
+  inline VOID TurnOn (VOID) {\r
+    mSwitch = TRUE;\r
+  }\r
+\r
+  inline VOID TurnOff (VOID) {\r
+    mSwitch = FALSE;\r
+  }\r
+\r
+  UINT32      IfrRecordRegister (IN UINT32, IN CHAR8 *, IN UINT8, IN UINT32);\r
+  VOID        IfrRecordInfoUpdate (IN UINT32, IN UINT32, IN CHAR8*, IN UINT8, IN UINT32);\r
+  VOID        IfrRecordOutput (IN FILE *, IN UINT32 LineNo);\r
+};\r
+\r
+extern CIfrRecordInfoDB gCIfrRecordInfoDB;\r
+\r
+/*\r
+ * The definition of CIfrObj\r
+ */\r
+extern bool  gCreateOp;\r
+\r
+class CIfrObj {\r
+private:\r
+  bool    mDelayEmit;\r
+\r
+  CHAR8   *mObjBinBuf;\r
+  UINT8   mObjBinLen;\r
+  UINT32  mLineNo;\r
+  UINT32  mRecordIdx;\r
+  UINT32  mPkgOffset;\r
+\r
+  VOID    _EMIT_PENDING_OBJ (VOID);\r
+\r
+public:\r
+  CIfrObj (IN UINT8 OpCode, OUT CHAR8 **IfrObj = NULL, IN UINT8 ObjBinLen = 0, IN BOOLEAN DelayEmit = FALSE);\r
+  virtual ~CIfrObj(VOID);\r
+\r
+  inline VOID    SetLineNo (IN UINT32 LineNo) {\r
+    mLineNo = LineNo;\r
+  }\r
+\r
+  inline CHAR8 * GetObjBinAddr (VOID) {\r
+    return mObjBinBuf;\r
+  }\r
+\r
+  inline UINT8   GetObjBinLen (VOID) {\r
+    return mObjBinLen;\r
+  }\r
+\r
+  inline bool ExpendObjBin (IN UINT8 Size) {\r
+    if ((mDelayEmit == TRUE) && ((mObjBinLen + Size) > mObjBinLen)) {\r
+      mObjBinLen += Size;\r
+      return TRUE;\r
+    } else {\r
+      return FALSE;\r
+    }\r
+  }\r
+};\r
+\r
+/*\r
+ * The definition of CIfrOpHeader\r
+ */\r
+class CIfrOpHeader {\r
+private:\r
+  EFI_IFR_OP_HEADER *mHeader;\r
+\r
+public:\r
+  CIfrOpHeader (IN UINT8 OpCode, IN VOID *StartAddr, IN UINT8 Length = 0);\r
+  CIfrOpHeader (IN CIfrOpHeader &);\r
+\r
+  VOID IncLength (UINT8 Size) {\r
+    if ((mHeader->Length + Size) > mHeader->Length) {\r
+      mHeader->Length += Size;\r
+    }\r
+  }\r
+\r
+  VOID DecLength (UINT8 Size) {\r
+    if (mHeader->Length >= Size) {\r
+         mHeader -= Size;\r
+    }\r
+  }\r
+\r
+  UINT8 GetLength () {\r
+    return mHeader->Length;\r
+  }\r
+\r
+  UINT8 GetScope () {\r
+    return mHeader->Scope;\r
+  }\r
+\r
+  VOID SetScope (IN UINT8 Scope) {\r
+    mHeader->Scope = Scope;\r
+  }\r
+};\r
+\r
+extern UINT8 gScopeCount;\r
+\r
+/*\r
+ * The definition of CIfrStatementHeader\r
+ */\r
+class CIfrStatementHeader {\r
+private:\r
+  EFI_IFR_STATEMENT_HEADER *mHeader;\r
+\r
+public:\r
+  CIfrStatementHeader (\r
+    IN EFI_IFR_STATEMENT_HEADER *StartAddr\r
+  ) : mHeader ((EFI_IFR_STATEMENT_HEADER *)StartAddr) {\r
+    mHeader         = StartAddr;\r
+    mHeader->Help   = EFI_STRING_ID_INVALID;\r
+    mHeader->Prompt = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  EFI_IFR_STATEMENT_HEADER *GetStatementHeader () {\r
+    return mHeader;\r
+  }\r
+\r
+  VOID SetPrompt (IN EFI_STRING_ID Prompt) {\r
+    mHeader->Prompt = Prompt;\r
+  }\r
+\r
+  VOID SetHelp (IN EFI_STRING_ID Help) {\r
+    mHeader->Help = Help;\r
+  }\r
+};\r
+\r
+/*\r
+ * The definition of CIfrQuestionHeader\r
+ */\r
+#define EFI_IFR_QUESTION_FLAG_DEFAULT 0\r
+\r
+class CIfrQuestionHeader : public CIfrStatementHeader {\r
+private:\r
+  EFI_IFR_QUESTION_HEADER *mHeader;\r
+\r
+  EFI_IFR_STATEMENT_HEADER * QH2SH (EFI_IFR_QUESTION_HEADER *Qheader) {\r
+    return &(Qheader)->Header;\r
+  }\r
+\r
+public:\r
+  EFI_QUESTION_ID QUESTION_ID (VOID) {\r
+    return mHeader->QuestionId;\r
+  }\r
+\r
+  EFI_VARSTORE_ID VARSTORE_ID (VOID) {\r
+    return mHeader->VarStoreId;\r
+  }\r
+\r
+  VOID VARSTORE_INFO (OUT EFI_VARSTORE_INFO *Info) {\r
+    if (Info != NULL) {\r
+      Info->mVarStoreId   = mHeader->VarStoreId;\r
+      memcpy (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId));\r
+    }\r
+  }\r
+\r
+  UINT8 FLAGS (VOID) {\r
+    return mHeader->Flags;\r
+  }\r
+\r
+public:\r
+  CIfrQuestionHeader (\r
+    IN EFI_IFR_QUESTION_HEADER *StartAddr, \r
+    IN UINT8 Flags = EFI_IFR_QUESTION_FLAG_DEFAULT\r
+  ) : CIfrStatementHeader (QH2SH(StartAddr)) {\r
+    mHeader                         = StartAddr;\r
+    mHeader->QuestionId             = EFI_QUESTION_ID_INVALID;\r
+    mHeader->VarStoreId             = EFI_VARSTORE_ID_INVALID;\r
+    mHeader->VarStoreInfo.VarName   = EFI_STRING_ID_INVALID;\r
+    mHeader->VarStoreInfo.VarOffset = EFI_VAROFFSET_INVALID;\r
+    mHeader->Flags                  = Flags;\r
+  }\r
+\r
+  VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
+    mHeader->QuestionId = QuestionId;\r
+  }\r
+\r
+  VOID SetVarStoreInfo (IN EFI_VARSTORE_INFO *Info) {\r
+    mHeader->VarStoreId             = Info->mVarStoreId;\r
+       mHeader->VarStoreInfo.VarName   = Info->mInfo.mVarName;\r
+    mHeader->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 Flags) {\r
+    if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_READ_ONLY)) {\r
+      mHeader->Flags |= EFI_IFR_FLAG_READ_ONLY;\r
+    }\r
+\r
+    _FLAG_CLEAR (Flags, 0x02);\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_CALLBACK)) {\r
+      mHeader->Flags |= EFI_IFR_FLAG_CALLBACK;\r
+    }\r
+\r
+    _FLAG_CLEAR (Flags, 0x08);\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RESET_REQUIRED)) {\r
+      mHeader->Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
+    }\r
+\r
+    _FLAG_CLEAR (Flags, 0x20);\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_OPTIONS_ONLY)) {\r
+      mHeader->Flags |= EFI_IFR_FLAG_OPTIONS_ONLY;\r
+    }\r
+\r
+    return _FLAGS_ZERO (Flags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+static CIfrQuestionHeader *gCurrentQuestion = NULL;\r
+\r
+/*\r
+ * The definition of CIfrMinMaxStepData\r
+ */\r
+class CIfrMinMaxStepData {\r
+private:\r
+  MINMAXSTEP_DATA *mMinMaxStepData;\r
+\r
+public:\r
+  CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr) : mMinMaxStepData (DataAddr) {\r
+    mMinMaxStepData->u64.MinValue = 0;\r
+    mMinMaxStepData->u64.MaxValue = 0;\r
+    mMinMaxStepData->u64.Step     = 0;\r
+  }\r
+\r
+  VOID SetMinMaxStepData (IN UINT64 MinValue, IN UINT64 MaxValue, IN UINT64 Step) {\r
+    mMinMaxStepData->u64.MinValue = MinValue;\r
+    mMinMaxStepData->u64.MaxValue = MaxValue;\r
+    mMinMaxStepData->u64.Step     = Step;\r
+  }\r
+\r
+  VOID SetMinMaxStepData (IN UINT32 MinValue, IN UINT32 MaxValue, IN UINT32 Step) {\r
+    mMinMaxStepData->u32.MinValue = MinValue;\r
+    mMinMaxStepData->u32.MaxValue = MaxValue;\r
+    mMinMaxStepData->u32.Step     = Step;\r
+  }\r
+\r
+  VOID SetMinMaxStepData (IN UINT16 MinValue, IN UINT16 MaxValue, IN UINT16 Step) {\r
+    mMinMaxStepData->u16.MinValue = MinValue;\r
+    mMinMaxStepData->u16.MaxValue = MaxValue;\r
+    mMinMaxStepData->u16.Step     = Step;\r
+  }\r
+\r
+  VOID SetMinMaxStepData (IN UINT8 MinValue, IN UINT8 MaxValue, IN UINT8 Step) {\r
+    mMinMaxStepData->u8.MinValue = MinValue;\r
+    mMinMaxStepData->u8.MaxValue = MaxValue;\r
+    mMinMaxStepData->u8.Step     = Step;\r
+  }\r
+\r
+};\r
+\r
+/*\r
+ * The definition of all of the UEFI IFR Objects\r
+ */\r
+class CIfrFormSet : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FORM_SET *mFormSet;\r
+\r
+public:\r
+  CIfrFormSet () : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet),\r
+                   CIfrOpHeader (EFI_IFR_FORM_SET_OP, &mFormSet->Header) {\r
+    mFormSet->Help         = EFI_STRING_ID_INVALID;\r
+    mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;\r
+    memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    memcpy (&mFormSet->Guid, Guid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) {\r
+    mFormSet->FormSetTitle = FormSetTitle;\r
+  }\r
+\r
+  VOID SetHelp (IN EFI_STRING_ID Help) {\r
+    mFormSet->Help = Help;\r
+  }\r
+};\r
+\r
+class CIfrEnd : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_END  *mEnd;\r
+\r
+public:\r
+  CIfrEnd () : CIfrObj (EFI_IFR_END_OP, (CHAR8 **)&mEnd),\r
+               CIfrOpHeader (EFI_IFR_END_OP, &mEnd->Header) {}\r
+};\r
+\r
+class CIfrDefaultStore : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DEFAULTSTORE *mDefaultStore;\r
+\r
+public:\r
+  CIfrDefaultStore () : CIfrObj (EFI_IFR_DEFAULTSTORE_OP, (CHAR8 **)&mDefaultStore),\r
+                       CIfrOpHeader (EFI_IFR_DEFAULTSTORE_OP, &mDefaultStore->Header) {\r
+    mDefaultStore->DefaultId   = EFI_VARSTORE_ID_INVALID;\r
+    mDefaultStore->DefaultName = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetDefaultName (IN EFI_STRING_ID DefaultName) {\r
+    mDefaultStore->DefaultName = DefaultName;\r
+  }\r
+\r
+  VOID SetDefaultId (IN UINT16 DefaultId) {\r
+    mDefaultStore->DefaultId = DefaultId;\r
+  }\r
+};\r
+\r
+#define EFI_FORM_ID_MAX                    0xFFFF\r
+#define EFI_FREE_FORM_ID_BITMAP_SIZE     ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
+\r
+class CIfrForm : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FORM  *mForm;\r
+\r
+  STATIC UINT32 FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE];\r
+\r
+  STATIC BOOLEAN ChekFormIdFree (IN EFI_FORM_ID FormId) {\r
+    UINT32 Index  = (FormId / EFI_BITS_PER_UINT32);\r
+    UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);\r
+\r
+    return (FormIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
+  }\r
+\r
+  STATIC VOID MarkFormIdUsed (IN EFI_FORM_ID FormId) {\r
+    UINT32 Index  = (FormId / EFI_BITS_PER_UINT32);\r
+    UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);\r
+\r
+    FormIdBitMap[Index] |= (0x80000000 >> Offset);\r
+  }\r
+\r
+public:\r
+  CIfrForm () : CIfrObj (EFI_IFR_FORM_OP, (CHAR8 **)&mForm), \r
+                CIfrOpHeader (EFI_IFR_FORM_OP, &mForm->Header) {\r
+    mForm->FormId    = 0;\r
+    mForm->FormTitle = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {\r
+    if (CIfrForm::ChekFormIdFree (FormId) == FALSE) {\r
+      return VFR_RETURN_FORMID_REDEFINED;\r
+    }\r
+    mForm->FormId = FormId;\r
+    CIfrForm::MarkFormIdUsed (FormId);\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+\r
+  VOID SetFormTitle (IN EFI_STRING_ID FormTitle) {\r
+    mForm->FormTitle = FormTitle;\r
+  }\r
+};\r
+\r
+class CIfrVarStore : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_VARSTORE *mVarStore;\r
+\r
+public:\r
+  CIfrVarStore () : CIfrObj (EFI_IFR_VARSTORE_OP, (CHAR8 **)&mVarStore, sizeof (EFI_IFR_VARSTORE), TRUE), \r
+                   CIfrOpHeader (EFI_IFR_VARSTORE_OP, &mVarStore->Header) {\r
+    mVarStore->VarStoreId = EFI_VARSTORE_ID_INVALID;\r
+    mVarStore->Size       = 0;\r
+    memset (&mVarStore->Guid, 0, sizeof (EFI_GUID));\r
+    mVarStore->Name[0]    = '\0';\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    memcpy (&mVarStore->Guid, Guid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) {\r
+    mVarStore->VarStoreId = VarStoreId;\r
+  }\r
+\r
+  VOID SetSize (IN UINT16 Size) {\r
+    mVarStore->Size = Size;\r
+  }\r
+\r
+  VOID SetName (IN INT8 *Name) {\r
+    UINT8 Len;\r
+\r
+    if (Name != NULL) {\r
+      Len = strlen (Name);\r
+      if (Len != 0) {\r
+        if (ExpendObjBin (Len) == TRUE) {\r
+          IncLength (Len);\r
+          strcpy ((INT8 *)(mVarStore->Name), Name);\r
+        }\r
+      }\r
+    }\r
+  }\r
+};\r
+\r
+class CIfrVarStoreEfi : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_VARSTORE_EFI *mVarStoreEfi;\r
+\r
+public:\r
+  CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP, (CHAR8 **)&mVarStoreEfi), \r
+                      CIfrOpHeader (EFI_IFR_VARSTORE_EFI_OP, &mVarStoreEfi->Header) {\r
+    mVarStoreEfi->VarStoreId = EFI_VAROFFSET_INVALID;\r
+    memset (&mVarStoreEfi->Guid, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    memcpy (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetVarStoreId (IN UINT16 VarStoreId) {\r
+    mVarStoreEfi->VarStoreId = VarStoreId;\r
+  }\r
+\r
+  VOID SetAttributes (IN UINT32 Attributes) {\r
+    mVarStoreEfi->Attributes = Attributes;\r
+  }\r
+};\r
+\r
+class CIfrVarStoreNameValue : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_VARSTORE_NAME_VALUE *mVarStoreNameValue;\r
+\r
+public:\r
+  CIfrVarStoreNameValue () : CIfrObj (EFI_IFR_VARSTORE_NAME_VALUE_OP, (CHAR8 **)&mVarStoreNameValue), \r
+                              CIfrOpHeader (EFI_IFR_VARSTORE_NAME_VALUE_OP, &mVarStoreNameValue->Header) {\r
+    mVarStoreNameValue->VarStoreId = EFI_VAROFFSET_INVALID;\r
+    memset (&mVarStoreNameValue->Guid, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    memcpy (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetVarStoreId (IN UINT16 VarStoreId) {\r
+    mVarStoreNameValue->VarStoreId = VarStoreId;\r
+  }\r
+};\r
+\r
+class CIfrImage : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_IMAGE *mImage;\r
+\r
+public:\r
+  CIfrImage () : CIfrObj (EFI_IFR_IMAGE_OP, (CHAR8 **)&mImage),\r
+                 CIfrOpHeader (EFI_IFR_FORM_OP, &mImage->Header) {\r
+    mImage->Id = EFI_IMAGE_ID_INVALID;\r
+  }\r
+\r
+  VOID SetImageId (IN EFI_IMAGE_ID ImageId) {\r
+    mImage->Id = ImageId;\r
+  }\r
+};\r
+\r
+class CIfrLocked : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_LOCKED *mLocked;\r
+\r
+public:\r
+  CIfrLocked () : CIfrObj (EFI_IFR_LOCKED_OP, (CHAR8 **)&mLocked),\r
+                  CIfrOpHeader (EFI_IFR_LOCKED_OP, &mLocked->Header) {}\r
+};\r
+\r
+class CIfrRule : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_RULE *mRule;\r
+\r
+public:\r
+  CIfrRule () : CIfrObj (EFI_IFR_RULE_OP, (CHAR8 **)&mRule),\r
+                mRule ((EFI_IFR_RULE *)GetObjBinAddr()),\r
+                CIfrOpHeader (EFI_IFR_RULE_OP, &mRule->Header) {\r
+    mRule->RuleId = EFI_RULE_ID_INVALID;\r
+  }\r
+\r
+  VOID SetRuleId (IN UINT8 RuleId) {\r
+    mRule->RuleId = RuleId;\r
+  }\r
+};\r
+\r
+static EFI_IFR_TYPE_VALUE gZeroEfiIfrTypeValue = {0, };\r
+\r
+class CIfrDefault : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DEFAULT *mDefault;\r
+\r
+public:\r
+  CIfrDefault (\r
+    IN UINT16             DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,\r
+    IN UINT8              Type      = EFI_IFR_TYPE_OTHER,\r
+    IN EFI_IFR_TYPE_VALUE Value     = gZeroEfiIfrTypeValue\r
+    ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)&mDefault),\r
+        CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header) {\r
+    mDefault->Type      = Type;\r
+       mDefault->Value     = Value;\r
+    mDefault->DefaultId = DefaultId;\r
+  }\r
+\r
+  VOID SetDefaultId (IN UINT16 DefaultId) {\r
+    mDefault->DefaultId = DefaultId;\r
+  }\r
+\r
+  VOID SetType (IN UINT8 Type) {\r
+    mDefault->Type = Type;\r
+  }\r
+\r
+  VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {\r
+    mDefault->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrValue : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_VALUE *mValue;\r
+\r
+public:\r
+  CIfrValue () : CIfrObj (EFI_IFR_VALUE_OP, (CHAR8 **)&mValue),\r
+                CIfrOpHeader (EFI_IFR_VALUE_OP, &mValue->Header) {}\r
+\r
+};\r
+\r
+class CIfrSubtitle : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {\r
+private:\r
+  EFI_IFR_SUBTITLE   *mSubtitle;\r
+\r
+public:\r
+  CIfrSubtitle () : CIfrObj (EFI_IFR_SUBTITLE_OP, (CHAR8 **)&mSubtitle),\r
+                  CIfrOpHeader (EFI_IFR_SUBTITLE_OP, &mSubtitle->Header),\r
+                                 CIfrStatementHeader (&mSubtitle->Statement) {\r
+    mSubtitle->Flags = 0;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_HORIZONTAL)) {\r
+      mSubtitle->Flags |= EFI_IFR_FLAGS_HORIZONTAL;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+class CIfrText : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {\r
+private:\r
+  EFI_IFR_TEXT *mText;\r
+\r
+public:\r
+  CIfrText () : CIfrObj (EFI_IFR_TEXT_OP, (CHAR8 **)&mText),\r
+               CIfrOpHeader (EFI_IFR_TEXT_OP, &mText->Header), \r
+               CIfrStatementHeader (&mText->Statement) {\r
+    mText->TextTwo = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetTextTwo (IN EFI_STRING_ID StringId) {\r
+    mText->TextTwo = StringId;\r
+  }\r
+};\r
+\r
+class CIfrRef : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_REF *mRef;\r
+\r
+public:\r
+  CIfrRef () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef),\r
+              CIfrOpHeader (EFI_IFR_REF_OP, &mRef->Header), \r
+              CIfrQuestionHeader (&mRef->Question) {\r
+    mRef->FormId = 0;\r
+  }\r
+\r
+  VOID SetFormId (IN EFI_FORM_ID FormId) {\r
+    mRef->FormId = FormId;\r
+  }\r
+};\r
+\r
+class CIfrRef2 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_REF2 *mRef2;\r
+\r
+public:\r
+  CIfrRef2 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef2, sizeof (EFI_IFR_REF2)),\r
+               CIfrOpHeader (EFI_IFR_REF_OP, &mRef2->Header, sizeof (EFI_IFR_REF2)), \r
+               CIfrQuestionHeader (&mRef2->Question) {\r
+    mRef2->FormId     = 0;\r
+    mRef2->QuestionId = EFI_QUESTION_ID_INVALID;\r
+  }\r
+\r
+  VOID SetFormId (IN EFI_FORM_ID FormId) {\r
+    mRef2->FormId = FormId;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
+    if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+      return VFR_RETURN_UNDEFINED;\r
+    }\r
+    mRef2->QuestionId = QuestionId;\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+};\r
+\r
+class CIfrRef3 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_REF3 *mRef3;\r
+\r
+public:\r
+  CIfrRef3 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef3, sizeof(EFI_IFR_REF3)),\r
+               CIfrOpHeader (EFI_IFR_REF_OP, &mRef3->Header, sizeof (EFI_IFR_REF3)), \r
+               CIfrQuestionHeader (&mRef3->Question) {\r
+    mRef3->FormId     = 0;\r
+    mRef3->QuestionId = EFI_QUESTION_ID_INVALID;\r
+    memset (&mRef3->FormSetId, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetFormId (IN EFI_FORM_ID FormId) {\r
+    mRef3->FormId = FormId;\r
+  }\r
+\r
+  VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
+    mRef3->QuestionId = QuestionId;\r
+  }\r
+\r
+  VOID SetFormSetId (IN EFI_GUID FormSetId) {\r
+    mRef3->FormSetId = FormSetId;\r
+  }\r
+};\r
+\r
+class CIfrRef4 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_REF4 *mRef4;\r
+\r
+public:\r
+  CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef4, sizeof(EFI_IFR_REF3)),\r
+               CIfrOpHeader (EFI_IFR_REF_OP, &mRef4->Header, sizeof (EFI_IFR_REF3)), \r
+               CIfrQuestionHeader (&mRef4->Question) {\r
+    mRef4->FormId     = 0;\r
+    mRef4->QuestionId = EFI_QUESTION_ID_INVALID;\r
+    memset (&mRef4->FormSetId, 0, sizeof (EFI_GUID));\r
+    mRef4->DevicePath = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetFormId (IN EFI_FORM_ID FormId) {\r
+    mRef4->FormId = FormId;\r
+  }\r
+\r
+  VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
+    mRef4->QuestionId = QuestionId;\r
+  }\r
+\r
+  VOID SetFormSetId (IN EFI_GUID FormSetId) {\r
+    mRef4->FormSetId = FormSetId;\r
+  }\r
+\r
+  VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {\r
+    mRef4->DevicePath = DevicePath;\r
+  }\r
+};\r
+\r
+class CIfrResetButton : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {\r
+private:\r
+  EFI_IFR_RESET_BUTTON *mResetButton;\r
+\r
+public:\r
+  CIfrResetButton () : CIfrObj (EFI_IFR_RESET_BUTTON_OP, (CHAR8 **)&mResetButton),\r
+                       CIfrOpHeader (EFI_IFR_RESET_BUTTON_OP, &mResetButton->Header), \r
+                                          CIfrStatementHeader (&mResetButton->Question.Header) {\r
+    mResetButton->DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+  }\r
+\r
+  VOID SetDefaultId (IN UINT16 DefaultId) {\r
+    mResetButton->DefaultId = DefaultId;\r
+  }\r
+};\r
+\r
+class CIfrCheckBox : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader  {\r
+private:\r
+  EFI_IFR_CHECKBOX *mCheckBox;\r
+\r
+public:\r
+  CIfrCheckBox () : CIfrObj (EFI_IFR_CHECKBOX_OP, (CHAR8 **)&mCheckBox),\r
+                     CIfrOpHeader (EFI_IFR_CHECKBOX_OP, &mCheckBox->Header), \r
+                     CIfrQuestionHeader (&mCheckBox->Question) {\r
+    mCheckBox->Flags = EFI_IFR_CHECKBOX_DEFAULT;\r
+    gCurrentQuestion = this;\r
+  }\r
+\r
+  ~CIfrCheckBox () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT)) {\r
+      mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT_MFG)) {\r
+      mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT_MFG;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+class CIfrAction : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_ACTION *mAction;\r
+\r
+public:\r
+  CIfrAction () : CIfrObj (EFI_IFR_ACTION_OP, (CHAR8 **)&mAction),\r
+                 CIfrOpHeader (EFI_IFR_ACTION_OP, &mAction->Header), \r
+                 CIfrQuestionHeader (&mAction->Question) {\r
+    mAction->QuestionConfig = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetQuestionConfig (IN EFI_STRING_ID QuestionConfig) {\r
+    mAction->QuestionConfig = QuestionConfig;\r
+  }\r
+};\r
+\r
+class CIfrDate : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_DATE *mDate;\r
+\r
+public:\r
+  CIfrDate () : CIfrObj (EFI_IFR_DATE_OP, (CHAR8 **)&mDate),\r
+               CIfrOpHeader (EFI_IFR_DATE_OP, &mDate->Header),\r
+               CIfrQuestionHeader (&mDate->Question) {\r
+    mDate->Flags = 0;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_YEAR_SUPPRESS)) {\r
+      mDate->Flags |= EFI_QF_DATE_YEAR_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_MONTH_SUPPRESS)) {\r
+      mDate->Flags |= EFI_QF_DATE_MONTH_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_DAY_SUPPRESS)) {\r
+      mDate->Flags |= EFI_QF_DATE_DAY_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_NORMAL)) {\r
+      mDate->Flags |= QF_DATE_STORAGE_NORMAL;\r
+    } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_TIME)) {\r
+      mDate->Flags |= QF_DATE_STORAGE_TIME;\r
+    } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_WAKEUP)) {\r
+      mDate->Flags |= QF_DATE_STORAGE_WAKEUP;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+class CIfrNumeric : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {\r
+private:\r
+  EFI_IFR_NUMERIC *mNumeric;\r
+\r
+public:\r
+  CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric),\r
+                   CIfrOpHeader (EFI_IFR_NUMERIC_OP, &mNumeric->Header),\r
+                   CIfrQuestionHeader (&mNumeric->Question),\r
+                   CIfrMinMaxStepData (&mNumeric->data) {\r
+    mNumeric->Flags  = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;\r
+    gCurrentQuestion = this;\r
+  }\r
+\r
+  ~CIfrNumeric () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (LFlags & EFI_IFR_DISPLAY) {\r
+      mNumeric->Flags = LFlags;\r
+    } else {\r
+      mNumeric->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;\r
+    }\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+};\r
+\r
+class CIfrOneOf : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {\r
+private:\r
+  EFI_IFR_ONE_OF *mOneOf;\r
+\r
+public:\r
+  CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP, (CHAR8 **)&mOneOf),\r
+                 CIfrOpHeader (EFI_IFR_ONE_OF_OP, &mOneOf->Header),\r
+                 CIfrQuestionHeader (&mOneOf->Question),\r
+                 CIfrMinMaxStepData (&mOneOf->data) {\r
+    mOneOf->Flags    = 0;\r
+    gCurrentQuestion = this;\r
+  }\r
+\r
+  ~CIfrOneOf () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (LFlags & EFI_IFR_DISPLAY) {\r
+      mOneOf->Flags = LFlags;\r
+    } else {\r
+      mOneOf->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;\r
+    }\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+};\r
+\r
+class CIfrString : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_STRING *mString;\r
+\r
+public:\r
+  CIfrString () : CIfrObj (EFI_IFR_STRING_OP, (CHAR8 **)&mString),\r
+                 CIfrOpHeader (EFI_IFR_STRING_OP, &mString->Header),\r
+                 CIfrQuestionHeader (&mString->Question) {\r
+    mString->Flags   = 0;\r
+    mString->MinSize = 0;\r
+    mString->MaxSize = 0;\r
+    gCurrentQuestion = this;\r
+  }\r
+\r
+  ~CIfrString () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_STRING_MULTI_LINE)) {\r
+      mString->Flags |= EFI_IFR_STRING_MULTI_LINE;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+\r
+  VOID SetMinSize (IN UINT8 Flags) {\r
+    mString->MinSize = Flags;\r
+  }\r
+\r
+  VOID SetMaxSize (IN UINT8 MaxSize) {\r
+    mString->MaxSize = MaxSize;\r
+  }\r
+};\r
+\r
+class CIfrPassword : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_PASSWORD *mPassword;\r
+\r
+public:\r
+  CIfrPassword () : CIfrObj (EFI_IFR_PASSWORD_OP, (CHAR8 **)&mPassword),\r
+                    CIfrOpHeader (EFI_IFR_PASSWORD_OP, &mPassword->Header),\r
+                    CIfrQuestionHeader (&mPassword->Question) {\r
+    mPassword->MinSize = 0;\r
+    mPassword->MaxSize = 0;\r
+    gCurrentQuestion   = this;\r
+  }\r
+\r
+  ~CIfrPassword () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  VOID SetMinSize (IN UINT16 MinSize) {\r
+    mPassword->MinSize = MinSize;\r
+  }\r
+\r
+  VOID SetMaxSize (IN UINT16 MaxSize) {\r
+    mPassword->MaxSize = MaxSize;\r
+  }\r
+};\r
+\r
+class CIfrOrderedList : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_ORDERED_LIST *mOrderedList;\r
+\r
+public:\r
+  CIfrOrderedList () : CIfrObj (EFI_IFR_ORDERED_LIST_OP, (CHAR8 **)&mOrderedList),\r
+                      CIfrOpHeader (EFI_IFR_ORDERED_LIST_OP, &mOrderedList->Header),\r
+                      CIfrQuestionHeader (&mOrderedList->Question) {\r
+    mOrderedList->MaxContainers = 0;\r
+    mOrderedList->Flags         = 0;\r
+    gCurrentQuestion            = this;\r
+  }\r
+\r
+  ~CIfrOrderedList () {\r
+    gCurrentQuestion = NULL;\r
+  }\r
+\r
+  VOID SetMaxContainers (IN UINT8 MaxContainers) {\r
+    mOrderedList->MaxContainers = MaxContainers;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_UNIQUE_SET)) {\r
+      mOrderedList->Flags |= EFI_IFR_UNIQUE_SET;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_NO_EMPTY_SET)) {\r
+      mOrderedList->Flags |= EFI_IFR_NO_EMPTY_SET;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+class CIfrTime : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_TIME *mTime;\r
+\r
+public:\r
+  CIfrTime () : CIfrObj (EFI_IFR_TIME_OP, (CHAR8 **)&mTime),\r
+                CIfrOpHeader (EFI_IFR_TIME_OP, &mTime->Header),\r
+                CIfrQuestionHeader (&mTime->Question) {\r
+    mTime->Flags = 0;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+    EFI_VFR_RETURN_CODE Ret;\r
+\r
+    Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
+    if (Ret != VFR_RETURN_SUCCESS) {\r
+      return Ret;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_HOUR_SUPPRESS)) {\r
+      mTime->Flags |= QF_TIME_HOUR_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_MINUTE_SUPPRESS)) {\r
+      mTime->Flags |= QF_TIME_MINUTE_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_SECOND_SUPPRESS)) {\r
+      mTime->Flags |= QF_TIME_SECOND_SUPPRESS;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_NORMAL)) {\r
+      mTime->Flags |= QF_TIME_STORAGE_NORMAL;\r
+    } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_TIME)) {\r
+      mTime->Flags |= QF_TIME_STORAGE_TIME;\r
+    } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_WAKEUP)) {\r
+      mTime->Flags |= QF_TIME_STORAGE_WAKEUP;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+class CIfrDisableIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DISABLE_IF *mDisableIf;\r
+\r
+public:\r
+  CIfrDisableIf () : CIfrObj (EFI_IFR_DISABLE_IF_OP, (CHAR8 **)&mDisableIf),\r
+                   mDisableIf ((EFI_IFR_DISABLE_IF *) GetObjBinAddr()),\r
+                   CIfrOpHeader (EFI_IFR_DISABLE_IF_OP, &mDisableIf->Header) {}\r
+};\r
+\r
+class CIfrSuppressIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_SUPPRESS_IF *mSuppressIf;\r
+\r
+public:\r
+  CIfrSuppressIf () : CIfrObj (EFI_IFR_SUPPRESS_IF_OP, (CHAR8 **)&mSuppressIf),\r
+                     CIfrOpHeader (EFI_IFR_SUPPRESS_IF_OP, &mSuppressIf->Header) {}\r
+};\r
+\r
+class CIfrGrayOutIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GRAY_OUT_IF *mGrayOutIf;\r
+\r
+public:\r
+  CIfrGrayOutIf () : CIfrObj (EFI_IFR_GRAY_OUT_IF_OP, (CHAR8 **)&mGrayOutIf),\r
+                    CIfrOpHeader (EFI_IFR_GRAY_OUT_IF_OP, &mGrayOutIf->Header) {}\r
+};\r
+\r
+class CIfrInconsistentIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_INCONSISTENT_IF *mInconsistentIf;\r
+\r
+public:\r
+  CIfrInconsistentIf () : CIfrObj (EFI_IFR_INCONSISTENT_IF_OP, (CHAR8 **)&mInconsistentIf),\r
+                        CIfrOpHeader (EFI_IFR_INCONSISTENT_IF_OP, &mInconsistentIf->Header) {\r
+    mInconsistentIf->Error = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetError (IN EFI_STRING_ID Error) {\r
+    mInconsistentIf->Error = Error;\r
+  }\r
+};\r
+\r
+class CIfrNoSubmitIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_NO_SUBMIT_IF *mNoSubmitIf;\r
+\r
+public:\r
+  CIfrNoSubmitIf () : CIfrObj (EFI_IFR_NO_SUBMIT_IF_OP, (CHAR8 **)&mNoSubmitIf),\r
+                     CIfrOpHeader (EFI_IFR_NO_SUBMIT_IF_OP, &mNoSubmitIf->Header) {\r
+    mNoSubmitIf->Error = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetError (IN EFI_STRING_ID Error) {\r
+    mNoSubmitIf->Error = Error;\r
+  }\r
+};\r
+\r
+class CIfrRefresh : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_REFRESH *mRefresh;\r
+\r
+public:\r
+  CIfrRefresh () : CIfrObj (EFI_IFR_REFRESH_OP, (CHAR8 **)&mRefresh),\r
+                  CIfrOpHeader (EFI_IFR_REFRESH_OP, &mRefresh->Header) {\r
+    mRefresh->RefreshInterval = 0;\r
+  }\r
+\r
+  VOID SetRefreshInterval (IN UINT8 RefreshInterval) {\r
+    mRefresh->RefreshInterval = RefreshInterval;\r
+  }\r
+};\r
+\r
+class CIfrVarStoreDevice : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_VARSTORE_DEVICE *mVarStoreDevice;\r
+\r
+public:\r
+  CIfrVarStoreDevice () : CIfrObj (EFI_IFR_VARSTORE_DEVICE_OP, (CHAR8 **)&mVarStoreDevice),\r
+                          CIfrOpHeader (EFI_IFR_VARSTORE_DEVICE_OP, &mVarStoreDevice->Header) {\r
+    mVarStoreDevice->DevicePath = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {\r
+    mVarStoreDevice->DevicePath = DevicePath;\r
+  }\r
+};\r
+\r
+class CIfrOneOfOption : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_ONE_OF_OPTION *mOneOfOption;\r
+\r
+public:\r
+  CIfrOneOfOption () : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP, (CHAR8 **)&mOneOfOption),\r
+                       CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP, &mOneOfOption->Header) {\r
+    mOneOfOption->Flags  = 0;\r
+    mOneOfOption->Option = EFI_STRING_ID_INVALID;\r
+    mOneOfOption->Type   = EFI_IFR_TYPE_OTHER;\r
+    memset (&mOneOfOption->Value, 0, sizeof (mOneOfOption->Value));\r
+  }\r
+\r
+  VOID SetOption (IN EFI_STRING_ID Option) {\r
+    mOneOfOption->Option = Option;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT)) {\r
+      mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+\r
+    if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT_MFG)) {\r
+      mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT_MFG;\r
+    }\r
+\r
+    if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_8)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_8);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_8;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_16)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_16);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_16;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_32)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_32);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_32;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_64)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_64);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_64;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_BOOLEAN)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_BOOLEAN);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_BOOLEAN;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_TIME)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_TIME);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_TIME;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_DATE)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_DATE);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_DATE;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_STRING)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_STRING);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_STRING;\r
+    } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_OTHER)) {\r
+      _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_OTHER);\r
+      mOneOfOption->Flags |= EFI_IFR_TYPE_OTHER;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+\r
+  VOID SetType (IN UINT8 Type) {\r
+    mOneOfOption->Type = Type;\r
+  }\r
+\r
+  VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {\r
+    mOneOfOption->Value = Value;\r
+  }\r
+\r
+  UINT8 GetFlags (VOID) {\r
+    return mOneOfOption->Flags;\r
+  }\r
+};\r
+\r
+static EFI_GUID IfrTianoGuid = EFI_IFR_TIANO_GUID;\r
+\r
+class CIfrClass : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID_CLASS *mClass;\r
+\r
+public:\r
+  CIfrClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mClass, sizeof (EFI_IFR_GUID_CLASS)),\r
+                CIfrOpHeader (EFI_IFR_GUID_OP, &mClass->Header, sizeof (EFI_IFR_GUID_CLASS)) {\r
+    mClass->ExtendOpCode = EFI_IFR_EXTEND_OP_CLASS;\r
+    mClass->Guid         = IfrTianoGuid;\r
+    mClass->Class        = EFI_NON_DEVICE_CLASS;\r
+  }\r
+\r
+  VOID SetClass (IN UINT16 Class) {\r
+    mClass->Class        = Class;\r
+  }\r
+};\r
+\r
+class CIfrSubClass : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID_SUBCLASS *mSubClass;\r
+\r
+public:\r
+  CIfrSubClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mSubClass, sizeof (EFI_IFR_GUID_SUBCLASS)),\r
+                    CIfrOpHeader (EFI_IFR_GUID_OP, &mSubClass->Header, sizeof (EFI_IFR_GUID_SUBCLASS)) {\r
+    mSubClass->ExtendOpCode = EFI_IFR_EXTEND_OP_SUBCLASS;\r
+    mSubClass->Guid         = IfrTianoGuid;\r
+    mSubClass->SubClass     = EFI_SETUP_APPLICATION_SUBCLASS;\r
+  }\r
+\r
+  VOID SetSubClass (IN UINT16 SubClass) {\r
+    mSubClass->SubClass = SubClass;\r
+  }\r
+};\r
+\r
+class CIfrLabel : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID_LABEL *mLabel;\r
+\r
+public:\r
+  CIfrLabel () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mLabel, sizeof (EFI_IFR_GUID_LABEL)),\r
+                CIfrOpHeader (EFI_IFR_GUID_OP, &mLabel->Header, sizeof (EFI_IFR_GUID_LABEL)) {\r
+    mLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+    mLabel->Guid         = IfrTianoGuid;\r
+  }\r
+\r
+  VOID SetNumber (IN UINT16 Number) {\r
+    mLabel->Number = Number;\r
+  }\r
+};\r
+\r
+class CIfrBanner : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID_BANNER *mBanner;\r
+\r
+public:\r
+  CIfrBanner () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mBanner, sizeof (EFI_IFR_GUID_BANNER)),\r
+                  CIfrOpHeader (EFI_IFR_GUID_OP, &mBanner->Header, sizeof (EFI_IFR_GUID_BANNER)) {\r
+    mBanner->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
+    mBanner->Guid         = IfrTianoGuid;\r
+  }\r
+\r
+  VOID SetTitle (IN EFI_STRING_ID StringId) {\r
+    mBanner->Title = StringId;\r
+  }\r
+\r
+  VOID SetLine (IN UINT16 Line) {\r
+    mBanner->LineNumber = Line;\r
+  }\r
+\r
+  VOID SetAlign (IN UINT8 Align) {\r
+    mBanner->Alignment = Align;\r
+  }\r
+};\r
+\r
+class CIfrTimeout : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID_TIMEOUT *mTimeout;\r
+\r
+public:\r
+  CIfrTimeout (IN UINT16 Timeout = 0) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mTimeout, sizeof (EFI_IFR_GUID_TIMEOUT)),\r
+                                        CIfrOpHeader (EFI_IFR_GUID_OP, &mTimeout->Header, sizeof (EFI_IFR_GUID_TIMEOUT)) {\r
+    mTimeout->ExtendOpCode = EFI_IFR_EXTEND_OP_TIMEOUT;\r
+    mTimeout->Guid         = IfrTianoGuid;\r
+    mTimeout->TimeOut      = Timeout;\r
+  }\r
+\r
+  VOID SetTimeout (IN UINT16 Timeout) {\r
+    mTimeout->TimeOut = Timeout;\r
+  }\r
+};\r
+\r
+class CIfrDup : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DUP *mDup;\r
+\r
+public:\r
+  CIfrDup (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_DUP_OP, (CHAR8 **)&mDup),\r
+      CIfrOpHeader (EFI_IFR_DUP_OP, &mDup->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrEqIdId : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_EQ_ID_ID   *mEqIdId;\r
+\r
+public:\r
+  CIfrEqIdId (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_EQ_ID_ID_OP, (CHAR8 **)&mEqIdId),\r
+                 CIfrOpHeader (EFI_IFR_EQ_ID_ID_OP, &mEqIdId->Header) {\r
+    SetLineNo (LineNo);\r
+    mEqIdId->QuestionId1 = EFI_QUESTION_ID_INVALID;\r
+    mEqIdId->QuestionId2 = EFI_QUESTION_ID_INVALID;\r
+  }\r
+\r
+  VOID SetQuestionId1 (\r
+  IN EFI_QUESTION_ID QuestionId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          LineNo\r
+  ) {\r
+    if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
+      mEqIdId->QuestionId1 = QuestionId;\r
+    } else {\r
+      gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId1), sizeof (EFI_QUESTION_ID), LineNo);\r
+    }\r
+  }\r
+\r
+  VOID SetQuestionId2 (\r
+  IN EFI_QUESTION_ID QuestionId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          LineNo\r
+  ) {\r
+    if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
+      mEqIdId->QuestionId2 = QuestionId;\r
+    } else {\r
+      gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId2), sizeof (EFI_QUESTION_ID), LineNo);\r
+    }\r
+  }\r
+};\r
+\r
+class CIfrEqIdVal : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_EQ_ID_VAL *mEqIdVal;\r
+\r
+public:\r
+  CIfrEqIdVal (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_EQ_ID_VAL_OP, (CHAR8 **)&mEqIdVal),\r
+      CIfrOpHeader (EFI_IFR_EQ_ID_VAL_OP, &mEqIdVal->Header) {\r
+    SetLineNo (LineNo);\r
+    mEqIdVal->QuestionId = EFI_QUESTION_ID_INVALID;\r
+  }\r
+\r
+  VOID SetQuestionId (\r
+  IN EFI_QUESTION_ID QuestionId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          LineNo\r
+  ) {\r
+    if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
+      mEqIdVal->QuestionId = QuestionId;\r
+    } else {\r
+      gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVal->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+    }\r
+  }\r
+\r
+  VOID SetValue (IN UINT16 Value) {\r
+    mEqIdVal->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrEqIdList : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_EQ_ID_LIST *mEqIdVList;\r
+\r
+public:\r
+  CIfrEqIdList (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_EQ_ID_LIST_OP, (CHAR8 **)&mEqIdVList, sizeof (EFI_IFR_EQ_ID_LIST), TRUE),\r
+                   CIfrOpHeader (EFI_IFR_EQ_ID_LIST_OP, &mEqIdVList->Header) {\r
+    SetLineNo (LineNo);\r
+    mEqIdVList->QuestionId   = EFI_QUESTION_ID_INVALID;\r
+    mEqIdVList->ListLength   = 0;\r
+    mEqIdVList->ValueList[0] = 0;\r
+  }\r
+\r
+  VOID SetQuestionId (\r
+  IN EFI_QUESTION_ID QuestionId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          LineNo\r
+  ) {\r
+    if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
+      mEqIdVList->QuestionId = QuestionId;\r
+    } else {\r
+      gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVList->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+    }\r
+  }\r
+\r
+  VOID SetListLength (IN UINT16 ListLength) {\r
+    mEqIdVList->ListLength = ListLength;\r
+  }\r
+\r
+  VOID SetValueList (IN UINT16 Index, IN UINT16 Value) {\r
+    if (Index == 0) {\r
+      mEqIdVList->ValueList[0] = Value;\r
+      return;\r
+    }\r
+\r
+    if (ExpendObjBin (sizeof (UINT16)) ==TRUE) {\r
+      IncLength (sizeof (UINT16));\r
+      mEqIdVList->ValueList[Index] = Value;\r
+    }\r
+  }\r
+};\r
+\r
+class CIfrQuestionRef1 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_QUESTION_REF1 *mQuestionRef1;\r
+\r
+public:\r
+  CIfrQuestionRef1 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_QUESTION_REF1_OP, (CHAR8 **)&mQuestionRef1),\r
+      CIfrOpHeader (EFI_IFR_QUESTION_REF1_OP, &mQuestionRef1->Header) {\r
+    SetLineNo (LineNo);\r
+    mQuestionRef1->QuestionId = EFI_QUESTION_ID_INVALID;\r
+  }\r
+\r
+  VOID SetQuestionId (\r
+  IN EFI_QUESTION_ID QuestionId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          LineNo\r
+  ) {\r
+    if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
+      mQuestionRef1->QuestionId = QuestionId;\r
+    } else {\r
+      gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mQuestionRef1->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+    }\r
+  }\r
+};\r
+\r
+class CIfrQuestionRef2 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_QUESTION_REF2 *mQuestionRef2;\r
+\r
+public:\r
+  CIfrQuestionRef2 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_QUESTION_REF2_OP, (CHAR8 **)&mQuestionRef2),\r
+      CIfrOpHeader (EFI_IFR_QUESTION_REF2_OP, &mQuestionRef2->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrQuestionRef3 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_QUESTION_REF3 *mQuestionRef3;\r
+\r
+public:\r
+  CIfrQuestionRef3 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3),\r
+      CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrQuestionRef3_2 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_QUESTION_REF3_2 *mQuestionRef3_2;\r
+\r
+public:\r
+  CIfrQuestionRef3_2 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3_2, sizeof (EFI_IFR_QUESTION_REF3_2)),\r
+      CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3_2->Header, sizeof (EFI_IFR_QUESTION_REF3_2)) {\r
+    SetLineNo (LineNo);\r
+    mQuestionRef3_2->DevicePath = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {\r
+    mQuestionRef3_2->DevicePath = DevicePath;\r
+  }\r
+};\r
+\r
+class CIfrQuestionRef3_3 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_QUESTION_REF3_3 *mQuestionRef3_3;\r
+\r
+public:\r
+  CIfrQuestionRef3_3 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3_3, sizeof (EFI_IFR_QUESTION_REF3_3)),\r
+      CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3_3->Header, sizeof (EFI_IFR_QUESTION_REF3_3)) {\r
+    SetLineNo (LineNo);\r
+    mQuestionRef3_3->DevicePath = EFI_STRING_ID_INVALID;\r
+    memset (&mQuestionRef3_3->Guid, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {\r
+    mQuestionRef3_3->DevicePath = DevicePath;\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    mQuestionRef3_3->Guid = *Guid;\r
+  }\r
+};\r
+\r
+class CIfrRuleRef : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_RULE_REF *mRuleRef;\r
+\r
+public:\r
+  CIfrRuleRef (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_RULE_REF_OP, (CHAR8 **)&mRuleRef),\r
+      CIfrOpHeader (EFI_IFR_RULE_REF_OP, &mRuleRef->Header) {\r
+    SetLineNo (LineNo);\r
+    mRuleRef->RuleId = EFI_RULE_ID_INVALID;\r
+  }\r
+\r
+  VOID SetRuleId (IN UINT8 RuleId) {\r
+    mRuleRef->RuleId = RuleId;\r
+  }\r
+};\r
+\r
+class CIfrStringRef1 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_STRING_REF1 *mStringRef1;\r
+\r
+public:\r
+  CIfrStringRef1 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_STRING_REF1_OP, (CHAR8 **)&mStringRef1),\r
+      CIfrOpHeader (EFI_IFR_STRING_REF1_OP, &mStringRef1->Header) {\r
+    SetLineNo (LineNo);\r
+    mStringRef1->StringId = EFI_STRING_ID_INVALID;\r
+  }\r
+\r
+  VOID SetStringId (IN EFI_STRING_ID StringId) {\r
+    mStringRef1->StringId = StringId;\r
+  }\r
+};\r
+\r
+class CIfrStringRef2 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_STRING_REF2 *mStringRef2;\r
+\r
+public:\r
+  CIfrStringRef2 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_STRING_REF2_OP, (CHAR8 **)&mStringRef2),\r
+      CIfrOpHeader (EFI_IFR_STRING_REF2_OP, &mStringRef2->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrThis : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_THIS *mThis;\r
+\r
+public:\r
+  CIfrThis (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_THIS_OP, (CHAR8 **)&mThis),\r
+      CIfrOpHeader (EFI_IFR_THIS_OP, &mThis->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrUint8 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_UINT8 *mUint8;\r
+\r
+public:\r
+  CIfrUint8 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_UINT8_OP, (CHAR8 **)&mUint8),\r
+      CIfrOpHeader (EFI_IFR_UINT8_OP, &mUint8->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetValue (IN UINT8 Value) {\r
+    mUint8->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrUint16 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_UINT16 *mUint16;\r
+\r
+public:\r
+  CIfrUint16 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_UINT16_OP, (CHAR8 **)&mUint16),\r
+      CIfrOpHeader (EFI_IFR_UINT16_OP, &mUint16->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetValue (IN UINT16 Value) {\r
+    mUint16->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrUint32 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_UINT32 *mUint32;\r
+\r
+public:\r
+  CIfrUint32 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_UINT32_OP, (CHAR8 **)&mUint32),\r
+      CIfrOpHeader (EFI_IFR_UINT32_OP, &mUint32->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetValue (IN UINT32 Value) {\r
+    mUint32->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrUint64 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_UINT64 *mUint64;\r
+\r
+public:\r
+  CIfrUint64 (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_UINT64_OP, (CHAR8 **)&mUint64),\r
+      CIfrOpHeader (EFI_IFR_UINT64_OP, &mUint64->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetValue (IN UINT64 Value) {\r
+    mUint64->Value = Value;\r
+  }\r
+};\r
+\r
+class CIfrTrue : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TRUE *mTrue;\r
+\r
+public:\r
+  CIfrTrue (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TRUE_OP, (CHAR8 **)&mTrue),\r
+      CIfrOpHeader (EFI_IFR_TRUE_OP, &mTrue->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrFalse : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FALSE *mFalse;\r
+\r
+public:\r
+  CIfrFalse (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_FALSE_OP, (CHAR8 **)&mFalse),\r
+      CIfrOpHeader (EFI_IFR_FALSE_OP, &mFalse->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrOne : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_ONE *mOne;\r
+\r
+public:\r
+  CIfrOne (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_ONE_OP, (CHAR8 **)&mOne),\r
+      CIfrOpHeader (EFI_IFR_ONE_OP, &mOne->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrOnes : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_ONES *mOnes;\r
+\r
+public:\r
+  CIfrOnes (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_ONES_OP, (CHAR8 **)&mOnes),\r
+      CIfrOpHeader (EFI_IFR_ONES_OP, &mOnes->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrZero : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_ZERO *mZero;\r
+\r
+public:\r
+  CIfrZero (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_ZERO_OP, (CHAR8 **)&mZero),\r
+      CIfrOpHeader (EFI_IFR_ZERO_OP, &mZero->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrUndefined : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_UNDEFINED *mUndefined;\r
+\r
+public:\r
+  CIfrUndefined (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_UNDEFINED_OP, (CHAR8 **)&mUndefined),\r
+      CIfrOpHeader (EFI_IFR_UNDEFINED_OP, &mUndefined->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrVersion : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_VERSION *mVersion;\r
+\r
+public:\r
+  CIfrVersion (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_VERSION_OP, (CHAR8 **)&mVersion),\r
+      CIfrOpHeader (EFI_IFR_VERSION_OP, &mVersion->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrLength : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_LENGTH *mLength;\r
+\r
+public:\r
+  CIfrLength (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_LENGTH_OP, (CHAR8 **)&mLength),\r
+      CIfrOpHeader (EFI_IFR_LENGTH_OP, &mLength->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrNot : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_NOT *mNot;\r
+\r
+public:\r
+  CIfrNot (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_NOT_OP, (CHAR8 **)&mNot),\r
+      CIfrOpHeader (EFI_IFR_NOT_OP, &mNot->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrBitWiseNot : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_BITWISE_NOT *mBitWise;\r
+\r
+public:\r
+  CIfrBitWiseNot (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_BITWISE_NOT_OP, (CHAR8 **)&mBitWise),\r
+      CIfrOpHeader (EFI_IFR_BITWISE_NOT_OP, &mBitWise->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrToBoolean : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TO_BOOLEAN *mToBoolean;\r
+\r
+public:\r
+  CIfrToBoolean (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TO_BOOLEAN_OP, (CHAR8 **)&mToBoolean),\r
+      CIfrOpHeader (EFI_IFR_TO_BOOLEAN_OP, &mToBoolean->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrToString : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TO_STRING *mToString;\r
+\r
+public:\r
+  CIfrToString (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TO_STRING_OP, (CHAR8 **)&mToString),\r
+      CIfrOpHeader (EFI_IFR_TO_STRING_OP, &mToString->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetFormat (IN UINT8 Format) {\r
+    mToString->Format = Format;\r
+  }\r
+};\r
+\r
+class CIfrToUint : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TO_UINT *mToUint;\r
+\r
+public:\r
+  CIfrToUint (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TO_UINT_OP, (CHAR8 **)&mToUint),\r
+      CIfrOpHeader (EFI_IFR_TO_UINT_OP, &mToUint->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrToUpper : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TO_UPPER *mToUpper;\r
+\r
+public:\r
+  CIfrToUpper (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TO_UPPER_OP, (CHAR8 **)&mToUpper),\r
+      CIfrOpHeader (EFI_IFR_TO_UPPER_OP, &mToUpper->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrToLower : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TO_LOWER *mToLower;\r
+\r
+public:\r
+  CIfrToLower (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TO_LOWER_OP, (CHAR8 **)&mToLower),\r
+      CIfrOpHeader (EFI_IFR_TO_LOWER_OP, &mToLower->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrAdd : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_ADD *mAdd;\r
+\r
+public:\r
+  CIfrAdd (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_ADD_OP, (CHAR8 **)&mAdd),\r
+      CIfrOpHeader (EFI_IFR_ADD_OP, &mAdd->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrBitWiseAnd : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_BITWISE_AND *mBitWiseAnd;\r
+\r
+public:\r
+  CIfrBitWiseAnd (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_BITWISE_AND_OP, (CHAR8 **)&mBitWiseAnd),\r
+      CIfrOpHeader (EFI_IFR_BITWISE_AND_OP, &mBitWiseAnd->Header) {\r
+    SetLineNo(LineNo);\r
+  }\r
+};\r
+\r
+class CIfrBitWiseOr : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_BITWISE_OR *mBitWiseOr;\r
+\r
+public:\r
+  CIfrBitWiseOr (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_BITWISE_OR_OP, (CHAR8 **)&mBitWiseOr),\r
+      CIfrOpHeader (EFI_IFR_BITWISE_OR_OP, &mBitWiseOr->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrAnd : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_AND *mAnd;\r
+\r
+public:\r
+  CIfrAnd (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_AND_OP, (CHAR8 **)&mAnd),\r
+      CIfrOpHeader (EFI_IFR_AND_OP, &mAnd->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrCatenate : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_CATENATE *mCatenate;\r
+\r
+public:\r
+  CIfrCatenate (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_CATENATE_OP, (CHAR8 **)&mCatenate),\r
+      CIfrOpHeader (EFI_IFR_CATENATE_OP, &mCatenate->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrDivide : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DIVIDE *mDivide;\r
+\r
+public:\r
+  CIfrDivide (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_DIVIDE_OP, (CHAR8 **)&mDivide),\r
+      CIfrOpHeader (EFI_IFR_DIVIDE_OP, &mDivide->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrEqual : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_EQUAL *mEqual;\r
+\r
+public:\r
+  CIfrEqual (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_EQUAL_OP, (CHAR8 **)&mEqual),\r
+      CIfrOpHeader (EFI_IFR_EQUAL_OP, &mEqual->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrGreaterEqual : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GREATER_EQUAL *mGreaterEqual;\r
+\r
+public:\r
+  CIfrGreaterEqual (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_GREATER_EQUAL_OP, (CHAR8 **)&mGreaterEqual),\r
+      CIfrOpHeader (EFI_IFR_GREATER_EQUAL_OP, &mGreaterEqual->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrGreaterThan : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GREATER_THAN *mGreaterThan;\r
+\r
+public:\r
+  CIfrGreaterThan (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_GREATER_THAN_OP, (CHAR8 **)&mGreaterThan),\r
+      CIfrOpHeader (EFI_IFR_GREATER_THAN_OP, &mGreaterThan->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrLessEqual : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_LESS_EQUAL *mLessEqual;\r
+\r
+public:\r
+  CIfrLessEqual (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_LESS_EQUAL_OP, (CHAR8 **)&mLessEqual),\r
+      CIfrOpHeader (EFI_IFR_LESS_EQUAL_OP, &mLessEqual->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrLessThan : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_LESS_THAN *mLessThan;\r
+\r
+public:\r
+  CIfrLessThan (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_LESS_THAN_OP, (CHAR8 **)&mLessThan),\r
+      CIfrOpHeader (EFI_IFR_LESS_THAN_OP, &mLessThan->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrMatch : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MATCH *mMatch;\r
+\r
+public:\r
+  CIfrMatch (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_MATCH_OP, (CHAR8 **)&mMatch),\r
+      CIfrOpHeader (EFI_IFR_MATCH_OP, &mMatch->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrMultiply : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MULTIPLY *mMultiply;\r
+\r
+public:\r
+  CIfrMultiply (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_MULTIPLY_OP, (CHAR8 **)&mMultiply),\r
+      CIfrOpHeader (EFI_IFR_MULTIPLY_OP, &mMultiply->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrModulo : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MODULO *mModulo;\r
+\r
+public:\r
+  CIfrModulo (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_MODULO_OP, (CHAR8 **)&mModulo),\r
+      CIfrOpHeader (EFI_IFR_MODULO_OP, &mModulo->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrNotEqual : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_NOT_EQUAL *mNotEqual;\r
+\r
+public:\r
+  CIfrNotEqual (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_NOT_EQUAL_OP, (CHAR8 **)&mNotEqual),\r
+      CIfrOpHeader (EFI_IFR_NOT_EQUAL_OP, &mNotEqual->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrOr : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_OR *mOr;\r
+\r
+public:\r
+  CIfrOr (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_OR_OP, (CHAR8 **)&mOr),\r
+      CIfrOpHeader (EFI_IFR_OR_OP, &mOr->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrShiftLeft : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_SHIFT_LEFT *mShiftLeft;\r
+\r
+public:\r
+  CIfrShiftLeft (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_SHIFT_LEFT_OP, (CHAR8 **)&mShiftLeft),\r
+      CIfrOpHeader (EFI_IFR_SHIFT_LEFT_OP, &mShiftLeft->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrShiftRight : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_SHIFT_RIGHT *mShiftRight;\r
+\r
+public:\r
+  CIfrShiftRight (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_SHIFT_RIGHT_OP, (CHAR8 **)&mShiftRight),\r
+      CIfrOpHeader (EFI_IFR_SHIFT_RIGHT_OP, &mShiftRight->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrSubtract : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_SUBTRACT *mSubtract;\r
+\r
+public:\r
+  CIfrSubtract (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_SUBTRACT_OP, (CHAR8 **)&mSubtract),\r
+      CIfrOpHeader (EFI_IFR_SUBTRACT_OP, &mSubtract->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrConditional : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_CONDITIONAL *mConditional;\r
+\r
+public:\r
+  CIfrConditional (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_CONDITIONAL_OP, (CHAR8 **)&mConditional),\r
+      CIfrOpHeader (EFI_IFR_CONDITIONAL_OP, &mConditional->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrFind : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FIND *mFind;\r
+\r
+public:\r
+  CIfrFind (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_FIND_OP, (CHAR8 **)&mFind),\r
+      CIfrOpHeader (EFI_IFR_FIND_OP, &mFind->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetFormat (IN UINT8 Format) {\r
+    mFind->Format = Format;\r
+  }\r
+};\r
+\r
+class CIfrMid : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MID *mMid;\r
+\r
+public:\r
+  CIfrMid (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_MID_OP, (CHAR8 **)&mMid),\r
+      CIfrOpHeader (EFI_IFR_MID_OP, &mMid->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrToken : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_TOKEN *mToken;\r
+\r
+public:\r
+  CIfrToken (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_TOKEN_OP, (CHAR8 **)&mToken),\r
+      CIfrOpHeader (EFI_IFR_TOKEN_OP, &mToken->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
+class CIfrSpan : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_SPAN *mSpan;\r
+\r
+public:\r
+  CIfrSpan (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_SPAN_OP, (CHAR8 **)&mSpan),\r
+      CIfrOpHeader (EFI_IFR_SPAN_OP, &mSpan->Header) {\r
+    SetLineNo (LineNo);\r
+    mSpan->Flags = EFI_IFR_FLAGS_FIRST_MATCHING;\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {\r
+    if (_IS_EQUAL (LFlags, EFI_IFR_FLAGS_FIRST_MATCHING)) {\r
+      mSpan->Flags |= EFI_IFR_FLAGS_FIRST_MATCHING;\r
+    } else if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_FIRST_NON_MATCHING)) {\r
+      mSpan->Flags |= EFI_IFR_FLAGS_FIRST_NON_MATCHING;\r
+    }\r
+\r
+    return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
+  }\r
+};\r
+\r
+#endif\r
diff --git a/Source/C/VfrCompile/VfrServices.cpp b/Source/C/VfrCompile/VfrServices.cpp
deleted file mode 100644 (file)
index 861641b..0000000
+++ /dev/null
@@ -1,758 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation                                                         \r
-All rights reserved. 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
-\r
-Module Name:\r
-\r
-  VfrServices.cpp\r
-\r
-Abstract:\r
-\r
-  Support routines for the VFR compiler\r
-  \r
---*/  \r
-\r
-#include <stdio.h>    // for FILE routines\r
-#include <stdlib.h>   // for malloc() and free()\r
-\r
-#include <Common/UefiBaseTypes.h>\r
-#include <Common/UefiMultiPhase.h>\r
-#include <Common/UefiInternalFormRepresentation.h>\r
-#include <Protocol/UgaDraw.h>  // for EFI_UGA_PIXEL definition\r
-#include <Protocol/HiiFramework.h>\r
-\r
-#include "EfiUtilityMsgs.h"\r
-#include "EfiVfr.h"\r
-#include "VfrServices.h"\r
-\r
-\r
-static const char *mSourceFileHeader[] = {\r
-  "//",\r
-  "//  DO NOT EDIT -- auto-generated file",\r
-  "//",\r
-  "//  This file is generated by the VFR compiler.",\r
-  "//",\r
-  NULL\r
-};\r
-\r
-typedef struct {\r
-   CHAR8    *Name;\r
-   INT32    Size;\r
-} IFR_OPCODE_SIZES;\r
-\r
-//\r
-// Create a table that can be used to do internal checking on the IFR\r
-// bytes we emit.\r
-//\r
-static const IFR_OPCODE_SIZES mOpcodeSizes[] = {\r
-  { 0, 0 },     // invalid\r
-  { "EFI_IFR_FORM",                       sizeof (EFI_IFR_FORM) },\r
-  { "EFI_IFR_SUBTITLE",                   sizeof (EFI_IFR_SUBTITLE) }, \r
-  { "EFI_IFR_TEXT",                       -6 }, //sizeof (EFI_IFR_TEXT) }, \r
-  { "unused 0x04 opcode",                 0 }, // EFI_IFR_GRAPHIC_OP\r
-  { "EFI_IFR_ONE_OF",                     sizeof (EFI_IFR_ONE_OF) }, \r
-  { "EFI_IFR_CHECKBOX",                   sizeof (EFI_IFR_CHECKBOX) }, \r
-  { "EFI_IFR_NUMERIC",                    sizeof (EFI_IFR_NUMERIC) }, \r
-  { "EFI_IFR_PASSWORD",                   sizeof (EFI_IFR_PASSWORD) }, \r
-  { "EFI_IFR_ONE_OF_OPTION",              sizeof (EFI_IFR_ONE_OF_OPTION) }, \r
-  { "EFI_IFR_SUPPRESS",                   sizeof (EFI_IFR_SUPPRESS) }, \r
-  { "EFI_IFR_END_FORM",                   sizeof (EFI_IFR_END_FORM) }, \r
-  { "EFI_IFR_HIDDEN",                     sizeof (EFI_IFR_HIDDEN) }, \r
-  { "EFI_IFR_END_FORM_SET",               sizeof (EFI_IFR_END_FORM_SET) }, \r
-  { "EFI_IFR_FORM_SET",                   sizeof (EFI_IFR_FORM_SET) }, \r
-  { "EFI_IFR_REF",                        sizeof (EFI_IFR_REF) }, \r
-  { "EFI_IFR_END_ONE_OF",                 sizeof (EFI_IFR_END_ONE_OF) }, \r
-  { "EFI_IFR_INCONSISTENT",               sizeof (EFI_IFR_INCONSISTENT) }, \r
-  { "EFI_IFR_EQ_ID_VAL",                  sizeof (EFI_IFR_EQ_ID_VAL) }, \r
-  { "EFI_IFR_EQ_ID_ID",                   sizeof (EFI_IFR_EQ_ID_ID) }, \r
-  { "EFI_IFR_EQ_ID_LIST",                 -sizeof (EFI_IFR_EQ_ID_LIST) }, \r
-  { "EFI_IFR_AND",                        sizeof (EFI_IFR_AND) }, \r
-  { "EFI_IFR_OR",                         sizeof (EFI_IFR_OR) }, \r
-  { "EFI_IFR_NOT",                        sizeof (EFI_IFR_NOT) }, \r
-  { "EFI_IFR_END_EXPR",                   sizeof (EFI_IFR_END_EXPR) }, \r
-  { "EFI_IFR_GRAY_OUT",                   sizeof (EFI_IFR_GRAY_OUT) }, \r
-  { "EFI_IFR_DATE",                       sizeof (EFI_IFR_DATE) / 3 }, \r
-  { "EFI_IFR_TIME",                       sizeof (EFI_IFR_TIME) / 3 }, \r
-  { "EFI_IFR_STRING",                     sizeof (EFI_IFR_STRING) }, \r
-  { "EFI_IFR_LABEL",                      sizeof (EFI_IFR_LABEL) }, \r
-  { "EFI_IFR_SAVE_DEFAULTS",              sizeof (EFI_IFR_SAVE_DEFAULTS) }, \r
-  { "EFI_IFR_RESTORE_DEFAULTS",           sizeof (EFI_IFR_RESTORE_DEFAULTS) }, \r
-  { "EFI_IFR_BANNER",                     sizeof (EFI_IFR_BANNER) },\r
-  { "EFI_IFR_INVENTORY",                  sizeof (EFI_IFR_INVENTORY) },\r
-  { "EFI_IFR_EQ_VAR_VAL_OP",              sizeof (EFI_IFR_EQ_VAR_VAL) },\r
-  { "EFI_IFR_ORDERED_LIST_OP",            sizeof (EFI_IFR_ORDERED_LIST) },\r
-  { "EFI_IFR_VARSTORE_OP",                -sizeof (EFI_IFR_VARSTORE) },\r
-  { "EFI_IFR_VARSTORE_SELECT_OP",         sizeof (EFI_IFR_VARSTORE_SELECT) },\r
-  { "EFI_IFR_VARSTORE_SELECT_PAIR_OP",    sizeof (EFI_IFR_VARSTORE_SELECT_PAIR) },\r
-  { "EFI_IFR_TRUE",                       sizeof (EFI_IFR_TRUE)},\r
-  { "EFI_IFR_FALSE",                      sizeof (EFI_IFR_FALSE)},\r
-  { "EFI_IFR_GT",                         sizeof (EFI_IFR_GT)},\r
-  { "EFI_IFR_GE",                         sizeof (EFI_IFR_GE)},\r
-  { "EFI_IFR_OEM_DEFINED_OP",             -2 },\r
-};\r
-\r
-\r
-VfrOpcodeHandler::VfrOpcodeHandler (\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  Constructor for the VFR opcode handling class.\r
-  \r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{ \r
-  mIfrBytes                       = NULL; \r
-  mLastIfrByte                    = NULL;\r
-  mBytesWritten                   = 0;\r
-  mQueuedByteCount                = 0;\r
-  mQueuedOpcodeByteValid          = 0;\r
-  mPrimaryVarStoreId              = 0;\r
-  mSecondaryVarStoreId            = 0;\r
-  mSecondaryVarStoreIdSet         = 0;\r
-  mPrimaryVarStoreIdSet           = 0;\r
-  mDefaultVarStoreId              = 0;\r
-}\r
-\r
-VOID \r
-VfrOpcodeHandler::SetVarStoreId (\r
-  UINT16 VarStoreId\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function is invoked by the parser when a variable is referenced in the \r
-  VFR. Save the variable store (and set a flag) so that we can later determine \r
-  if we need to emit a varstore-select or varstore-select-pair opcode.\r
-  \r
-Arguments:\r
-  VarStoreId - ID of the variable store referenced in the VFR\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  mPrimaryVarStoreId    = VarStoreId;\r
-  mPrimaryVarStoreIdSet = 1;\r
-}\r
-\r
-VOID \r
-VfrOpcodeHandler::SetSecondaryVarStoreId (\r
-  UINT16 VarStoreId\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function is invoked by the parser when a secondary variable is \r
-  referenced in the VFR. Save the variable store (and set a flag) so \r
-  that we can later determine if we need to emit a varstore-select or \r
-  varstore-pair opcode.\r
-  \r
-Arguments:\r
-  VarStoreId - ID of the variable store referenced in the VFR\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{\r
-  mSecondaryVarStoreId    = VarStoreId;\r
-  mSecondaryVarStoreIdSet = 1;\r
-}\r
-\r
-VOID \r
-VfrOpcodeHandler::WriteIfrBytes (\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  This function is invoked at the end of parsing. Its purpose\r
-  is to write out all the IFR bytes that were queued up while\r
-  parsing.\r
-  \r
-Arguments:\r
-  None\r
-\r
-Returns:\r
-  None\r
-\r
---*/\r
-{ \r
-  IFR_BYTE                  *Curr;\r
-  IFR_BYTE                  *Next;\r
-  UINT32                    Count;\r
-  UINT32                    LineCount;\r
-  UINT32                    PoundLines;\r
-  UINT32                    ByteCount;\r
-  CHAR8                     Line[MAX_LINE_LEN];\r
-  CHAR8                     *Cptr;\r
-  FILE                      *InFptr;\r
-  FILE                      *OutFptr;\r
-  UINT32                    ListFile;\r
-  EFI_HII_IFR_PACK_HEADER   IfrHeader;\r
-  UINT8                     *Ptr;\r
-  FILE                      *IfrBinFptr;\r
-  UINT32                    BytesLeftThisOpcode;\r
-  //\r
-  // If someone added a new opcode and didn't update our opcode sizes structure, error out.\r
-  //\r
-  if (sizeof(mOpcodeSizes) / sizeof (mOpcodeSizes[0]) != EFI_IFR_LAST_OPCODE + 1) {\r
-    Error (__FILE__, __LINE__, 0, "application error", "internal IFR binary table size is incorrect");\r
-    return;\r
-  }\r
-  //\r
-  // Flush the queue\r
-  //\r
-  FlushQueue ();    \r
-  //\r
-  // If there have been any errors to this point, then skip dumping the IFR\r
-  // binary data. This way doing an nmake again will try to build it again, and\r
-  // the build will fail if they did not fix the problem.\r
-  //\r
-  if (GetUtilityStatus () != STATUS_ERROR) {\r
-    if ((IfrBinFptr = fopen (gOptions.IfrOutputFileName, "w")) == NULL) {\r
-      Error (PROGRAM_NAME, 0, 0, gOptions.IfrOutputFileName, "could not open file for writing");\r
-      return;\r
-    }\r
-    //\r
-    // Write the standard file header to the output file\r
-    //\r
-    WriteStandardFileHeader (IfrBinFptr);\r
-    //\r
-    // Write the structure header\r
-    //\r
-    fprintf (IfrBinFptr, "\nunsigned char %sBin[] = {", gOptions.VfrBaseFileName);\r
-    //\r
-    // Write the header\r
-    //\r
-    memset ((char *)&IfrHeader, 0, sizeof (IfrHeader));\r
-    IfrHeader.Header.Type = EFI_HII_IFR;\r
-    IfrHeader.Header.Length = mBytesWritten + sizeof (IfrHeader);    \r
-    Ptr = (UINT8 *)&IfrHeader;\r
-    for (Count = 0; Count < sizeof (IfrHeader); Count++, Ptr++) {\r
-      if ((Count & 0x03) == 0) {\r
-        fprintf (IfrBinFptr, "\n  ");\r
-      }\r
-      fprintf (IfrBinFptr, "0x%02X, ", *Ptr);      \r
-    }\r
-    //\r
-    //\r
-    // Write all the IFR bytes\r
-    //\r
-    fprintf (IfrBinFptr, "\n  // start of IFR data");\r
-    Curr = mIfrBytes;\r
-    Count = 0;\r
-    while (Curr != NULL) {\r
-      if ((Count & 0x0F) == 0) {\r
-        fprintf (IfrBinFptr, "\n  ");\r
-      }\r
-      if (Curr->KeyByte != 0) {\r
-        fprintf (IfrBinFptr, "/*%c*/ ", Curr->KeyByte);\r
-      }\r
-      fprintf (IfrBinFptr, "0x%02X, ", Curr->OpcodeByte);\r
-      Count++;\r
-      Curr = Curr->Next;\r
-    }\r
-    fprintf (IfrBinFptr, "\n};\n\n");\r
-    //\r
-    //\r
-    // Close the file\r
-    //\r
-    fclose (IfrBinFptr); \r
-    IfrBinFptr = NULL;\r
-  }\r
-  //\r
-  // Write the bytes as binary data if the user specified to do so\r
-  //\r
-  if ((GetUtilityStatus () != STATUS_ERROR) &&  (gOptions.CreateIfrBinFile != 0)) {\r
-    //\r
-    // Use the Ifr output file name with a ".hpk" extension.\r
-    //\r
-    for (Cptr = gOptions.IfrOutputFileName + strlen (gOptions.IfrOutputFileName) - 1;\r
-         (*Cptr != '.') && (Cptr > gOptions.IfrOutputFileName) && (*Cptr != '\\');\r
-         Cptr--) {\r
-      //\r
-      // do nothing\r
-      //\r
-    }\r
-    if (*Cptr == '.') {\r
-      strcpy (Cptr, ".hpk");\r
-    } else {\r
-      strcat (gOptions.IfrOutputFileName, ".hpk");\r
-    }\r
-    if ((IfrBinFptr = fopen (gOptions.IfrOutputFileName, "wb")) == NULL) {\r
-      Error (PROGRAM_NAME, 0, 0, gOptions.IfrOutputFileName, "could not open file for writing");\r
-      return;\r
-    }\r
-    //\r
-    // Write the structure header\r
-    //\r
-    memset ((char *)&IfrHeader, 0, sizeof (IfrHeader));\r
-    IfrHeader.Header.Type = EFI_HII_IFR;\r
-    IfrHeader.Header.Length = mBytesWritten + sizeof (IfrHeader);    \r
-    Ptr = (UINT8 *)&IfrHeader;\r
-    for (Count = 0; Count < sizeof (IfrHeader); Count++, Ptr++) {\r
-      fwrite (Ptr, 1, 1, IfrBinFptr);\r
-    }\r
-    //\r
-    //\r
-    // Write all the IFR bytes\r
-    //\r
-    Curr = mIfrBytes;\r
-    Count = 0;\r
-    while (Curr != NULL) {\r
-      fwrite (&Curr->OpcodeByte, 1, 1, IfrBinFptr);\r
-      Curr = Curr->Next;\r
-    }\r
-    //\r
-    //\r
-    // Close the file\r
-    //\r
-    fclose (IfrBinFptr); \r
-    IfrBinFptr = NULL;\r
-  }\r
-  //\r
-  // If creating a listing file, then open the input and output files\r
-  //\r
-  ListFile = 0;\r
-  if (gOptions.CreateListFile) {\r
-    //\r
-    // Open the input VFR file and the output list file\r
-    //\r
-    if ((InFptr = fopen (gOptions.VfrFileName, "r")) == NULL) {\r
-      Warning (PROGRAM_NAME, 0, 0, gOptions.VfrFileName, "could not open file for creating a list file");\r
-    } else {\r
-      if ((OutFptr = fopen (gOptions.VfrListFileName, "w")) == NULL) {\r
-        Warning (PROGRAM_NAME, 0, 0, gOptions.VfrListFileName, "could not open output list file for writing");\r
-        fclose (InFptr);\r
-        InFptr = NULL;\r
-      } else {\r
-        LineCount   = 0;\r
-        ListFile    = 1;\r
-        PoundLines  = 0;\r
-        ByteCount   = 0;\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // Write the list file\r
-  //\r
-  if (ListFile) {\r
-    //\r
-    // Write out the VFR compiler version\r
-    //\r
-    fprintf (OutFptr, "//\n//  VFR compiler version " VFR_COMPILER_VERSION "\n//\n");\r
-    Curr = mIfrBytes;\r
-    while (Curr != NULL) {\r
-      //\r
-      // Print lines until we reach the line of the current opcode\r
-      //\r
-      while (LineCount < PoundLines + Curr->LineNum) {\r
-        if (fgets (Line, sizeof (Line), InFptr) != NULL) {\r
-          //\r
-          // We should check for line length exceeded on the fgets(). Otherwise it\r
-          // throws the listing file output off. Future enhancement perhaps.\r
-          //\r
-          fprintf (OutFptr, "%s", Line);\r
-          if (strncmp (Line, "#line", 5) == 0) {\r
-            PoundLines++;\r
-          }\r
-        }\r
-        LineCount++;\r
-      }\r
-      //\r
-      // Print all opcodes with line numbers less than where we are now\r
-      //\r
-      BytesLeftThisOpcode = 0;\r
-      while ((Curr != NULL) && ((Curr->LineNum == 0) || (LineCount >= PoundLines + Curr->LineNum))) {\r
-        if (BytesLeftThisOpcode == 0) {\r
-          fprintf (OutFptr, ">%08X: ", ByteCount);\r
-          if (Curr->Next != NULL) {\r
-            BytesLeftThisOpcode = (UINT32)Curr->Next->OpcodeByte;\r
-          }\r
-        }\r
-        fprintf (OutFptr, "%02X ", (UINT32)Curr->OpcodeByte);\r
-        ByteCount++;\r
-        BytesLeftThisOpcode--;\r
-        if (BytesLeftThisOpcode == 0) {\r
-          fprintf (OutFptr, "\n");\r
-        }\r
-        Curr = Curr->Next;\r
-      }\r
-    }\r
-    //\r
-    // Dump any remaining lines from the input file\r
-    //\r
-    while (fgets (Line, sizeof (Line), InFptr) != NULL) {\r
-      fprintf (OutFptr, "%s", Line);\r
-    }\r
-    fclose (InFptr);\r
-    fclose (OutFptr);\r
-  }\r
-  //\r
-  // Debug code to make sure that each opcode we write out has as many\r
-  // bytes as the IFR structure requires. If there were errors, then\r
-  // don't do this step.\r
-  //\r
-  if (GetUtilityStatus () != STATUS_ERROR) {\r
-    Curr = mIfrBytes;\r
-    ByteCount = 0;\r
-    while (Curr != NULL) {\r
-      //\r
-      // First byte is the opcode, second byte is the length\r
-      //\r
-      if (Curr->Next == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "last opcode written does not contain a length byte");\r
-        break;\r
-      }\r
-      Count = (UINT32)Curr->Next->OpcodeByte;\r
-      if (Count == 0) {\r
-        Error (\r
-          __FILE__, \r
-          __LINE__, \r
-          0, \r
-          "application error", \r
-          "opcode with 0 length specified in output at offset 0x%X", \r
-          ByteCount\r
-          );\r
-        break;\r
-      }\r
-      //\r
-      // Check the length\r
-      //\r
-      if ((Curr->OpcodeByte > EFI_IFR_LAST_OPCODE) || (Curr->OpcodeByte == 0)) {\r
-        Error (\r
-          __FILE__, \r
-          __LINE__, \r
-          0, \r
-          "application error", \r
-          "invalid opcode 0x%X in output at offset 0x%X", \r
-          (UINT32) Curr->OpcodeByte, ByteCount\r
-          );\r
-      } else if (mOpcodeSizes[Curr->OpcodeByte].Size < 0) {\r
-        //\r
-        // For those cases where the length is variable, the size is negative, and indicates\r
-        // the miniumum size.\r
-        //\r
-        if ((mOpcodeSizes[Curr->OpcodeByte].Size * -1) > Count) {\r
-          Error (\r
-            __FILE__, \r
-            __LINE__, \r
-            0, \r
-            "application error", \r
-            "insufficient number of bytes written for %s at offset 0x%X",\r
-            mOpcodeSizes[Curr->OpcodeByte].Name, \r
-            ByteCount\r
-            );\r
-        }\r
-      } else {\r
-        //\r
-        // Check for gaps\r
-        //\r
-        if (mOpcodeSizes[Curr->OpcodeByte].Size == 0) {\r
-          Error (\r
-            __FILE__, \r
-            __LINE__, \r
-            0, \r
-            "application error", \r
-            "invalid opcode 0x%X in output at offset 0x%X", \r
-            (UINT32)Curr->OpcodeByte, \r
-            ByteCount\r
-            );\r
-        } else {\r
-          //\r
-          // Check size\r
-          //\r
-          if (mOpcodeSizes[Curr->OpcodeByte].Size != Count) {\r
-            Error (\r
-              __FILE__, \r
-              __LINE__, \r
-              0, \r
-              "application error", \r
-              "invalid number of bytes (%d written s/b %d) written for %s at offset 0x%X",\r
-              Count, \r
-              mOpcodeSizes[Curr->OpcodeByte].Size, \r
-              mOpcodeSizes[Curr->OpcodeByte].Name, \r
-              ByteCount\r
-              );\r
-          }\r
-        }\r
-      }\r
-      //\r
-      // Skip to next opcode\r
-      //\r
-      while (Count > 0) {\r
-        ByteCount++;\r
-        if (Curr == NULL) {\r
-          Error (__FILE__, __LINE__, 0, "application error", "last opcode written has invalid length");\r
-          break;\r
-        }\r
-        Curr = Curr->Next;\r
-        Count--;\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-VfrOpcodeHandler::~VfrOpcodeHandler(\r
-  ) \r
-/*++\r
-\r
-Routine Description:\r
-  Destructor for the VFR opcode handler. Free up memory allocated