/*++\r
-Copyright (c) 2004 - 2009, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
#token EndList("endlist") "endlist"\r
#token EndForm("endform") "endform"\r
#token Form("form") "form"\r
+#token FormMap("formmap") "formmap"\r
+#token MapTitle("maptitle") "maptitle"\r
+#token MapGuid("mapguid") "mapguid"\r
#token Subtitle("subtitle") "subtitle"\r
#token Help("help") "help"\r
#token Text("text") "text"\r
#token Rule("rule") "rule"\r
#token EndRule("endrule") "endrule"\r
#token Value("value") "value"\r
+#token Read("read") "read"\r
+#token Write("write") "write"\r
#token ResetButton("resetbutton") "resetbutton"\r
#token EndResetButton("endresetbutton") "endresetbutton"\r
#token DefaultStore("defaultstore") "defaultstore"\r
#token Refresh("refresh") "refresh"\r
#token Interval("interval") "interval"\r
#token VarstoreDevice("varstoredevice") "varstoredevice"\r
+#token GuidOp("guidop") "guidop"\r
+#token EndGuidOp("endguidop") "endguidop"\r
+#token DataType("datatype") "datatype"\r
+#token Data("data") "data"\r
+\r
//\r
// Define the class and subclass tokens\r
//\r
\r
vfrProgram > [UINT8 Return] :\r
<<\r
- mParserStatus = 0;\r
+ mParserStatus = 0;\r
+ mCIfrOpHdrIndex = 0;\r
mConstantOnlyInExpression = FALSE;\r
>>\r
(\r
\r
dataStructField64 :\r
<< UINT32 ArrayNum = 0; >>\r
- "UINT64"\r
+ D:"UINT64"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructField32 :\r
<< UINT32 ArrayNum = 0; >>\r
- "UINT32"\r
+ D:"UINT32"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructField16 :\r
- << UINT32 ArrayNum = 0; >>\r
+ << \r
+ UINT32 ArrayNum = 0; \r
+ >>\r
("UINT16" | "CHAR16")\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
;\r
\r
dataStructField8 :\r
<< UINT32 ArrayNum = 0; >>\r
- "UINT8"\r
+ D:"UINT8"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructFieldBool :\r
<< UINT32 ArrayNum = 0; >>\r
- "BOOLEAN"\r
+ D:"BOOLEAN"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructFieldString :\r
<< UINT32 ArrayNum = 0; >>\r
- "EFI_STRING_ID"\r
+ D:"EFI_STRING_ID"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructFieldDate :\r
<< UINT32 ArrayNum = 0; >>\r
- "EFI_HII_DATE"\r
+ D:"EFI_HII_DATE"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructFieldTime :\r
<< UINT32 ArrayNum = 0; >>\r
- "EFI_HII_TIME"\r
+ D:"EFI_HII_TIME"\r
N:StringIdentifier\r
{\r
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r
}\r
- ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>\r
+ ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
;\r
\r
dataStructFieldUser :\r
<<\r
switch (ClassGuidNum) {\r
case 0:\r
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&DefaultClassGuid);\r
break;\r
case 1:\r
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
break;\r
case 2:\r
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
FSObj->SetClassGuid(&ClassGuid2);\r
break;\r
- default:\r
- FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + 2 * sizeof(EFI_GUID));\r
+ case 3:\r
+ FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
FSObj->SetClassGuid(&ClassGuid2);\r
FSObj->SetClassGuid(&ClassGuid3);\r
break;\r
+ default:\r
+ break;\r
}\r
\r
SET_LINE_INFO (*FSObj, L);\r
vfrFormSetList :\r
(\r
vfrFormDefinition |\r
+ vfrFormMapDefinition |\r
vfrStatementImage |\r
vfrStatementVarStoreLinear |\r
vfrStatementVarStoreEfi |\r
vfrStatementVarStoreNameValue |\r
vfrStatementDefaultStore |\r
vfrStatementDisableIfFormSet |\r
- vfrStatementSuppressIfFormSet\r
+ vfrStatementSuppressIfFormSet |\r
+ vfrStatementExtension\r
)*\r
;\r
\r
+vfrStatementExtension:\r
+ << \r
+ EFI_GUID Guid;\r
+ CIfrGuid *GuidObj = NULL;\r
+ CHAR8 *TypeName = NULL;\r
+ UINT32 TypeSize = 0;\r
+ UINT8 *DataBuff = NULL;\r
+ UINT32 Size = 0;\r
+ UINT8 Idx = 0;\r
+ UINT32 LineNum;\r
+ BOOLEAN IsStruct = FALSE;\r
+ UINT32 ArrayNum = 0;\r
+ >>\r
+ L:GuidOp\r
+ Uuid "=" guidDefinition[Guid]\r
+ {"," DataType "=" \r
+ (\r
+ U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText());>>}\r
+ << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+ | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText());>>}\r
+ << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+ | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText());>>}\r
+ << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+ | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText());>>}\r
+ << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+ | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText());>>}\r
+ << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
+ | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText());>>}\r
+ << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
+ | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText());>>}\r
+ << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
+ | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText());>>}\r
+ << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
+ | TN:StringIdentifier {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText());>>}\r
+ << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
+ )\r
+ <<\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
+ if (ArrayNum > 0) {\r
+ Size = TypeSize*ArrayNum;\r
+ } else {\r
+ Size = TypeSize;\r
+ }\r
+ if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
+ DataBuff = (UINT8 *)malloc(Size);\r
+ for (Idx = 0; Idx < Size; Idx++) {\r
+ DataBuff[Idx] = 0;\r
+ }\r
+ >>\r
+ vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
+ }\r
+ <<\r
+ {\r
+ GuidObj = new CIfrGuid(Size);\r
+ if (GuidObj != NULL) {\r
+ GuidObj->SetLineNo(L->getLine());\r
+ GuidObj->SetGuid (&Guid);\r
+ }\r
+ }\r
+ if (TypeName != NULL) {\r
+ GuidObj->SetData(DataBuff, Size);\r
+ }\r
+ >>\r
+ {","\r
+ (\r
+ vfrStatementExtension\r
+ )*\r
+ E:EndGuidOp << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
+ }\r
+ <<\r
+ if (GuidObj != NULL) delete GuidObj;\r
+ if (DataBuff != NULL) free(DataBuff);\r
+ >>\r
+ ";"\r
+;\r
+\r
+vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
+ <<\r
+ CHAR8 *TFName = NULL;\r
+ UINT32 ArrayIdx = 0;\r
+ UINT16 FieldOffset;\r
+ UINT8 FieldType;\r
+ UINT32 FieldSize;\r
+ UINT64 Data_U64 = 0;\r
+ UINT32 Data_U32 = 0;\r
+ UINT16 Data_U16 = 0;\r
+ UINT8 Data_U8 = 0;\r
+ BOOLEAN Data_BL = 0;\r
+ EFI_STRING_ID Data_SID = 0;\r
+ BOOLEAN IsArray = FALSE;\r
+ UINT8 *ByteOffset = NULL;\r
+ >>\r
+(\r
+ ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
+ <<\r
+ ArrayIdx = 0;\r
+ if (IsArray == TRUE) {\r
+ ArrayIdx = _STOU8(IDX1->getText());\r
+ if (ArrayIdx >= ArrayNum) return;\r
+ IsArray = FALSE;\r
+ }\r
+ ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
+ if (IsStruct == TRUE) {\r
+ _STRCAT(&TFName, TypeName);\r
+ }\r
+ >>\r
+ ("." FN:StringIdentifier\r
+ <<\r
+ if (IsStruct == TRUE) {\r
+ _STRCAT(&TFName, ".");\r
+ _STRCAT(&TFName, FN->getText());\r
+ }\r
+ >>\r
+ {\r
+ OpenBracket IDX2:Number CloseBracket\r
+ <<\r
+ if (IsStruct == TRUE) {\r
+ _STRCAT(&TFName, "[");\r
+ _STRCAT(&TFName, IDX2->getText());\r
+ _STRCAT(&TFName, "]");\r
+ }\r
+ >>\r
+ }\r
+ )*\r
+ "=" RD:Number\r
+ <<\r
+ if (IsStruct == FALSE) {\r
+ if (strcmp ("UINT64", TypeName) == 0) {\r
+ Data_U64 = _STOU64(RD->getText());\r
+ memcpy (ByteOffset, &Data_U64, TypeSize);\r
+ }else if (strcmp ("UINT32", TypeName) == 0) {\r
+ Data_U32 = _STOU32(RD->getText());\r
+ memcpy (ByteOffset, &Data_U32, TypeSize); \r
+ }else if (strcmp ("UINT16", TypeName) == 0) {\r
+ Data_U16 = _STOU16(RD->getText());\r
+ memcpy (ByteOffset, &Data_U16, TypeSize); \r
+ }else if (strcmp ("UINT8", TypeName) == 0) {\r
+ Data_U8 = _STOU8(RD->getText());\r
+ memcpy (ByteOffset, &Data_U8, TypeSize); \r
+ }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
+ Data_BL = _STOU8(RD->getText());\r
+ memcpy (ByteOffset, &Data_BL, TypeSize); \r
+ }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
+ Data_SID = _STOSID(RD->getText());\r
+ memcpy (ByteOffset, &Data_SID, TypeSize); \r
+ }\r
+ } else {\r
+ gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
+ switch (FieldType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ Data_U8 = _STOU8(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ Data_U16 = _STOU16(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ Data_U32 = _STOU32(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ Data_U64 = _STOU64(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_BOOLEAN:\r
+ Data_BL = _STOU8(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
+ break;\r
+ case EFI_IFR_TYPE_STRING:\r
+ Data_SID = _STOSID(RD->getText());\r
+ memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ if (TFName != NULL) { delete TFName; TFName = NULL; }\r
+ >>\r
+ )*\r
+)\r
+;\r
+\r
+\r
vfrStatementDefaultStore :\r
<< UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
D:DefaultStore N:StringIdentifier ","\r
V:Varstore << VSObj.SetLineNo(V->getLine()); >>\r
(\r
TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
- | U8:"UINT8" "," << TypeName = "UINT8"; LineNum = U8->getLine(); >>\r
- | U16:"UINT16" "," << TypeName = "UINT16"; LineNum = U16->getLine(); >>\r
- | U32:"UINT32" "," << TypeName = "UINT32"; LineNum = U32->getLine(); >>\r
- | U64:"UINT64" "," << TypeName = "UINT64"; LineNum = U64->getLine(); >>\r
- | D:"EFI_HII_DATE" "," << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>\r
- | T:"EFI_HII_TIME" "," << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>\r
+ | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
+ | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
+ | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
+ | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
+ | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
+ | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
+ | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
)\r
{ Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
if (mCompatibleMode) {\r
_PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r
VSObj.SetVarStoreId (VarStoreId);\r
_PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
- VSObj.SetSize (Size);\r
+ VSObj.SetSize ((UINT16) Size);\r
VSObj.SetName (SN->getText());\r
>>\r
";"\r
mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
break;\r
case QUESTION_DATE:\r
- mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
- break;\r
+ mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
+ break;\r
case QUESTION_TIME:\r
- mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
- break;\r
+ mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
+ break;\r
default:\r
_PCATCH(VFR_RETURN_FATAL_ERROR);\r
}\r
| LateCheckFlag\r
;\r
\r
-vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :\r
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :\r
<<\r
UINT32 Idx;\r
UINT32 LineNo;\r
);\r
VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
}\r
- _PCATCH(VfrReturnCode, SN1);\r
- _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
- _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+ _PCATCH(VfrReturnCode, SN1);\r
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r
+ _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+ }\r
>>\r
)\r
|\r
);\r
VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
}\r
- _PCATCH(VfrReturnCode, SN2);\r
- _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
- if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
- _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
- _STRCAT(&VarStr, TName);\r
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+ _PCATCH(VfrReturnCode, SN2);\r
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
+ _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
+ _STRCAT(&VarStr, TName);\r
+ }\r
}\r
>>\r
\r
(\r
"." <<\r
- _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+ if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
+ _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+ }\r
_STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
>>\r
SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
vfrStatementLabel |\r
vfrStatementBanner |\r
// Just for framework vfr compatibility\r
- vfrStatementInvalid\r
+ vfrStatementInvalid |\r
+ vfrStatementExtension\r
)*\r
E:EndForm <<\r
if (mCompatibleMode) {\r
";"\r
;\r
\r
+vfrFormMapDefinition :\r
+ << \r
+ CIfrFormMap *FMapObj = NULL;\r
+ UINT32 FormMapMethodNumber = 0;\r
+ EFI_GUID Guid;\r
+ >>\r
+ F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
+ FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText())), S1); >>\r
+ (\r
+ MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
+ MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText()), &Guid); FormMapMethodNumber ++; >>\r
+ )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
+ (\r
+ vfrStatementImage |\r
+ vfrStatementLocked |\r
+ vfrStatementRules |\r
+ vfrStatementDefault |\r
+ vfrStatementStat |\r
+ vfrStatementQuestions |\r
+ vfrStatementConditional |\r
+ vfrStatementLabel |\r
+ vfrStatementBanner |\r
+ vfrStatementExtension\r
+ )*\r
+ E:EndForm << CRT_END_OP (E); >>\r
+ ";"\r
+ ;\r
+\r
vfrStatementRules :\r
<< CIfrRule RObj; >>\r
R:Rule << RObj.SetLineNo(R->getLine()); >>\r
"=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
;\r
\r
+vfrStatementRead :\r
+ << CIfrRead RObj; >>\r
+ R:Read << RObj.SetLineNo(R->getLine()); >>\r
+ vfrStatementExpression[0] ";" \r
+ ;\r
+\r
+vfrStatementWrite :\r
+ << CIfrWrite WObj; >>\r
+ W:Write << WObj.SetLineNo(W->getLine()); >>\r
+ vfrStatementExpression[0] ";" \r
+ ;\r
+\r
vfrStatementSubTitle :\r
<< CIfrSubtitle SObj; >>\r
L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r
vfrStatementGoto :\r
<<\r
UINT8 RefType = 1;\r
- EFI_STRING_ID DevPath;\r
- EFI_GUID FSId;\r
+ EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
+ EFI_GUID FSId = {0,};\r
EFI_FORM_ID FId;\r
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
UINT32 BitMask;\r
vfrStatementString :\r
<<\r
CIfrString SObj;\r
+ UINT32 VarArraySize;\r
+ UINT8 StringMinSize;\r
+ UINT8 StringMaxSize;\r
>>\r
L:String << SObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[SObj] ","\r
{\r
Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
}\r
- MinSize "=" MIN:Number "," << SObj.SetMinSize (_STOU8(MIN->getText())); >>\r
- MaxSize "=" MAX:Number "," << SObj.SetMaxSize (_STOU8(MAX->getText())); >>\r
+ MinSize "=" MIN:Number "," << \r
+ VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+ StringMinSize = _STOU8(MIN->getText());\r
+ if (_STOU64(MIN->getText()) > StringMinSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
+ } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
+ }\r
+ SObj.SetMinSize (StringMinSize);\r
+ >>\r
+ MaxSize "=" MAX:Number "," << \r
+ StringMaxSize = _STOU8(MAX->getText());\r
+ if (_STOU64(MAX->getText()) > StringMaxSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
+ } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
+ } else if (StringMaxSize < StringMinSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
+ }\r
+ SObj.SetMaxSize (StringMaxSize);\r
+ >>\r
vfrStatementQuestionOptionList\r
E:EndString << CRT_END_OP (E); >>\r
";"\r
vfrStatementPassword :\r
<<\r
CIfrPassword PObj;\r
+ UINT32 VarArraySize;\r
+ UINT16 PasswordMinSize;\r
+ UINT16 PasswordMaxSize;\r
>>\r
L:Password << PObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[PObj] ","\r
{\r
Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
}\r
- MinSize "=" MIN:Number "," << PObj.SetMinSize (_STOU16(MIN->getText())); >>\r
- MaxSize "=" MAX:Number "," << PObj.SetMaxSize (_STOU16(MAX->getText())); >>\r
+ MinSize "=" MIN:Number "," << \r
+ VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+ PasswordMinSize = _STOU16(MIN->getText());\r
+ if (_STOU64(MIN->getText()) > PasswordMinSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
+ } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
+ }\r
+ PObj.SetMinSize (PasswordMinSize);\r
+ >>\r
+ MaxSize "=" MAX:Number "," << \r
+ PasswordMaxSize = _STOU16(MAX->getText());\r
+ if (_STOU64(MAX->getText()) > PasswordMaxSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
+ } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
+ } else if (PasswordMaxSize < PasswordMinSize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
+ }\r
+ PObj.SetMaxSize (PasswordMaxSize);\r
+ >>\r
{ Encoding "=" Number "," }\r
vfrStatementQuestionOptionList\r
E:EndPassword << CRT_END_OP (E); >>\r
vfrStatementOrderedList :\r
<<\r
CIfrOrderedList OLObj;\r
+ UINT32 VarArraySize;\r
>>\r
L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[OLObj] ","\r
- << OLObj.SetMaxContainers ((UINT8) _GET_CURRQEST_ARRAY_SIZE()); >>\r
+ << \r
+ VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
+ OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
+ >>\r
{\r
- MaxContainers "=" M:Number "," << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
+ MaxContainers "=" M:Number "," << \r
+ if (_STOU64(M->getText()) > _STOU8(M->getText())) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
+ } else if (VarArraySize != 0 && _STOU8(M->getText()) > VarArraySize) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
+ }\r
+ OLObj.SetMaxContainers (_STOU8(M->getText()));\r
+ >>\r
}\r
{ F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
vfrStatementQuestionOptionList\r
(\r
vfrQuestionHeader[TObj, QUESTION_TIME] ","\r
{ F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
- vfrStatementDefault\r
+ vfrStatementQuestionOptionList\r
)\r
|\r
(\r
vfrStatementNoSubmitIf |\r
vfrStatementDisableIfQuest |\r
vfrStatementRefresh |\r
- vfrStatementVarstoreDevice\r
+ vfrStatementVarstoreDevice |\r
+ vfrStatementExtension\r
;\r
\r
vfrStatementQuestionTagList :\r
vfrStatementGrayOutIfQuest |\r
vfrStatementValue |\r
vfrStatementDefault |\r
+ vfrStatementRead |\r
+ vfrStatementWrite |\r
vfrStatementOptions\r
;\r
\r
vfrStatementQuestions |\r
vfrStatementConditionalNew |\r
vfrStatementLabel |\r
+ vfrStatementExtension |\r
// Just for framework vfr compatibility\r
vfrStatementInvalid\r
;\r
#token StringRef("stringref") "stringref"\r
#token PushThis("pushthis") "pushthis"\r
#token Security("security") "security"\r
+#token Get("get") "get"\r
#token True("TRUE") "TRUE"\r
#token False("FALSE") "FALSE"\r
#token One("ONE") "ONE"\r
#token AND("AND") "AND"\r
#token OR("OR") "OR"\r
#token NOT("NOT") "NOT"\r
+#token Set("set") "set"\r
#token BitWiseNot("~") "\~"\r
#token BoolVal("boolval") "boolval"\r
#token StringVal("stringval") "stringval"\r
#token Catenate("catenate") "catenate"\r
#token QuestionRefVal("questionrefval") "questionrefval"\r
#token StringRefVal("stringrefval") "stringrefval"\r
+#token Map("map") "map"\r
\r
//\r
// Root expression extension function called by other function.\r
//\r
vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
- << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>\r
+ << 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 ();} >>\r
andTerm[$RootLevel, $ExpOpCount]\r
(\r
L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
if ($ExpOpCount > 1 && $RootLevel == 0) {\r
if (_SET_SAVED_OPHDR_SCOPE()) {\r
CIfrEnd EObj;\r
- if (mCIfrOpHdrLineNo != 0) {\r
- EObj.SetLineNo (mCIfrOpHdrLineNo);\r
+ if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
+ EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
}\r
}\r
}\r
+ \r
+ if ($RootLevel == 0) {\r
+ mCIfrOpHdrIndex --;\r
+ }\r
>>\r
;\r
\r
| vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
| vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
| vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
+ | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
| (\r
L:NOT\r
atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
| stringref1Exp[$RootLevel, $ExpOpCount]\r
| pushthisExp[$RootLevel, $ExpOpCount]\r
| securityExp[$RootLevel, $ExpOpCount]\r
+ | getExp[$RootLevel, $ExpOpCount]\r
;\r
\r
dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
<<\r
UINT8 Type = 0x1;\r
- EFI_STRING_ID DevPath;\r
- EFI_GUID Guid;\r
+ EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
+ EFI_GUID Guid = {0,};\r
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
UINT32 BitMask;\r
CHAR8 *QName = NULL;\r
// stringref (STR_FORM_SET_TITLE)\r
//\r
stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+ <<\r
+ EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
+ >>\r
L:StringRef\r
- "\(" S:Number "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>\r
+ "\("\r
+ ( \r
+ "STRING_TOKEN"\r
+ "\(" \r
+ S:Number << RefStringId = _STOSID(S->getText()); >>\r
+ "\)"\r
+ | I:Number << RefStringId = _STOSID(I->getText()); >>\r
+ )\r
+ "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
;\r
\r
pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
"\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
;\r
\r
+numericVarStoreType [UINT8 & VarType] :\r
+ "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
+ | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
+ | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
+ | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
+ ;\r
+\r
+getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+ <<\r
+ EFI_VARSTORE_INFO Info;\r
+ CHAR8 *VarIdStr = NULL;\r
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
+ UINT32 Mask = 0;\r
+ EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
+ UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
+ UINT32 VarSize = 0;\r
+ Info.mVarStoreId = 0;\r
+ >>\r
+ L:Get\r
+ "\(" \r
+ vfrStorageVarId[Info, VarIdStr, FALSE]\r
+ {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
+ "\)" << \r
+ {\r
+ if (Info.mVarStoreId == 0) {\r
+ // support Date/Time question\r
+ mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+ if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+ }\r
+ if (QType == QUESTION_DATE) {\r
+ Info.mVarType = EFI_IFR_TYPE_DATE;\r
+ } else if (QType == QUESTION_TIME) {\r
+ Info.mVarType = EFI_IFR_TYPE_TIME;\r
+ }\r
+ switch (Mask) {\r
+ case DATE_YEAR_BITMASK:\r
+ Info.mInfo.mVarOffset = 0;\r
+ break;\r
+ case DATE_DAY_BITMASK:\r
+ Info.mInfo.mVarOffset = 3;\r
+ break;\r
+ case TIME_HOUR_BITMASK:\r
+ Info.mInfo.mVarOffset = 0;\r
+ break;\r
+ case TIME_MINUTE_BITMASK:\r
+ Info.mInfo.mVarOffset = 1;\r
+ break;\r
+ case TIME_SECOND_BITMASK:\r
+ Info.mInfo.mVarOffset = 2;\r
+ break;\r
+ default:\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+ break;\r
+ }\r
+ } else {\r
+ if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+ }\r
+ if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+ Info.mVarType = VarType;\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+ Info.mVarTotalSize = VarSize;\r
+ }\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+ if (VarSize != Info.mVarTotalSize) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+ }\r
+ }\r
+ CIfrGet GObj(L->getLine()); \r
+ _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
+ GObj.SetVarInfo (&Info); \r
+ delete VarIdStr; \r
+ $ExpOpCount++;\r
+ }\r
+ >>\r
+ ;\r
+\r
vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
| L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
| unintExp[$RootLevel, $ExpOpCount]\r
| toupperExp[$RootLevel, $ExpOpCount]\r
| tolwerExp[$RootLevel, $ExpOpCount]\r
+ | setExp[$RootLevel, $ExpOpCount]\r
;\r
\r
lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
<< { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
;\r
\r
+setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+ <<\r
+ EFI_VARSTORE_INFO Info;\r
+ CHAR8 *VarIdStr = NULL;\r
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
+ UINT32 Mask = 0;\r
+ EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
+ UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
+ UINT32 VarSize = 0;\r
+ Info.mVarStoreId = 0;\r
+ >>\r
+ L:Set\r
+ "\("\r
+ vfrStorageVarId[Info, VarIdStr, FALSE]\r
+ {"\|" FLAG "=" numericVarStoreType [VarType] }\r
+ "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
+ "\)"\r
+ << \r
+ {\r
+ if (Info.mVarStoreId == 0) {\r
+ // support Date/Time question\r
+ mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
+ if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+ }\r
+ if (QType == QUESTION_DATE) {\r
+ Info.mVarType = EFI_IFR_TYPE_DATE;\r
+ } else if (QType == QUESTION_TIME) {\r
+ Info.mVarType = EFI_IFR_TYPE_TIME;\r
+ }\r
+ switch (Mask) {\r
+ case DATE_YEAR_BITMASK:\r
+ Info.mInfo.mVarOffset = 0;\r
+ break;\r
+ case DATE_DAY_BITMASK:\r
+ Info.mInfo.mVarOffset = 3;\r
+ break;\r
+ case TIME_HOUR_BITMASK:\r
+ Info.mInfo.mVarOffset = 0;\r
+ break;\r
+ case TIME_MINUTE_BITMASK:\r
+ Info.mInfo.mVarOffset = 1;\r
+ break;\r
+ case TIME_SECOND_BITMASK:\r
+ Info.mInfo.mVarOffset = 2;\r
+ break;\r
+ default:\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
+ break;\r
+ }\r
+ } else {\r
+ if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
+ }\r
+ if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
+ Info.mVarType = VarType;\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+ Info.mVarTotalSize = VarSize;\r
+ }\r
+ _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
+ if (VarSize != Info.mVarTotalSize) {\r
+ _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
+ }\r
+ }\r
+ CIfrSet TSObj(L->getLine()); \r
+ TSObj.SetVarInfo (&Info); \r
+ delete VarIdStr; \r
+ $ExpOpCount++;\r
+ }\r
+ >>\r
+ ;\r
+\r
vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
conditionalExp[$RootLevel, $ExpOpCount]\r
| findExp[$RootLevel, $ExpOpCount]\r
"\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
;\r
\r
+vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+ L:Map \r
+ "\(" \r
+ vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
+ ":" << { CIfrMap MObj(L->getLine()); } >>\r
+ (\r
+ vfrStatementExpression[0]\r
+ ","\r
+ vfrStatementExpression[0]\r
+ ";"\r
+ ) *\r
+ E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
+ ;\r
+\r
spanFlags [UINT8 & Flags] :\r
N:Number << $Flags |= _STOU8(N->getText()); >>\r
| "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
CVfrQuestionDB mCVfrQuestionDB;\r
CVfrRulesDB mCVfrRulesDB;\r
\r
- CIfrOpHeader *mCIfrOpHdr;\r
- UINT32 mCIfrOpHdrLineNo;\r
+ CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
+ UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
+ UINT8 mCIfrOpHdrIndex;\r
VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
VOID _CLEAR_SAVED_OPHDR (VOID);\r
BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
\r
public:\r
- VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CHAR8 *);\r
+ VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
- VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CHAR8 *);\r
+ VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
\r
VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
\r
EFI_FORM_ID _STOFID (IN CHAR8 *);\r
EFI_QUESTION_ID _STOQID (IN CHAR8 *);\r
\r
- VOID _STRCAT (IN OUT CHAR8 **, IN CHAR8 *);\r
+ VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
\r
VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
VOID _DeclareStandardDefaultStorage (IN UINT32);\r
)\r
{\r
if (Cond == TRUE) {\r
- if (mCIfrOpHdr != NULL) {\r
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
return ;\r
}\r
- mCIfrOpHdr = new CIfrOpHeader(OpHdr);\r
- mCIfrOpHdrLineNo = LineNo;\r
+ mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
+ mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
}\r
}\r
\r
VOID\r
)\r
{\r
- mCIfrOpHdr = NULL;\r
- mCIfrOpHdrLineNo = 0;\r
+ mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
+ mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
}\r
\r
BOOLEAN\r
VOID\r
)\r
{\r
- if (mCIfrOpHdr != NULL) {\r
- mCIfrOpHdr->SetScope (1);\r
+ if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+ mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
return TRUE;\r
}\r
+\r
//\r
// IfrOpHdr is not set, FALSE is return.\r
//\r
IN INTN ReturnCode,\r
IN INTN ExpectCode,\r
IN ANTLRTokenPtr Tok,\r
- IN CHAR8 *ErrorMsg\r
+ IN CONST CHAR8 *ErrorMsg\r
)\r
{\r
if (ReturnCode != ExpectCode) {\r
IN EFI_VFR_RETURN_CODE ReturnCode\r
)\r
{\r
- mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
}\r
\r
VOID\r
IN ANTLRTokenPtr Tok\r
)\r
{\r
- mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
}\r
\r
VOID\r
IN UINT32 LineNum\r
)\r
{\r
- mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
}\r
\r
VOID\r
EfiVfrParser::_PCATCH (\r
IN EFI_VFR_RETURN_CODE ReturnCode,\r
IN UINT32 LineNum,\r
- IN CHAR8 *ErrorMsg\r
+ IN CONST CHAR8 *ErrorMsg\r
)\r
{\r
- mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum, ErrorMsg);\r
+ mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
}\r
\r
VOID\r
VOID\r
EfiVfrParser::_STRCAT (\r
IN OUT CHAR8 **Dest,\r
- IN CHAR8 *Src\r
+ IN CONST CHAR8 *Src\r
)\r
{\r
CHAR8 *NewStr;\r
SVfrVarStorageNode *pNode;\r
UINT32 TypeSize;\r
BOOLEAN FirstNode;\r
+ CONST CHAR8 VarName[] = "Setup";\r
\r
FirstNode = TRUE;\r
pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
CIfrVarStore VSObj;\r
VSObj.SetLineNo (LineNo);\r
VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
- VSObj.SetSize (TypeSize);\r
+ VSObj.SetSize ((UINT16) TypeSize);\r
//VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
- VSObj.SetName ("Setup");\r
+ VSObj.SetName ((CHAR8 *) VarName);\r
VSObj.SetGuid (&mFormsetGuid);\r
#ifdef VFREXP_DEBUG\r
printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
CIfrVarStore VSObj;\r
VSObj.SetLineNo (LineNo);\r
VSObj.SetVarStoreId (pNode->mVarStoreId);\r
- VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r
+ VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
if (FirstNode) {\r
- VSObj.SetName ("Setup");\r
+ VSObj.SetName ((CHAR8 *) VarName);\r
FirstNode = FALSE;\r
} else {\r
VSObj.SetName (pNode->mVarStoreName);\r
UINT32 Index;\r
CHAR8 **TypeNameList;\r
UINT32 ListSize;\r
+ CONST CHAR8 DateName[] = "Date";\r
+ CONST CHAR8 TimeName[] = "Time";\r
+ CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
+ CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
\r
gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
\r
mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
VSObj.SetVarStoreId (VarStoreId);\r
gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
- VSObj.SetSize (Size);\r
+ VSObj.SetSize ((UINT16) Size);\r
VSObj.SetName (TypeNameList[Index]);\r
VSObj.SetGuid (&mFormsetGuid);\r
}\r
// not required to declare Date and Time VarStore,\r
// because code to support old format Data and Time\r
//\r
- if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {\r
+ if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
UINT32 Size;\r
EFI_VARSTORE_ID VarStoreId;\r
CIfrVarStore VSObj;\r
\r
VSObj.SetLineNo (LineNo);\r
mCVfrDataStorage.DeclareBufferVarStore (\r
- "Date",\r
+ (CHAR8 *) DateName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
- "EFI_HII_DATE",\r
+ (CHAR8 *) DateType,\r
EFI_VARSTORE_ID_INVALID\r
);\r
- mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);\r
+ mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId);\r
VSObj.SetVarStoreId (VarStoreId);\r
- gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);\r
- VSObj.SetSize (Size);\r
- VSObj.SetName ("Date");\r
+ gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
+ VSObj.SetSize ((UINT16) Size);\r
+ VSObj.SetName ((CHAR8 *) DateName);\r
VSObj.SetGuid (&mFormsetGuid);\r
}\r
\r
- if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {\r
+ if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
UINT32 Size;\r
EFI_VARSTORE_ID VarStoreId;\r
CIfrVarStore VSObj;\r
\r
VSObj.SetLineNo (LineNo);\r
mCVfrDataStorage.DeclareBufferVarStore (\r
- "Time",\r
+ (CHAR8 *) TimeName,\r
&mFormsetGuid,\r
&gCVfrVarDataTypeDB,\r
- "EFI_HII_TIME",\r
+ (CHAR8 *) TimeType,\r
EFI_VARSTORE_ID_INVALID\r
);\r
- mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);\r
+ mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId);\r
VSObj.SetVarStoreId (VarStoreId);\r
- gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);\r
- VSObj.SetSize (Size);\r
- VSObj.SetName ("Time");\r
+ gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
+ VSObj.SetSize ((UINT16) Size);\r
+ VSObj.SetName ((CHAR8 *) TimeName);\r
VSObj.SetGuid (&mFormsetGuid);\r
}\r
}\r
//\r
CIfrDefaultStore DSObj;\r
\r
- mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+ mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
DSObj.SetLineNo (LineNo);\r
DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
//\r
CIfrDefaultStore DSObjMF;\r
\r
- mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
+ mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
DSObjMF.SetLineNo (LineNo);\r
DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r