FSObj->SetClassGuid(&DefaultClassGuid);\r
if (mOverrideClassGuid != NULL) {\r
FSObj->SetClassGuid(mOverrideClassGuid);\r
- } \r
+ }\r
break;\r
case 1:\r
if (mOverrideClassGuid != NULL) {\r
ClassGuidNum ++;\r
- } \r
+ }\r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
if (mOverrideClassGuid != NULL) {\r
FSObj->SetClassGuid(mOverrideClassGuid);\r
- } \r
+ }\r
break;\r
case 2:\r
if (mOverrideClassGuid != NULL) {\r
ClassGuidNum ++;\r
- } \r
+ }\r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
FSObj->SetClassGuid(&ClassGuid1);\r
FSObj->SetClassGuid(&ClassGuid2);\r
if (mOverrideClassGuid != NULL) {\r
FSObj->SetClassGuid(mOverrideClassGuid);\r
- } \r
+ }\r
break;\r
case 3:\r
FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
CIfrLabel LObj3;\r
LObj3.SetLineNo(E->getLine());\r
LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
- //\r
- // Declare undefined Question\r
- //\r
- if (gCFormPkg.HavePendingUnassigned()) {\r
- gCFormPkg.DeclarePendingQuestion (\r
- gCVfrVarDataTypeDB,\r
- mCVfrDataStorage,\r
- mCVfrQuestionDB,\r
- &mFormsetGuid,\r
- E->getLine()\r
- );\r
- }\r
}\r
+\r
+ //\r
+ // Declare undefined Question so that they can be used in expression.\r
+ //\r
+ if (gCFormPkg.HavePendingUnassigned()) {\r
+ gCFormPkg.DeclarePendingQuestion (\r
+ gCVfrVarDataTypeDB,\r
+ mCVfrDataStorage,\r
+ mCVfrQuestionDB,\r
+ &mFormsetGuid,\r
+ E->getLine()\r
+ );\r
+ }\r
+\r
//\r
// mCVfrQuestionDB.PrintAllQuestion();\r
//\r
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
UINT32 BitMask;\r
CIfrQuestionHeader *QHObj = NULL;\r
+ CIfrOpHeader *OHObj = NULL;\r
CIfrRef *R1Obj = NULL;\r
CIfrRef2 *R2Obj = NULL;\r
CIfrRef3 *R3Obj = NULL;\r
FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText()); >>\r
Question "="\r
(\r
- QN3:StringIdentifier "," << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>\r
+ QN3:StringIdentifier "," << \r
+ mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
+ if (QId == EFI_QUESTION_ID_INVALID) {\r
+ _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
+ }\r
+ >>\r
| QN4:Number "," << QId = _STOQID(QN4->getText()); >>\r
)\r
)\r
{\r
R5Obj = new CIfrRef5;\r
QHObj = R5Obj;\r
+ OHObj = R5Obj;\r
R5Obj->SetLineNo(G->getLine());\r
break;\r
}\r
{\r
R4Obj = new CIfrRef4;\r
QHObj = R4Obj;\r
+ OHObj = R4Obj;\r
R4Obj->SetLineNo(G->getLine());\r
R4Obj->SetDevicePath (DevPath);\r
R4Obj->SetFormSetId (FSId);\r
{\r
R3Obj = new CIfrRef3;\r
QHObj = R3Obj;\r
+ OHObj = R3Obj;\r
R3Obj->SetLineNo(G->getLine());\r
R3Obj->SetFormSetId (FSId);\r
R3Obj->SetFormId (FId);\r
{\r
R2Obj = new CIfrRef2;\r
QHObj = R2Obj;\r
+ OHObj = R2Obj;\r
R2Obj->SetLineNo(G->getLine());\r
R2Obj->SetFormId (FId);\r
- _PCATCH(R2Obj->SetQuestionId (QId), QN3);\r
+ R2Obj->SetQuestionId (QId);\r
break;\r
}\r
case 1:\r
{\r
R1Obj = new CIfrRef;\r
QHObj = R1Obj;\r
+ OHObj = R1Obj;\r
R1Obj->SetLineNo(G->getLine());\r
R1Obj->SetFormId (FId);\r
break;\r
}\r
>>\r
vfrQuestionHeader[*QHObj, QUESTION_REF]\r
- { "," vfrStatementStatTagList }\r
{ "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
{\r
"," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
}\r
+ {\r
+ E:"," \r
+ vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
+ }\r
";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} if (R5Obj != NULL) {delete R5Obj;}>>\r
;\r
\r
<<\r
CIfrNumeric NObj;\r
UINT32 DataTypeSize;\r
+ BOOLEAN IsSupported;\r
>>\r
L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[NObj] "," << // check data type\r
}\r
vfrSetMinMaxStep[NObj]\r
vfrStatementQuestionOptionList\r
- E:EndNumeric << CRT_END_OP (E); >>\r
+ E:EndNumeric << \r
+ IsSupported = FALSE;\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ IsSupported = TRUE;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ if (!IsSupported) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+ }\r
+ CRT_END_OP (E); \r
+ >>\r
";"\r
;\r
\r
<<\r
CIfrOneOf OObj;\r
UINT32 DataTypeSize;\r
+ BOOLEAN IsSupported;\r
>>\r
L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
vfrQuestionHeader[OObj] "," << //check data type\r
vfrSetMinMaxStep[OObj]\r
}\r
vfrStatementQuestionOptionList\r
- E:EndOneOf << CRT_END_OP (E); >>\r
+ E:EndOneOf << \r
+ IsSupported = FALSE;\r
+ switch (_GET_CURRQEST_DATATYPE()) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ IsSupported = TRUE;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ if (!IsSupported) {\r
+ _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
+ }\r
+ CRT_END_OP (E); \r
+ >>\r
";"\r
;\r
\r
| question2refExp[$RootLevel, $ExpOpCount]\r
| stringref2Exp[$RootLevel, $ExpOpCount]\r
| toboolExp[$RootLevel, $ExpOpCount]\r
+ | tostringExp[$RootLevel, $ExpOpCount]\r
| unintExp[$RootLevel, $ExpOpCount]\r
| toupperExp[$RootLevel, $ExpOpCount]\r
| tolwerExp[$RootLevel, $ExpOpCount]\r