\r
Module Name:\r
\r
-VfrFormPkg.cpp\r
+ VfrFormPkg.cpp\r
\r
Abstract:\r
\r
*/\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
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
\r
VOID\r
SPendingAssign::AssignValue (\r
- IN VOID *Addr, \r
+ IN VOID *Addr,\r
IN UINT32 Len\r
)\r
{\r
\r
UINT32\r
CFormPkg::Read (\r
- IN CHAR8 *Buffer, \r
+ IN CHAR8 *Buffer,\r
IN UINT32 Size\r
)\r
{\r
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
\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
\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
\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
\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
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
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
\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
\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
)\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
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
\r
if (mObjBinBuf != NULL) {\r
delete mObjBinBuf;\r
+ mObjBinBuf = ObjBinBuf;\r
}\r
}\r
\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_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
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