|
From: <lg...@us...> - 2010-02-24 09:18:10
|
Revision: 1896
http://edk2-buildtools.svn.sourceforge.net/edk2-buildtools/?rev=1896&view=rev
Author: lgao4
Date: 2010-02-24 09:18:03 +0000 (Wed, 24 Feb 2010)
Log Message:
-----------
Enhance VfrCompiler to support HiiFormMap feature.
Modified Paths:
--------------
trunk/BaseTools/Source/C/Include/Common/UefiInternalFormRepresentation.h
trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h
trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g
trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
Modified: trunk/BaseTools/Source/C/Include/Common/UefiInternalFormRepresentation.h
===================================================================
--- trunk/BaseTools/Source/C/Include/Common/UefiInternalFormRepresentation.h 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/Include/Common/UefiInternalFormRepresentation.h 2010-02-24 09:18:03 UTC (rev 1896)
@@ -3,7 +3,7 @@
IFR is primarily consumed by the EFI presentation engine, and produced by EFI
internal application and drivers as well as all add-in card option-ROM drivers
- Copyright (c) 2006 - 2009, Intel Corporation All rights reserved.
+ Copyright (c) 2006 - 2010, Intel Corporation All rights reserved.
This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this
@@ -618,6 +618,7 @@
#define EFI_IFR_DISABLE_IF_OP 0x1E
#define EFI_IFR_TO_LOWER_OP 0x20
#define EFI_IFR_TO_UPPER_OP 0x21
+#define EFI_IFR_MAP_OP 0x22
#define EFI_IFR_ORDERED_LIST_OP 0x23
#define EFI_IFR_VARSTORE_OP 0x24
#define EFI_IFR_VARSTORE_NAME_VALUE_OP 0x25
@@ -626,6 +627,10 @@
#define EFI_IFR_VERSION_OP 0x28
#define EFI_IFR_END_OP 0x29
#define EFI_IFR_MATCH_OP 0x2A
+#define EFI_IFR_GET_OP 0x2B
+#define EFI_IFR_SET_OP 0x2C
+#define EFI_IFR_READ_OP 0x2D
+#define EFI_IFR_WRITE_OP 0x2E
#define EFI_IFR_EQUAL_OP 0x2F
#define EFI_IFR_NOT_EQUAL_OP 0x30
#define EFI_IFR_GREATER_THAN_OP 0x31
@@ -672,6 +677,7 @@
#define EFI_IFR_VALUE_OP 0x5A
#define EFI_IFR_DEFAULT_OP 0x5B
#define EFI_IFR_DEFAULTSTORE_OP 0x5C
+#define EFI_IFR_FORM_MAP_OP 0x5D
#define EFI_IFR_CATENATE_OP 0x5E
#define EFI_IFR_GUID_OP 0x5F
#define EFI_IFR_SECURITY_OP 0x60
@@ -730,14 +736,14 @@
typedef struct _EFI_IFR_VARSTORE_EFI {
EFI_IFR_OP_HEADER Header;
- UINT16 VarStoreId;
+ EFI_VARSTORE_ID VarStoreId;
EFI_GUID Guid;
UINT32 Attributes;
} EFI_IFR_VARSTORE_EFI;
typedef struct _EFI_IFR_VARSTORE_NAME_VALUE {
EFI_IFR_OP_HEADER Header;
- UINT16 VarStoreId;
+ EFI_VARSTORE_ID VarStoreId;
EFI_GUID Guid;
} EFI_IFR_VARSTORE_NAME_VALUE;
@@ -747,7 +753,7 @@
EFI_STRING_ID FormSetTitle;
EFI_STRING_ID Help;
UINT8 Flags;
- EFI_GUID ClassGuid[1];
+ // EFI_GUID ClassGuid[];
} EFI_IFR_FORM_SET;
typedef struct _EFI_IFR_END {
@@ -1009,6 +1015,9 @@
#define EFI_IFR_TYPE_DATE 0x06
#define EFI_IFR_TYPE_STRING 0x07
#define EFI_IFR_TYPE_OTHER 0x08
+#define EFI_IFR_TYPE_UNDEFINED 0x09
+#define EFI_IFR_TYPE_ACTION 0x0A
+#define EFI_IFR_TYPE_BUFFER 0x0B
#define EFI_IFR_OPTION_DEFAULT 0x10
#define EFI_IFR_OPTION_DEFAULT_MFG 0x20
@@ -1288,6 +1297,100 @@
EFI_GUID Permissions;
} EFI_IFR_SECURITY;
+typedef struct _EFI_IFR_FORM_MAP_METHOD {
+ ///
+ /// The string identifier which provides the human-readable name of
+ /// the configuration method for this standards map form.
+ ///
+ EFI_STRING_ID MethodTitle;
+ ///
+ /// Identifier which uniquely specifies the configuration methods
+ /// associated with this standards map form.
+ ///
+ EFI_GUID MethodIdentifier;
+} EFI_IFR_FORM_MAP_METHOD;
+
+typedef struct _EFI_IFR_FORM_MAP {
+ ///
+ /// The sequence that defines the type of opcode as well as the length
+ /// of the opcode being defined. Header.OpCode = EFI_IFR_FORM_MAP_OP.
+ ///
+ EFI_IFR_OP_HEADER Header;
+ ///
+ /// The unique identifier for this particular form.
+ ///
+ EFI_FORM_ID FormId;
+ ///
+ /// One or more configuration method's name and unique identifier.
+ ///
+ // EFI_IFR_FORM_MAP_METHOD Methods[];
+} EFI_IFR_FORM_MAP;
+
+typedef struct _EFI_IFR_SET {
+ ///
+ /// The sequence that defines the type of opcode as well as the length
+ /// of the opcode being defined. Header.OpCode = EFI_IFR_SET_OP.
+ ///
+ EFI_IFR_OP_HEADER Header;
+ ///
+ /// Specifies the identifier of a previously declared variable store to
+ /// use when storing the question's value.
+ ///
+ EFI_VARSTORE_ID VarStoreId;
+ union {
+ ///
+ /// A 16-bit Buffer Storage offset.
+ ///
+ EFI_STRING_ID VarName;
+ ///
+ /// A Name Value or EFI Variable name (VarName).
+ ///
+ UINT16 VarOffset;
+ } VarStoreInfo;
+ ///
+ /// Specifies the type used for storage.
+ ///
+ UINT8 VarStoreType;
+} EFI_IFR_SET;
+
+typedef struct _EFI_IFR_GET {
+ ///
+ /// The sequence that defines the type of opcode as well as the length
+ /// of the opcode being defined. Header.OpCode = EFI_IFR_GET_OP.
+ ///
+ EFI_IFR_OP_HEADER Header;
+ ///
+ /// Specifies the identifier of a previously declared variable store to
+ /// use when retrieving the value.
+ ///
+ EFI_VARSTORE_ID VarStoreId;
+ union {
+ ///
+ /// A 16-bit Buffer Storage offset.
+ ///
+ EFI_STRING_ID VarName;
+ ///
+ /// A Name Value or EFI Variable name (VarName).
+ ///
+ UINT16 VarOffset;
+ } VarStoreInfo;
+ ///
+ /// Specifies the type used for storage.
+ ///
+ UINT8 VarStoreType;
+} EFI_IFR_GET;
+
+typedef struct _EFI_IFR_READ {
+ EFI_IFR_OP_HEADER Header;
+} EFI_IFR_READ;
+
+typedef struct _EFI_IFR_WRITE {
+ EFI_IFR_OP_HEADER Header;
+} EFI_IFR_WRITE;
+
+typedef struct _EFI_IFR_MAP {
+ EFI_IFR_OP_HEADER Header;
+} EFI_IFR_MAP;
//
// Keyboard Package
//
Modified: trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h 2010-02-24 09:18:03 UTC (rev 1896)
@@ -1,6 +1,6 @@
/** @file
-Copyright (c) 2004 - 2008, Intel Corporation
+Copyright (c) 2004 - 2010, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -31,6 +31,7 @@
#define MAX_VFR_LINE_LEN 4096
#define EFI_IFR_MAX_LENGTH 0xFF
+#define MAX_IFR_EXPRESSION_DEPTH 0x9
#define EFI_VARSTORE_ID_INVALID 0
#define EFI_VAROFFSET_INVALID 0xFFFF
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp 2010-02-24 09:18:03 UTC (rev 1896)
@@ -2,7 +2,7 @@
The definition of CFormPkg's member function
-Copyright (c) 2004 - 2009, Intel Corporation
+Copyright (c) 2004 - 2010, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -1242,7 +1242,7 @@
{ 0, 0 }, // 0x1F
{ sizeof (EFI_IFR_TO_LOWER), 0 }, // EFI_IFR_TO_LOWER_OP - 0x20
{ sizeof (EFI_IFR_TO_UPPER), 0 }, // EFI_IFR_TO_UPPER_OP - 0x21
- { 0, 0 }, // 0x22
+ { sizeof (EFI_IFR_MAP), 1 }, // EFI_IFR_MAP - 0x22
{ sizeof (EFI_IFR_ORDERED_LIST), 1 }, // EFI_IFR_ORDERED_LIST_OP - 0x23
{ sizeof (EFI_IFR_VARSTORE), 0 }, // EFI_IFR_VARSTORE_OP
{ sizeof (EFI_IFR_VARSTORE_NAME_VALUE), 0 }, // EFI_IFR_VARSTORE_NAME_VALUE_OP
@@ -1250,8 +1250,11 @@
{ sizeof (EFI_IFR_VARSTORE_DEVICE), 1 }, // EFI_IFR_VARSTORE_DEVICE_OP
{ sizeof (EFI_IFR_VERSION), 0 }, // EFI_IFR_VERSION_OP - 0x28
{ sizeof (EFI_IFR_END), 0 }, // EFI_IFR_END_OP
- { sizeof (EFI_IFR_MATCH), 1 }, // EFI_IFR_MATCH_OP - 0x2A
- { 0, 0 }, { 0, 0} , { 0, 0} , { 0, 0} , // 0x2B ~ 0x2E
+ { sizeof (EFI_IFR_MATCH), 0 }, // EFI_IFR_MATCH_OP - 0x2A
+ { sizeof (EFI_IFR_GET), 0 }, // EFI_IFR_GET - 0x2B
+ { sizeof (EFI_IFR_SET), 0 }, // EFI_IFR_SET - 0x2C
+ { sizeof (EFI_IFR_READ), 0 }, // EFI_IFR_READ - 0x2D
+ { sizeof (EFI_IFR_WRITE), 0 }, // EFI_IFR_WRITE - 0x2E
{ sizeof (EFI_IFR_EQUAL), 0 }, // EFI_IFR_EQUAL_OP - 0x2F
{ sizeof (EFI_IFR_NOT_EQUAL), 0 }, // EFI_IFR_NOT_EQUAL_OP
{ sizeof (EFI_IFR_GREATER_THAN), 0 }, // EFI_IFR_GREATER_THAN_OP
@@ -1298,7 +1301,7 @@
{ sizeof (EFI_IFR_VALUE), 1 }, // EFI_IFR_VALUE_OP
{ sizeof (EFI_IFR_DEFAULT), 0 }, // EFI_IFR_DEFAULT_OP
{ sizeof (EFI_IFR_DEFAULTSTORE), 0 }, // EFI_IFR_DEFAULTSTORE_OP - 0x5C
- { 0, 0}, // 0x5D
+ { sizeof (EFI_IFR_FORM_MAP), 1}, // EFI_IFR_FORM_MAP_OP - 0x5D
{ sizeof (EFI_IFR_CATENATE), 0 }, // EFI_IFR_CATENATE_OP
{ sizeof (EFI_IFR_GUID), 0 }, // EFI_IFR_GUID_OP
{ sizeof (EFI_IFR_SECURITY), 0 }, // EFI_IFR_SECURITY_OP - 0x60
@@ -1313,9 +1316,9 @@
"EFI_IFR_ACTION", "EFI_IFR_RESET_BUTTON", "EFI_IFR_FORM_SET", "EFI_IFR_REF", "EFI_IFR_NO_SUBMIT_IF", "EFI_IFR_INCONSISTENT_IF",
"EFI_IFR_EQ_ID_VAL", "EFI_IFR_EQ_ID_ID", "EFI_IFR_EQ_ID_LIST", "EFI_IFR_AND", "EFI_IFR_OR", "EFI_IFR_NOT",
"EFI_IFR_RULE", "EFI_IFR_GRAY_OUT_IF", "EFI_IFR_DATE", "EFI_IFR_TIME", "EFI_IFR_STRING", "EFI_IFR_REFRESH",
- "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID", "EFI_IFR_TO_LOWER", "EFI_IFR_TO_UPPER", "EFI_IFR_INVALID", "EFI_IFR_ORDERED_LIST",
+ "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID", "EFI_IFR_TO_LOWER", "EFI_IFR_TO_UPPER", "EFI_IFR_MAP", "EFI_IFR_ORDERED_LIST",
"EFI_IFR_VARSTORE", "EFI_IFR_VARSTORE_NAME_VALUE", "EFI_IFR_VARSTORE_EFI", "EFI_IFR_VARSTORE_DEVICE", "EFI_IFR_VERSION", "EFI_IFR_END",
- "EFI_IFR_MATCH", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_EQUAL",
+ "EFI_IFR_MATCH", "EFI_IFR_GET", "EFI_IFR_SET", "EFI_IFR_READ", "EFI_IFR_WRITE", "EFI_IFR_EQUAL",
"EFI_IFR_NOT_EQUAL", "EFI_IFR_GREATER_THAN", "EFI_IFR_GREATER_EQUAL", "EFI_IFR_LESS_THAN", "EFI_IFR_LESS_EQUAL", "EFI_IFR_BITWISE_AND",
"EFI_IFR_BITWISE_OR", "EFI_IFR_BITWISE_NOT", "EFI_IFR_SHIFT_LEFT", "EFI_IFR_SHIFT_RIGHT", "EFI_IFR_ADD", "EFI_IFR_SUBTRACT",
"EFI_IFR_MULTIPLY", "EFI_IFR_DIVIDE", "EFI_IFR_MODULO", "EFI_IFR_RULE_REF", "EFI_IFR_QUESTION_REF1", "EFI_IFR_QUESTION_REF2",
@@ -1323,7 +1326,7 @@
"EFI_IFR_TO_UINT", "EFI_IFR_TO_STRING", "EFI_IFR_TO_BOOLEAN", "EFI_IFR_MID", "EFI_IFR_FIND", "EFI_IFR_TOKEN",
"EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2", "EFI_IFR_CONDITIONAL", "EFI_IFR_QUESTION_REF3", "EFI_IFR_ZERO", "EFI_IFR_ONE",
"EFI_IFR_ONES", "EFI_IFR_UNDEFINED", "EFI_IFR_LENGTH", "EFI_IFR_DUP", "EFI_IFR_THIS", "EFI_IFR_SPAN",
- "EFI_IFR_VALUE", "EFI_IFR_DEFAULT", "EFI_IFR_DEFAULTSTORE", "EFI_IFR_INVALID", "EFI_IFR_CATENATE", "EFI_IFR_GUID",
+ "EFI_IFR_VALUE", "EFI_IFR_DEFAULT", "EFI_IFR_DEFAULTSTORE", "EFI_IFR_FORM_MAP", "EFI_IFR_CATENATE", "EFI_IFR_GUID",
"EFI_IFR_SECURITY",
};
@@ -1396,4 +1399,4 @@
mHeader = OpHdr.mHeader;
}
-UINT32 CIfrForm::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };
+UINT32 CIfrFormId::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.h 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrFormPkg.h 2010-02-24 09:18:03 UTC (rev 1896)
@@ -2,7 +2,7 @@
The definition of CFormPkg's member function
-Copyright (c) 2004 - 2009, Intel Corporation
+Copyright (c) 2004 - 2010, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -557,6 +557,7 @@
class CIfrFormSet : public CIfrObj, public CIfrOpHeader {
private:
EFI_IFR_FORM_SET *mFormSet;
+ EFI_GUID *mClassGuid;
public:
CIfrFormSet (UINT8 Size) : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet, Size),
@@ -565,6 +566,7 @@
mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;
mFormSet->Flags = 0;
memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));
+ mClassGuid = (EFI_GUID *) (mFormSet + 1);
}
VOID SetGuid (IN EFI_GUID *Guid) {
@@ -580,7 +582,7 @@
}
VOID SetClassGuid (IN EFI_GUID *Guid) {
- memcpy (&(mFormSet->ClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));
+ memcpy (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));
}
UINT8 GetFlags() {
@@ -620,10 +622,8 @@
#define EFI_FORM_ID_MAX 0xFFFF
#define EFI_FREE_FORM_ID_BITMAP_SIZE ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)
-class CIfrForm : public CIfrObj, public CIfrOpHeader {
-private:
- EFI_IFR_FORM *mForm;
-
+class CIfrFormId {
+public:
STATIC UINT32 FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE];
STATIC BOOLEAN ChekFormIdFree (IN EFI_FORM_ID FormId) {
@@ -639,7 +639,12 @@
FormIdBitMap[Index] |= (0x80000000 >> Offset);
}
+};
+class CIfrForm : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FORM *mForm;
+
public:
CIfrForm () : CIfrObj (EFI_IFR_FORM_OP, (CHAR8 **)&mForm),
CIfrOpHeader (EFI_IFR_FORM_OP, &mForm->Header) {
@@ -654,11 +659,11 @@
//
return VFR_RETURN_INVALID_PARAMETER;
}
- if (CIfrForm::ChekFormIdFree (FormId) == FALSE) {
+ if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {
return VFR_RETURN_FORMID_REDEFINED;
}
mForm->FormId = FormId;
- CIfrForm::MarkFormIdUsed (FormId);
+ CIfrFormId::MarkFormIdUsed (FormId);
return VFR_RETURN_SUCCESS;
}
@@ -667,6 +672,44 @@
}
};
+class CIfrFormMap : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FORM_MAP *mFormMap;
+ EFI_IFR_FORM_MAP_METHOD *mMethodMap;
+
+public:
+ CIfrFormMap () : CIfrObj (EFI_IFR_FORM_MAP_OP, (CHAR8 **)&mFormMap, sizeof (EFI_IFR_FORM_MAP), TRUE),
+ CIfrOpHeader (EFI_IFR_FORM_MAP_OP, &mFormMap->Header) {
+ mFormMap->FormId = 0;
+ mMethodMap = (EFI_IFR_FORM_MAP_METHOD *) (mFormMap + 1);
+ }
+
+ EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {
+ if (FormId == 0) {
+ //
+ // FormId can't be 0.
+ //
+ return VFR_RETURN_INVALID_PARAMETER;
+ }
+ if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {
+ return VFR_RETURN_FORMID_REDEFINED;
+ }
+ mFormMap->FormId = FormId;
+ CIfrFormId::MarkFormIdUsed (FormId);
+ return VFR_RETURN_SUCCESS;
+ }
+
+ VOID SetFormMapMethod (IN EFI_STRING_ID MethodTitle, IN EFI_GUID *MethodGuid) {
+ if (ExpendObjBin (sizeof (EFI_IFR_FORM_MAP_METHOD))) {
+ IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD));
+
+ mMethodMap->MethodTitle = MethodTitle;
+ memcpy (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID));
+ mMethodMap ++;
+ }
+ }
+};
+
class CIfrVarStore : public CIfrObj, public CIfrOpHeader {
private:
EFI_IFR_VARSTORE *mVarStore;
@@ -832,6 +875,66 @@
};
+class CIfrRead : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_READ *mRead;
+
+public:
+ CIfrRead () : CIfrObj (EFI_IFR_READ_OP, (CHAR8 **)&mRead),
+ CIfrOpHeader (EFI_IFR_READ_OP, &mRead->Header) {}
+
+};
+
+class CIfrWrite : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_WRITE *mWrite;
+
+public:
+ CIfrWrite () : CIfrObj (EFI_IFR_WRITE_OP, (CHAR8 **)&mWrite),
+ CIfrOpHeader (EFI_IFR_WRITE_OP, &mWrite->Header) {}
+
+};
+
+class CIfrGet : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_GET *mGet;
+
+public:
+ CIfrGet (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_GET_OP, (CHAR8 **)&mGet),
+ CIfrOpHeader (EFI_IFR_GET_OP, &mGet->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {
+ mGet->VarStoreId = Info->mVarStoreId;
+ mGet->VarStoreInfo.VarName = Info->mInfo.mVarName;
+ mGet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
+ mGet->VarStoreType = Info->mVarType;
+ }
+};
+
+class CIfrSet : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_SET *mSet;
+
+public:
+ CIfrSet (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_SET_OP, (CHAR8 **)&mSet),
+ CIfrOpHeader (EFI_IFR_SET_OP, &mSet->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {
+ mSet->VarStoreId = Info->mVarStoreId;
+ mSet->VarStoreInfo.VarName = Info->mInfo.mVarName;
+ mSet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
+ mSet->VarStoreType = Info->mVarType;
+ }
+};
+
class CIfrSubtitle : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
private:
EFI_IFR_SUBTITLE *mSubtitle;
@@ -2310,6 +2413,19 @@
}
};
+class CIfrMap : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_MAP *mMap;
+
+public:
+ CIfrMap (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_MAP_OP, (CHAR8 **)&mMap),
+ CIfrOpHeader (EFI_IFR_MAP_OP, &mMap->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
class CIfrMatch : public CIfrObj, public CIfrOpHeader {
private:
EFI_IFR_MATCH *mMatch;
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g 2010-02-24 09:18:03 UTC (rev 1896)
@@ -131,6 +131,9 @@
#token EndList("endlist") "endlist"
#token EndForm("endform") "endform"
#token Form("form") "form"
+#token FormMap("formmap") "formmap"
+#token MapTitle("maptitle") "maptitle"
+#token MapGuid("mapguid") "mapguid"
#token Subtitle("subtitle") "subtitle"
#token Help("help") "help"
#token Text("text") "text"
@@ -214,6 +217,8 @@
#token Rule("rule") "rule"
#token EndRule("endrule") "endrule"
#token Value("value") "value"
+#token Read("read") "read"
+#token Write("write") "write"
#token ResetButton("resetbutton") "resetbutton"
#token EndResetButton("endresetbutton") "endresetbutton"
#token DefaultStore("defaultstore") "defaultstore"
@@ -250,7 +255,8 @@
vfrProgram > [UINT8 Return] :
<<
- mParserStatus = 0;
+ mParserStatus = 0;
+ mCIfrOpHdrIndex = 0;
mConstantOnlyInExpression = FALSE;
>>
(
@@ -488,24 +494,26 @@
<<
switch (ClassGuidNum) {
case 0:
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));
FSObj->SetClassGuid(&DefaultClassGuid);
break;
case 1:
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
FSObj->SetClassGuid(&ClassGuid1);
break;
case 2:
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
FSObj->SetClassGuid(&ClassGuid1);
FSObj->SetClassGuid(&ClassGuid2);
break;
- default:
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + 2 * sizeof(EFI_GUID));
+ case 3:
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
FSObj->SetClassGuid(&ClassGuid1);
FSObj->SetClassGuid(&ClassGuid2);
FSObj->SetClassGuid(&ClassGuid3);
break;
+ default:
+ break;
}
SET_LINE_INFO (*FSObj, L);
@@ -544,6 +552,7 @@
vfrFormSetList :
(
vfrFormDefinition |
+ vfrFormMapDefinition |
vfrStatementImage |
vfrStatementVarStoreLinear |
vfrStatementVarStoreEfi |
@@ -774,11 +783,11 @@
mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);
break;
case QUESTION_DATE:
- mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);
- break;
+ mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);
+ break;
case QUESTION_TIME:
- mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);
- break;
+ mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);
+ break;
default:
_PCATCH(VFR_RETURN_FATAL_ERROR);
}
@@ -823,7 +832,7 @@
| LateCheckFlag
;
-vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :
<<
UINT32 Idx;
UINT32 LineNo;
@@ -856,9 +865,11 @@
);
VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);
}
- _PCATCH(VfrReturnCode, SN1);
- _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);
- _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
+ _PCATCH(VfrReturnCode, SN1);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);
+ _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);
+ }
>>
)
|
@@ -877,17 +888,21 @@
);
VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);
}
- _PCATCH(VfrReturnCode, SN2);
- _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {
- _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);
- _STRCAT(&VarStr, TName);
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
+ _PCATCH(VfrReturnCode, SN2);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {
+ _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);
+ _STRCAT(&VarStr, TName);
+ }
}
>>
(
"." <<
- _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
+ _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);
+ }
_STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");
>>
SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>
@@ -1082,6 +1097,33 @@
";"
;
+vfrFormMapDefinition :
+ <<
+ CIfrFormMap *FMapObj = NULL;
+ UINT32 FormMapMethodNumber = 0;
+ EFI_GUID Guid;
+ >>
+ F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>
+ FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText())), S1); >>
+ (
+ MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"
+ MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText()), &Guid); FormMapMethodNumber ++; >>
+ )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>
+ (
+ vfrStatementImage |
+ vfrStatementLocked |
+ vfrStatementRules |
+ vfrStatementDefault |
+ vfrStatementStat |
+ vfrStatementQuestions |
+ vfrStatementConditional |
+ vfrStatementLabel |
+ vfrStatementBanner
+ )*
+ E:EndForm << CRT_END_OP (E); >>
+ ";"
+ ;
+
vfrStatementRules :
<< CIfrRule RObj; >>
R:Rule << RObj.SetLineNo(R->getLine()); >>
@@ -1197,6 +1239,18 @@
"=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>
;
+vfrStatementRead :
+ << CIfrRead RObj; >>
+ R:Read << RObj.SetLineNo(R->getLine()); >>
+ vfrStatementExpression[0] ";"
+ ;
+
+vfrStatementWrite :
+ << CIfrWrite WObj; >>
+ W:Write << WObj.SetLineNo(W->getLine()); >>
+ vfrStatementExpression[0] ";"
+ ;
+
vfrStatementSubTitle :
<< CIfrSubtitle SObj; >>
L:Subtitle << SObj.SetLineNo(L->getLine()); >>
@@ -2049,6 +2103,8 @@
vfrStatementGrayOutIfQuest |
vfrStatementValue |
vfrStatementDefault |
+ vfrStatementRead |
+ vfrStatementWrite |
vfrStatementOptions
;
@@ -2482,6 +2538,7 @@
#token StringRef("stringref") "stringref"
#token PushThis("pushthis") "pushthis"
#token Security("security") "security"
+#token Get("get") "get"
#token True("TRUE") "TRUE"
#token False("FALSE") "FALSE"
#token One("ONE") "ONE"
@@ -2493,6 +2550,7 @@
#token AND("AND") "AND"
#token OR("OR") "OR"
#token NOT("NOT") "NOT"
+#token Set("set") "set"
#token BitWiseNot("~") "\~"
#token BoolVal("boolval") "boolval"
#token StringVal("stringval") "stringval"
@@ -2503,12 +2561,13 @@
#token Catenate("catenate") "catenate"
#token QuestionRefVal("questionrefval") "questionrefval"
#token StringRefVal("stringrefval") "stringrefval"
+#token Map("map") "map"
//
// Root expression extension function called by other function.
//
vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
- << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>
+ << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>
andTerm[$RootLevel, $ExpOpCount]
(
L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>
@@ -2520,11 +2579,15 @@
if ($ExpOpCount > 1 && $RootLevel == 0) {
if (_SET_SAVED_OPHDR_SCOPE()) {
CIfrEnd EObj;
- if (mCIfrOpHdrLineNo != 0) {
- EObj.SetLineNo (mCIfrOpHdrLineNo);
+ if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {
+ EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);
}
}
}
+
+ if ($RootLevel == 0) {
+ mCIfrOpHdrIndex --;
+ }
>>
;
@@ -2667,6 +2730,7 @@
| vfrExpressionConstant[$RootLevel, $ExpOpCount]
| vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]
| vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]
+ | vfrExpressionMap[$RootLevel, $ExpOpCount]
| (
L:NOT
atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>
@@ -2708,6 +2772,7 @@
| stringref1Exp[$RootLevel, $ExpOpCount]
| pushthisExp[$RootLevel, $ExpOpCount]
| securityExp[$RootLevel, $ExpOpCount]
+ | getExp[$RootLevel, $ExpOpCount]
;
dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
@@ -3020,6 +3085,84 @@
"\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>
;
+numericVarStoreType [UINT8 & VarType] :
+ "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>
+ | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>
+ | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>
+ | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>
+ ;
+
+getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ EFI_VARSTORE_INFO Info;
+ CHAR8 *VarIdStr = NULL;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ UINT32 Mask = 0;
+ EFI_QUESION_TYPE QType = QUESTION_NORMAL;
+ UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;
+ UINT32 VarSize = 0;
+ Info.mVarStoreId = 0;
+ >>
+ L:Get
+ "\("
+ vfrStorageVarId[Info, VarIdStr, FALSE]
+ {"\|" FLAGS "=" numericVarStoreType [VarType] }
+ "\)" <<
+ {
+ if (Info.mVarStoreId == 0) {
+ // support Date/Time question
+ mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);
+ if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
+ }
+ if (QType == QUESTION_DATE) {
+ Info.mVarType = EFI_IFR_TYPE_DATE;
+ } else if (QType == QUESTION_TIME) {
+ Info.mVarType = EFI_IFR_TYPE_TIME;
+ }
+ switch (Mask) {
+ case DATE_YEAR_BITMASK:
+ Info.mInfo.mVarOffset = 0;
+ break;
+ case DATE_DAY_BITMASK:
+ Info.mInfo.mVarOffset = 3;
+ break;
+ case TIME_HOUR_BITMASK:
+ Info.mInfo.mVarOffset = 0;
+ break;
+ case TIME_MINUTE_BITMASK:
+ Info.mInfo.mVarOffset = 1;
+ break;
+ case TIME_SECOND_BITMASK:
+ Info.mInfo.mVarOffset = 2;
+ break;
+ default:
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
+ break;
+ }
+ } else {
+ if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");
+ }
+ if (VarType != EFI_IFR_TYPE_UNDEFINED) {
+ Info.mVarType = VarType;
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
+ Info.mVarTotalSize = VarSize;
+ }
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
+ if (VarSize != Info.mVarTotalSize) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");
+ }
+ }
+ CIfrGet GObj(L->getLine());
+ _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine());
+ GObj.SetVarInfo (&Info);
+ delete VarIdStr;
+ $ExpOpCount++;
+ }
+ >>
+ ;
+
vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>
| L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>
@@ -3040,6 +3183,7 @@
| unintExp[$RootLevel, $ExpOpCount]
| toupperExp[$RootLevel, $ExpOpCount]
| tolwerExp[$RootLevel, $ExpOpCount]
+ | setExp[$RootLevel, $ExpOpCount]
;
lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
@@ -3100,6 +3244,78 @@
<< { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>
;
+setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ EFI_VARSTORE_INFO Info;
+ CHAR8 *VarIdStr = NULL;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ UINT32 Mask = 0;
+ EFI_QUESION_TYPE QType = QUESTION_NORMAL;
+ UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;
+ UINT32 VarSize = 0;
+ Info.mVarStoreId = 0;
+ >>
+ L:Set
+ "\("
+ vfrStorageVarId[Info, VarIdStr, FALSE]
+ {"\|" FLAG "=" numericVarStoreType [VarType] }
+ "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
+ "\)"
+ <<
+ {
+ if (Info.mVarStoreId == 0) {
+ // support Date/Time question
+ mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);
+ if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
+ }
+ if (QType == QUESTION_DATE) {
+ Info.mVarType = EFI_IFR_TYPE_DATE;
+ } else if (QType == QUESTION_TIME) {
+ Info.mVarType = EFI_IFR_TYPE_TIME;
+ }
+ switch (Mask) {
+ case DATE_YEAR_BITMASK:
+ Info.mInfo.mVarOffset = 0;
+ break;
+ case DATE_DAY_BITMASK:
+ Info.mInfo.mVarOffset = 3;
+ break;
+ case TIME_HOUR_BITMASK:
+ Info.mInfo.mVarOffset = 0;
+ break;
+ case TIME_MINUTE_BITMASK:
+ Info.mInfo.mVarOffset = 1;
+ break;
+ case TIME_SECOND_BITMASK:
+ Info.mInfo.mVarOffset = 2;
+ break;
+ default:
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
+ break;
+ }
+ } else {
+ if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");
+ }
+ if (VarType != EFI_IFR_TYPE_UNDEFINED) {
+ Info.mVarType = VarType;
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
+ Info.mVarTotalSize = VarSize;
+ }
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
+ if (VarSize != Info.mVarTotalSize) {
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");
+ }
+ }
+ CIfrSet TSObj(L->getLine());
+ TSObj.SetVarInfo (&Info);
+ delete VarIdStr;
+ $ExpOpCount++;
+ }
+ >>
+ ;
+
vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
conditionalExp[$RootLevel, $ExpOpCount]
| findExp[$RootLevel, $ExpOpCount]
@@ -3175,6 +3391,20 @@
"\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>
;
+vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ L:Map
+ "\("
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
+ ":" << { CIfrMap MObj(L->getLine()); } >>
+ (
+ vfrStatementExpression[0]
+ ","
+ vfrStatementExpression[0]
+ ";"
+ ) *
+ E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>
+ ;
+
spanFlags [UINT8 & Flags] :
N:Number << $Flags |= _STOU8(N->getText()); >>
| "LAST_NON_MATCH" << $Flags |= 0x00; >>
@@ -3199,8 +3429,9 @@
CVfrQuestionDB mCVfrQuestionDB;
CVfrRulesDB mCVfrRulesDB;
- CIfrOpHeader *mCIfrOpHdr;
- UINT32 mCIfrOpHdrLineNo;
+ CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];
+ UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];
+ UINT8 mCIfrOpHdrIndex;
VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);
VOID _CLEAR_SAVED_OPHDR (VOID);
BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);
@@ -3273,11 +3504,11 @@
)
{
if (Cond == TRUE) {
- if (mCIfrOpHdr != NULL) {
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {
return ;
}
- mCIfrOpHdr = new CIfrOpHeader(OpHdr);
- mCIfrOpHdrLineNo = LineNo;
+ mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);
+ mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;
}
}
@@ -3286,8 +3517,8 @@
VOID
)
{
- mCIfrOpHdr = NULL;
- mCIfrOpHdrLineNo = 0;
+ mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;
+ mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;
}
BOOLEAN
@@ -3295,10 +3526,11 @@
VOID
)
{
- if (mCIfrOpHdr != NULL) {
- mCIfrOpHdr->SetScope (1);
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {
+ mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);
return TRUE;
}
+
//
// IfrOpHdr is not set, FALSE is return.
//
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp 2010-02-24 09:18:03 UTC (rev 1896)
@@ -2260,6 +2260,7 @@
mQuestionId = EFI_QUESTION_ID_INVALID;
mBitMask = BitMask;
mNext = NULL;
+ mQtype = QUESTION_NORMAL;
if (Name == NULL) {
mName = new CHAR8[strlen ("$DEFAULT") + 1];
@@ -2429,6 +2430,9 @@
pNode[0]->mQuestionId = QuestionId;
pNode[1]->mQuestionId = QuestionId;
pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mQtype = QUESTION_DATE;
+ pNode[1]->mQtype = QUESTION_DATE;
+ pNode[2]->mQtype = QUESTION_DATE;
pNode[0]->mNext = pNode[1];
pNode[1]->mNext = pNode[2];
pNode[2]->mNext = mQuestionList;
@@ -2505,6 +2509,9 @@
pNode[0]->mQuestionId = QuestionId;
pNode[1]->mQuestionId = QuestionId;
pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mQtype = QUESTION_DATE;
+ pNode[1]->mQtype = QUESTION_DATE;
+ pNode[2]->mQtype = QUESTION_DATE;
pNode[0]->mNext = pNode[1];
pNode[1]->mNext = pNode[2];
pNode[2]->mNext = mQuestionList;
@@ -2571,6 +2578,9 @@
pNode[0]->mQuestionId = QuestionId;
pNode[1]->mQuestionId = QuestionId;
pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mQtype = QUESTION_TIME;
+ pNode[1]->mQtype = QUESTION_TIME;
+ pNode[2]->mQtype = QUESTION_TIME;
pNode[0]->mNext = pNode[1];
pNode[1]->mNext = pNode[2];
pNode[2]->mNext = mQuestionList;
@@ -2647,6 +2657,9 @@
pNode[0]->mQuestionId = QuestionId;
pNode[1]->mQuestionId = QuestionId;
pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mQtype = QUESTION_TIME;
+ pNode[1]->mQtype = QUESTION_TIME;
+ pNode[2]->mQtype = QUESTION_TIME;
pNode[0]->mNext = pNode[1];
pNode[1]->mNext = pNode[2];
pNode[2]->mNext = mQuestionList;
@@ -2720,13 +2733,17 @@
IN CHAR8 *Name,
IN CHAR8 *VarIdStr,
OUT EFI_QUESTION_ID &QuestionId,
- OUT UINT32 &BitMask
+ OUT UINT32 &BitMask,
+ OUT EFI_QUESION_TYPE *QType
)
{
SVfrQuestionNode *pNode;
QuestionId = EFI_QUESTION_ID_INVALID;
BitMask = 0x00000000;
+ if (QType != NULL) {
+ *QType = QUESTION_NORMAL;
+ }
if ((Name == NULL) && (VarIdStr == NULL)) {
return ;
@@ -2747,6 +2764,9 @@
QuestionId = pNode->mQuestionId;
BitMask = pNode->mBitMask;
+ if (QType != NULL) {
+ *QType = pNode->mQtype;
+ }
break;
}
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h 2010-02-24 09:00:54 UTC (rev 1895)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h 2010-02-24 09:18:03 UTC (rev 1896)
@@ -2,7 +2,7 @@
Vfr common library functions.
-Copyright (c) 2004 - 2009, Intel Corporation
+Copyright (c) 2004 - 2010, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -332,6 +332,7 @@
EFI_QUESTION_ID mQuestionId;
UINT32 mBitMask;
SVfrQuestionNode *mNext;
+ EFI_QUESION_TYPE mQtype;
SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
~SVfrQuestionNode ();
@@ -358,7 +359,7 @@
VOID RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
VOID RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
- VOID GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);
+ VOID GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &, OUT EFI_QUESION_TYPE *QType = NULL);
EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);
VOID PrintAllQuestion (IN VOID);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|