/*++\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
+Copyright (c) 2004 - 2010, 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
#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
\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
+ vfrStatementDisableIfFormSet |\r
+ vfrStatementSuppressIfFormSet\r
)*\r
;\r
\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
";"\r
;\r
\r
+vfrStatementSuppressIfFormSet :\r
+ << CIfrSuppressIf SIObj;>>\r
+ L:SuppressIf <<\r
+ if (mCompatibleMode) {\r
+ _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
+ }\r
+ SIObj.SetLineNo(L->getLine()); \r
+ >>\r
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+ vfrStatementExpression[0] ";"\r
+ vfrFormSetList\r
+ E: EndIf \r
+ ";" << CRT_END_OP (E); >>\r
+ ;\r
+\r
//*****************************************************************************\r
//\r
// the syntax of question header and statement header\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
";"\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
+ )*\r
+ E:EndForm << CRT_END_OP (E); >>\r
+ ";"\r
+ ;\r
+\r
vfrStatementRules :\r
<< CIfrRule RObj; >>\r
R:Rule << RObj.SetLineNo(R->getLine()); >>\r
vfrStatementDefault :\r
<<\r
BOOLEAN IsExp = FALSE;\r
- EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
+ EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
CIfrDefault DObj;\r
EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
CHAR8 *VarStoreName = NULL;\r
D:Default << DObj.SetLineNo(D->getLine()); >>\r
(\r
(\r
- vfrStatementValue "," << IsExp = TRUE; DObj.SetScope (1); >>\r
- | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","\r
- << DObj.SetType (_GET_CURRQEST_DATATYPE()); DObj.SetValue(Val); >>\r
+ vfrStatementValue "," << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
+ | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] "," << \r
+ if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+ //check default value is valid for Numeric Opcode\r
+ if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+ }\r
+ }\r
+ DObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+ DObj.SetValue(Val);\r
+ >>\r
)\r
{\r
DefaultStore "=" SN:StringIdentifier "," << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
vfrStatementValue :\r
<< CIfrValue VObj; >>\r
V:Value << VObj.SetLineNo(V->getLine()); >>\r
- "=" vfrStatementExpression[0]\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
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
;\r
\r
minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
- Minimum "=" Number ","\r
- Maximum "=" Number ","\r
+ Minimum "=" MinN:Number ","\r
+ Maximum "=" MaxN:Number ","\r
{ "step" "=" Number "," }\r
{\r
"default" "=" N:Number "," <<\r
switch (KeyValue) {\r
- case 0: D.Year = _STOU16(N->getText()); break;\r
- case 1: D.Month = _STOU8(N->getText()); break;\r
- case 2: D.Day = _STOU8(N->getText()); break;\r
+ case 0: \r
+ D.Year = _STOU16(N->getText());\r
+ if (D.Year < _STOU16 (MinN->getText()) || D.Year > _STOU16 (MaxN->getText())) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
+ }\r
+ break;\r
+ case 1: \r
+ D.Month = _STOU8(N->getText()); \r
+ if (D.Month < 1 || D.Month > 12) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
+ }\r
+ break;\r
+ case 2: \r
+ D.Day = _STOU8(N->getText()); \r
+ if (D.Day < 1 || D.Day > 31) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
+ }\r
+ break;\r
}\r
>>\r
}\r
>>\r
Minimum "=" I:Number ","\r
<<\r
- switch (_GET_CURRQEST_DATATYPE ()) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r
case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r
case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r
>>\r
Maximum "=" A:Number ","\r
<<\r
- switch (_GET_CURRQEST_DATATYPE ()) {\r
- case EFI_IFR_TYPE_NUM_SIZE_64 : MaxU8 = _STOU64(A->getText()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_32 : MaxU4 = _STOU32(A->getText()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_16 : MaxU2 = _STOU16(A->getText()); break;\r
- case EFI_IFR_TYPE_NUM_SIZE_8 : MaxU1 = _STOU8(A->getText()); break;\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 : \r
+ MaxU8 = _STOU64(A->getText()); \r
+ if (MaxU8 < MinU8) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 : \r
+ MaxU4 = _STOU32(A->getText()); \r
+ if (MaxU4 < MinU4) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 : \r
+ MaxU2 = _STOU16(A->getText()); \r
+ if (MaxU2 < MinU2) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 : \r
+ MaxU1 = _STOU8(A->getText()); \r
+ if (MaxU1 < MinU1) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+ }\r
+ break;\r
}\r
>>\r
{\r
STEP "=" S:Number ","\r
<<\r
- switch (_GET_CURRQEST_DATATYPE ()) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r
case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r
case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r
>>\r
}\r
<<\r
- switch (_GET_CURRQEST_DATATYPE ()) {\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
\r
vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
<<\r
- UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
UINT8 HFlags = 0;\r
+ EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
>>\r
numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
- << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+ <<\r
+ //check data type flag\r
+ VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+ if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ }\r
+ } else {\r
+ // update data type for name/value store\r
+ UINT32 DataTypeSize;\r
+ _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+ _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+ }\r
+ _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum);\r
+ >>\r
;\r
\r
numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
- | "DISPLAY_INT_DEC" << $LFlags |= 0x00; >>\r
- | "DISPLAY_UINT_DEC" << $LFlags |= 0x10; >>\r
- | "DISPLAY_UINT_HEX" << $LFlags |= 0x20; >>\r
+ | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; >>\r
+ | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; >>\r
+ | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; >>\r
+ | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; >>\r
+ | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; >>\r
+ | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; >>\r
+ | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; >>\r
| questionheaderFlagsField[HFlags]\r
;\r
\r
\r
vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
<<\r
- UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
UINT8 HFlags = 0;\r
+ EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
>>\r
numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
- << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+ <<\r
+ //check data type flag\r
+ VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+ if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
+ _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
+ }\r
+ } else {\r
+ // update data type for Name/Value store\r
+ UINT32 DataTypeSize;\r
+ _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
+ gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
+ _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
+ }\r
+ _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
+ >>\r
;\r
\r
vfrStatementStringType :\r
>>\r
L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[OLObj] ","\r
- << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>\r
+ << OLObj.SetMaxContainers ((UINT8) _GET_CURRQEST_ARRAY_SIZE()); >>\r
{\r
MaxContainers "=" M:Number "," << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
}\r
{\r
"default" "=" N:Number "," <<\r
switch (KeyValue) {\r
- case 0: T.Hour = _STOU8(N->getText()); break;\r
- case 1: T.Minute = _STOU8(N->getText()); break;\r
- case 2: T.Second = _STOU8(N->getText()); break;\r
+ case 0: \r
+ T.Hour = _STOU8(N->getText()); \r
+ if (T.Hour > 23) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
+ }\r
+ break;\r
+ case 1: \r
+ T.Minute = _STOU8(N->getText()); \r
+ if (T.Minute > 59) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
+ }\r
+ break;\r
+ case 2: \r
+ T.Second = _STOU8(N->getText());\r
+ if (T.Second > 59) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
+ }\r
+ break;\r
}\r
>>\r
}\r
vfrStatementGrayOutIfQuest |\r
vfrStatementValue |\r
vfrStatementDefault |\r
+ vfrStatementRead |\r
+ vfrStatementWrite |\r
vfrStatementOptions\r
;\r
\r
vfrStatementDisableIfStat :\r
<< \r
CIfrDisableIf DIObj; \r
- mConstantOnlyInExpression = TRUE;\r
>>\r
L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
- vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r
+ vfrStatementExpression[0] ";" \r
( vfrStatementStatList )*\r
E:EndIf << CRT_END_OP (E); >>\r
";"\r
vfrStatementDisableIfQuest :\r
<< \r
CIfrDisableIf DIObj; \r
- mConstantOnlyInExpression = TRUE;\r
>>\r
L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
- vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r
+ vfrStatementExpression[0] ";"\r
vfrStatementQuestionOptionList\r
E:EndIf << CRT_END_OP (E); >>\r
;\r
>>\r
L:Option << OOOObj.SetLineNo(L->getLine()); >>\r
Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText())); >>\r
- Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
+ Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," \r
+ << \r
+ if (gCurrentMinMaxData != NULL) {\r
+ //set min/max value for oneof opcode\r
+ UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
+ OOOObj.SetValue (Val); \r
+ >>\r
F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
<<\r
_PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
#token RuleRef("ruleref") "ruleref"\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
| rulerefExp[$RootLevel, $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
L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
;\r
\r
+securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+ <<\r
+ EFI_GUID Guid;\r
+ >>\r
+ L:Security\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
\r
UINT8 _GET_CURRQEST_DATATYPE ();\r
UINT32 _GET_CURRQEST_VARSIZE ();\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 _CRGUID (EFI_GUID *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *, CHAR8 *);\r
VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
VOID _DeclareStandardDefaultStorage (IN UINT32);\r
VOID _DeclareDefaultFrameworkVarStore (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
return mCurrQestVarInfo;\r
}\r
\r
+UINT32\r
+EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
+ VOID\r
+ )\r
+{\r
+ UINT8 Size = 1;\r
+\r
+ switch (mCurrQestVarInfo.mVarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ Size = 1;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ Size = 2;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ Size = 4;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ Size = 8;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return (mCurrQestVarInfo.mVarTotalSize / Size);\r
+}\r
+\r
UINT8\r
EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
VOID\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
*Dest = NewStr;\r
}\r
\r
-VOID\r
-EfiVfrParser::_CRGUID (\r
- IN EFI_GUID *Guid,\r
- IN CHAR8 *G1,\r
- IN CHAR8 *G2,\r
- IN CHAR8 *G3,\r
- IN CHAR8 *G4,\r
- IN CHAR8 *G5,\r
- IN CHAR8 *G6,\r
- IN CHAR8 *G7,\r
- IN CHAR8 *G8,\r
- IN CHAR8 *G9,\r
- IN CHAR8 *G10,\r
- IN CHAR8 *G11\r
- )\r
-{\r
- Guid->Data1 = _STOU32 (G1);\r
- Guid->Data2 = _STOU16 (G2);\r
- Guid->Data3 = _STOU16 (G3);\r
- Guid->Data4[0] = _STOU8(G4);\r
- Guid->Data4[1] = _STOU8(G5);\r
- Guid->Data4[2] = _STOU8(G6);\r
- Guid->Data4[3] = _STOU8(G7);\r
- Guid->Data4[4] = _STOU8(G8);\r
- Guid->Data4[5] = _STOU8(G9);\r
- Guid->Data4[6] = _STOU8(G10);\r
- Guid->Data4[7] = _STOU8(G11);\r
-}\r
-\r
//\r
// framework vfr to default declare varstore for each structure\r
//\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