]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrFormPkg.cpp
index ddae8654988f0f058a6802ac2b612c548461fde4..50398c6317450b22c2d13aa1aee63d10911f8947 100644 (file)
@@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 Module Name:\r
 \r
-VfrFormPkg.cpp\r
+  VfrFormPkg.cpp\r
 \r
 Abstract:\r
 \r
@@ -25,25 +25,34 @@ Abstract:
  */\r
 \r
 SPendingAssign::SPendingAssign (\r
-  IN INT8   *Key, \r
-  IN VOID   *Addr, \r
-  IN UINT32 Len, \r
-  IN UINT32 LineNo\r
+  IN INT8   *Key,\r
+  IN VOID   *Addr,\r
+  IN UINT32 Len,\r
+  IN UINT32 LineNo,\r
+  IN INT8   *Msg\r
   )\r
 {\r
+  mKey    = NULL;\r
+  mAddr   = Addr;\r
+  mLen    = Len;\r
+  mFlag   = PENDING;\r
+  mLineNo = LineNo;\r
+  mMsg    = NULL;\r
+  mNext   = NULL;\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
+  if (Msg != NULL) {\r
+    mMsg = new INT8[strlen (Msg) + 1];\r
+    if (mMsg != NULL) {\r
+      strcpy (mMsg, Msg);\r
+    }\r
+  }\r
 }\r
 \r
 SPendingAssign::~SPendingAssign (\r
@@ -56,12 +65,15 @@ SPendingAssign::~SPendingAssign (
   mAddr   = NULL;\r
   mLen    = 0;\r
   mLineNo = 0;\r
+  if (mMsg != NULL) {\r
+    delete mMsg;\r
+  }\r
   mNext   = NULL;\r
 }\r
 \r
 VOID\r
 SPendingAssign::SetAddrAndLen (\r
-  IN VOID   *Addr, \r
+  IN VOID   *Addr,\r
   IN UINT32 LineNo\r
   )\r
 {\r
@@ -71,7 +83,7 @@ SPendingAssign::SetAddrAndLen (
 \r
 VOID\r
 SPendingAssign::AssignValue (\r
-  IN VOID   *Addr, \r
+  IN VOID   *Addr,\r
   IN UINT32 Len\r
   )\r
 {\r
@@ -227,7 +239,7 @@ CFormPkg::Close (
 \r
 UINT32\r
 CFormPkg::Read (\r
-  IN CHAR8     *Buffer, \r
+  IN CHAR8     *Buffer,\r
   IN UINT32    Size\r
   )\r
 {\r
@@ -270,7 +282,7 @@ CFormPkg::BuildPkgHdr (
     return VFR_RETURN_OUT_FOR_RESOURCES;\r
   }\r
 \r
-  (*PkgHdr)->Type = EFI_HII_PACKAGE_FORM;\r
+  (*PkgHdr)->Type = EFI_HII_PACKAGE_FORMS;\r
   (*PkgHdr)->Length = mPkgLength + sizeof (EFI_HII_PACKAGE_HEADER);\r
   return VFR_RETURN_SUCCESS;\r
 }\r
@@ -357,7 +369,7 @@ CFormPkg::_WRITE_PKG_END (
 \r
 #define BYTES_PRE_LINE 0x10\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CFormPkg::GenCFile (\r
   IN INT8 *BaseName,\r
   IN FILE *pFile\r
@@ -407,15 +419,16 @@ CFormPkg::GenCFile (
 \r
 EFI_VFR_RETURN_CODE\r
 CFormPkg::AssignPending (\r
-  IN INT8   *Key, \r
-  IN VOID   *ValAddr, \r
+  IN INT8   *Key,\r
+  IN VOID   *ValAddr,\r
   IN UINT32 ValLen,\r
-  IN UINT32 LineNo\r
+  IN UINT32 LineNo,\r
+  IN INT8   *Msg\r
   )\r
 {\r
   SPendingAssign *pNew;\r
 \r
-  pNew = new SPendingAssign (Key, ValAddr, ValLen, LineNo);\r
+  pNew = new SPendingAssign (Key, ValAddr, ValLen, LineNo, Msg);\r
   if (pNew == NULL) {\r
     return VFR_RETURN_OUT_FOR_RESOURCES;\r
   }\r
@@ -427,8 +440,8 @@ CFormPkg::AssignPending (
 \r
 VOID\r
 CFormPkg::DoPendingAssign (\r
-  IN INT8   *Key, \r
-  IN VOID   *ValAddr, \r
+  IN INT8   *Key,\r
+  IN VOID   *ValAddr,\r
   IN UINT32 ValLen\r
   )\r
 {\r
@@ -470,7 +483,7 @@ CFormPkg::PendingAssignPrintAll (
 \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
+      gCVfrErrorHandle.PrintMsg (pNode->mLineNo, pNode->mKey, "Error", pNode->mMsg);\r
     }\r
   }\r
 }\r
@@ -492,10 +505,7 @@ SIfrRecord::~SIfrRecord (
   VOID\r
   )\r
 {\r
-  if (mIfrBinBuf != NULL) {\r
-    delete mIfrBinBuf;\r
-    mIfrBinBuf = NULL;\r
-  }\r
+  mIfrBinBuf   = NULL;\r
   mLineNo      = 0xFFFFFFFF;\r
   mOffset      = 0xFFFFFFFF;\r
   mBinBufLen   = 0;\r
@@ -537,8 +547,8 @@ CIfrRecordInfoDB::GetRecordInfoFromIdx (
     return NULL;\r
   }\r
 \r
-  for (Idx = (EFI_IFR_RECORDINFO_IDX_START + 1), pNode = mIfrRecordListHead; \r
-       (Idx != RecordIdx) && (pNode != NULL); \r
+  for (Idx = (EFI_IFR_RECORDINFO_IDX_START + 1), pNode = mIfrRecordListHead;\r
+       (Idx != RecordIdx) && (pNode != NULL);\r
        Idx++, pNode = pNode->mNext)\r
   ;\r
 \r
@@ -547,8 +557,8 @@ CIfrRecordInfoDB::GetRecordInfoFromIdx (
 \r
 UINT32\r
 CIfrRecordInfoDB::IfrRecordRegister (\r
-  IN UINT32 LineNo, \r
-  IN CHAR8  *IfrBinBuf, \r
+  IN UINT32 LineNo,\r
+  IN CHAR8  *IfrBinBuf,\r
   IN UINT8  BinBufLen,\r
   IN UINT32 Offset\r
   )\r
@@ -577,7 +587,7 @@ CIfrRecordInfoDB::IfrRecordRegister (
 \r
 VOID\r
 CIfrRecordInfoDB::IfrRecordInfoUpdate (\r
-  IN UINT32 RecordIdx, \r
+  IN UINT32 RecordIdx,\r
   IN UINT32 LineNo,\r
   IN CHAR8  *BinBuf,\r
   IN UINT8  BinBufLen,\r
@@ -585,23 +595,25 @@ CIfrRecordInfoDB::IfrRecordInfoUpdate (
   )\r
 {\r
   SIfrRecord *pNode;\r
+  SIfrRecord *Prev;\r
 \r
   if ((pNode = GetRecordInfoFromIdx (RecordIdx)) == NULL) {\r
     return;\r
   }\r
 \r
+  if (LineNo == 0) {\r
+    //\r
+    // Line number is not specified explicitly, try to use line number of previous opcode\r
+    //\r
+    Prev = GetRecordInfoFromIdx (RecordIdx - 1);\r
+    if (Prev != NULL) {\r
+      LineNo = Prev->mLineNo;\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
+  pNode->mIfrBinBuf = BinBuf;\r
 }\r
 \r
 VOID\r
@@ -626,7 +638,7 @@ CIfrRecordInfoDB::IfrRecordOutput (
       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
+          fprintf (File, "%02X ", (UINT8)(pNode->mIfrBinBuf[Index]));\r
         }\r
       }\r
       fprintf (File, "\n");\r
@@ -650,6 +662,7 @@ CIfrObj::_EMIT_PENDING_OBJ (
 \r
   if (mObjBinBuf != NULL) {\r
     delete mObjBinBuf;\r
+    mObjBinBuf = ObjBinBuf;\r
   }\r
 }\r
 \r
@@ -689,7 +702,7 @@ static struct {
   { 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_REFRESH), 0 },             // 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
@@ -829,10 +842,10 @@ CIfrObj::~CIfrObj (
 UINT8 gScopeCount = 0;\r
 \r
 CIfrOpHeader::CIfrOpHeader (\r
-  IN UINT8 OpCode, \r
+  IN UINT8 OpCode,\r
   IN VOID *StartAddr,\r
-  IN UINT8 Length \r
-  ) : mHeader ((EFI_IFR_OP_HEADER *)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