]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Sync BaseTools Trunk (version r2387) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 081c67d715dd35930b79673fd66da355ab715a13..f27f05b68910a9430379082bcd65992b2e436298 100644 (file)
@@ -524,28 +524,28 @@ vfrFormSetDefinition :
                                                         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
@@ -1387,19 +1387,21 @@ vfrFormDefinition :
                                                         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
@@ -1644,6 +1646,7 @@ vfrStatementGoto :
      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
@@ -1680,7 +1683,12 @@ vfrStatementGoto :
       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
@@ -1698,6 +1706,7 @@ vfrStatementGoto :
                                                             {\r
                                                               R5Obj = new CIfrRef5;\r
                                                               QHObj = R5Obj;\r
+                                                              OHObj = R5Obj;\r
                                                               R5Obj->SetLineNo(G->getLine());\r
                                                               break;\r
                                                             }\r
@@ -1705,6 +1714,7 @@ vfrStatementGoto :
                                                             {\r
                                                               R4Obj = new CIfrRef4;\r
                                                               QHObj = R4Obj;\r
+                                                              OHObj = R4Obj;\r
                                                               R4Obj->SetLineNo(G->getLine());\r
                                                               R4Obj->SetDevicePath (DevPath);\r
                                                               R4Obj->SetFormSetId (FSId);\r
@@ -1716,6 +1726,7 @@ vfrStatementGoto :
                                                             {\r
                                                               R3Obj = new CIfrRef3;\r
                                                               QHObj = R3Obj;\r
+                                                              OHObj = R3Obj;\r
                                                               R3Obj->SetLineNo(G->getLine());\r
                                                               R3Obj->SetFormSetId (FSId);\r
                                                               R3Obj->SetFormId (FId);\r
@@ -1726,15 +1737,17 @@ vfrStatementGoto :
                                                             {\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
@@ -1743,11 +1756,14 @@ vfrStatementGoto :
                                                           }\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
@@ -2110,6 +2126,7 @@ vfrStatementNumeric :
   <<\r
      CIfrNumeric NObj;\r
      UINT32 DataTypeSize;\r
+     BOOLEAN IsSupported;\r
   >>\r
   L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[NObj] ","                          << // check data type\r
@@ -2125,7 +2142,23 @@ vfrStatementNumeric :
   }\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
@@ -2170,6 +2203,7 @@ vfrStatementOneOf :
   <<\r
      CIfrOneOf OObj;\r
      UINT32    DataTypeSize;\r
+     BOOLEAN   IsSupported;\r
   >>\r
   L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
   vfrQuestionHeader[OObj] ","                          << //check data type\r
@@ -2184,7 +2218,23 @@ vfrStatementOneOf :
     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
@@ -3579,6 +3629,7 @@ vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
   | 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