| 1 | /*++\r |
| 2 | Copyright (c) 2004 - 2008, Intel Corporation\r |
| 3 | All rights reserved. This program and the accompanying materials\r |
| 4 | are licensed and made available under the terms and conditions of the BSD License\r |
| 5 | which accompanies this distribution. The full text of the license may be found at\r |
| 6 | http://opensource.org/licenses/bsd-license.php\r |
| 7 | \r |
| 8 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r |
| 9 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r |
| 10 | \r |
| 11 | Module Name:\r |
| 12 | VfrSyntax.g\r |
| 13 | \r |
| 14 | Abstract:\r |
| 15 | \r |
| 16 | --*/\r |
| 17 | \r |
| 18 | #header<<\r |
| 19 | \r |
| 20 | #include "EfiVfr.h"\r |
| 21 | #include "VfrFormPkg.h"\r |
| 22 | #include "VfrError.h"\r |
| 23 | #include "VfrUtilityLib.h"\r |
| 24 | #include "AToken.h"\r |
| 25 | #include "ATokPtr.h"\r |
| 26 | >>\r |
| 27 | \r |
| 28 | <<\r |
| 29 | #include "stdio.h"\r |
| 30 | #include "PBlackBox.h"\r |
| 31 | #include "DLexerBase.h"\r |
| 32 | #include "VfrLexer.h"\r |
| 33 | #include "AToken.h"\r |
| 34 | \r |
| 35 | #define GET_LINENO(Obj) ((Obj)->getLine())\r |
| 36 | #define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)\r |
| 37 | #define CRT_END_OP(Obj) {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r |
| 38 | \r |
| 39 | typedef ANTLRCommonToken ANTLRToken;\r |
| 40 | \r |
| 41 | class CVfrDLGLexer : public VfrLexer\r |
| 42 | {\r |
| 43 | public:\r |
| 44 | CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};\r |
| 45 | INT32 errstd (char *Text)\r |
| 46 | {\r |
| 47 | printf ("unrecognized input '%s'\n", Text);\r |
| 48 | }\r |
| 49 | };\r |
| 50 | \r |
| 51 | UINT8\r |
| 52 | VfrParserStart (\r |
| 53 | IN FILE *File,\r |
| 54 | IN BOOLEAN CompatibleMode\r |
| 55 | )\r |
| 56 | {\r |
| 57 | ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r |
| 58 | VfrParser.parser()->SetCompatibleMode (CompatibleMode);\r |
| 59 | return VfrParser.parser()->vfrProgram();\r |
| 60 | }\r |
| 61 | >>\r |
| 62 | \r |
| 63 | //\r |
| 64 | // Define a lexical class for parsing quoted strings. Basically\r |
| 65 | // starts with a double quote, and ends with a double quote that\r |
| 66 | // is not preceeded with a backslash.\r |
| 67 | //\r |
| 68 | #lexclass QUOTED_STRING\r |
| 69 | #token TheString "~[\"]*\"" << mode (START); >>\r |
| 70 | \r |
| 71 | //\r |
| 72 | // Define a lexclass for skipping over C++ style comments\r |
| 73 | //\r |
| 74 | #lexclass CPP_COMMENT\r |
| 75 | #token "~[\n]*" << skip (); >>\r |
| 76 | #token "\n" << skip (); mode (START); newline (); >>\r |
| 77 | \r |
| 78 | //\r |
| 79 | // Standard lexclass is START\r |
| 80 | //\r |
| 81 | #lexclass START\r |
| 82 | \r |
| 83 | //\r |
| 84 | // Find start of C++ style comments\r |
| 85 | //\r |
| 86 | #token "//" << skip (); mode (CPP_COMMENT); >>\r |
| 87 | \r |
| 88 | //\r |
| 89 | // Skip whitespace\r |
| 90 | //\r |
| 91 | #token "[\ \t]" << skip (); >>\r |
| 92 | \r |
| 93 | //\r |
| 94 | // Skip over newlines, but count them\r |
| 95 | //\r |
| 96 | #token "\n" << skip (); newline (); >>\r |
| 97 | \r |
| 98 | //\r |
| 99 | // Skip over 'extern' in any included .H file\r |
| 100 | //\r |
| 101 | #token "extern" << skip (); mode (CPP_COMMENT); >>\r |
| 102 | \r |
| 103 | //\r |
| 104 | // Tokens for the different keywords. Syntax is:\r |
| 105 | // TokenName("ErrorMessageText") "TokenString"\r |
| 106 | // where:\r |
| 107 | // TokenName is the token name (must be capitalized) that is used in the rules\r |
| 108 | // ErrorMessageText is the string the compiler emits when it detects a syntax error\r |
| 109 | // TokenString is the actual matching string used in the user script\r |
| 110 | //\r |
| 111 | #token FormPkgType("formpkgtype") "formpkgtype"\r |
| 112 | #token OpenBrace("{") "\{"\r |
| 113 | #token CloseBrace("}") "\}"\r |
| 114 | #token OpenParen("(") "\("\r |
| 115 | #token CloseParen(")") "\)"\r |
| 116 | #token OpenBracket("[") "\["\r |
| 117 | #token CloseBracket("]") "\]"\r |
| 118 | \r |
| 119 | #token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >>\r |
| 120 | #token DevicePath("devicepath") "devicepath"\r |
| 121 | #token FormSet("formset") "formset"\r |
| 122 | #token FormSetId("formsetid") "formsetid"\r |
| 123 | #token EndFormSet("endformset") "endformset"\r |
| 124 | #token Title("title") "title"\r |
| 125 | #token FormId("formid") "formid"\r |
| 126 | #token OneOf("oneof") "oneof"\r |
| 127 | #token EndOneOf("endoneof") "endoneof"\r |
| 128 | #token Prompt("prompt") "prompt"\r |
| 129 | #token OrderedList("orderedlist") "orderedlist"\r |
| 130 | #token MaxContainers("maxcontainers") "maxcontainers"\r |
| 131 | #token EndList("endlist") "endlist"\r |
| 132 | #token EndForm("endform") "endform"\r |
| 133 | #token Form("form") "form"\r |
| 134 | #token Subtitle("subtitle") "subtitle"\r |
| 135 | #token Help("help") "help"\r |
| 136 | #token Text("text") "text"\r |
| 137 | #token Option("option") "option"\r |
| 138 | #token FLAGS("flags") "flags"\r |
| 139 | #token Date("date") "date"\r |
| 140 | #token EndDate("enddate") "enddate"\r |
| 141 | #token Year("year") "year"\r |
| 142 | #token Month("month") "month"\r |
| 143 | #token Day("day") "day"\r |
| 144 | #token Time("time") "time"\r |
| 145 | #token EndTime("endtime") "endtime"\r |
| 146 | #token Hour("hour") "hour"\r |
| 147 | #token Minute("minute") "minute"\r |
| 148 | #token Second("second") "second"\r |
| 149 | #token GrayOutIf("grayoutif") "grayoutif"\r |
| 150 | #token Label("label") "label"\r |
| 151 | #token Timeout("timeout") "timeout"\r |
| 152 | #token Inventory("inventory") "inventory"\r |
| 153 | #token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"\r |
| 154 | #token Struct("struct") "struct"\r |
| 155 | #token Boolean("BOOLEAN") "BOOLEAN"\r |
| 156 | #token Uint64("UINT64") "UINT64"\r |
| 157 | #token Uint32("UINT32") "UINT32"\r |
| 158 | #token Uint16("UINT16") "UINT16"\r |
| 159 | #token Char16("CHAR16") "CHAR16"\r |
| 160 | #token Uint8("UINT8") "UINT8"\r |
| 161 | #token Uuid("guid") "guid"\r |
| 162 | #token CheckBox("checkbox") "checkbox"\r |
| 163 | #token EndCheckBox("endcheckbox") "endcheckbox"\r |
| 164 | #token Numeric("numeric") "numeric"\r |
| 165 | #token EndNumeric("endnumeric") "endnumeric"\r |
| 166 | #token Minimum("minimum") "minimum"\r |
| 167 | #token Maximum("maximum") "maximum"\r |
| 168 | #token STEP("step") "step"\r |
| 169 | #token Default("default") "default"\r |
| 170 | #token Password("password") "password"\r |
| 171 | #token EndPassword("endpassword") "endpassword"\r |
| 172 | #token String("string") "string"\r |
| 173 | #token EndString("endstring") "endstring"\r |
| 174 | #token MinSize("minsize") "minsize"\r |
| 175 | #token MaxSize("maxsize") "maxsize"\r |
| 176 | #token Encoding("encoding") "encoding"\r |
| 177 | #token SuppressIf("suppressif") "suppressif"\r |
| 178 | #token DisableIf("disableif") "disableif"\r |
| 179 | #token Hidden("hidden") "hidden"\r |
| 180 | #token Goto("goto") "goto"\r |
| 181 | #token FormSetGuid("formsetguid") "formsetguid"\r |
| 182 | #token InconsistentIf("inconsistentif") "inconsistentif"\r |
| 183 | #token NoSubmitIf("nosubmitif") "nosubmitif"\r |
| 184 | #token EndIf("endif") "endif"\r |
| 185 | #token Key("key") "key"\r |
| 186 | #token DefaultFlag("DEFAULT") "DEFAULT"\r |
| 187 | #token ManufacturingFlag("MANUFACTURING") "MANUFACTURING"\r |
| 188 | #token InteractiveFlag("INTERACTIVE") "INTERACTIVE"\r |
| 189 | #token NVAccessFlag("NV_ACCESS") "NV_ACCESS"\r |
| 190 | #token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"\r |
| 191 | #token LateCheckFlag("LATE_CHECK") "LATE_CHECK"\r |
| 192 | #token ReadOnlyFlag("READ_ONLY") "READ_ONLY"\r |
| 193 | #token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"\r |
| 194 | #token Class("class") "class"\r |
| 195 | #token Subclass("subclass") "subclass"\r |
| 196 | #token ClassGuid("classguid") "classguid"\r |
| 197 | #token TypeDef("typedef") "typedef"\r |
| 198 | #token Restore("restore") "restore"\r |
| 199 | #token Save("save") "save"\r |
| 200 | #token Defaults("defaults") "defaults"\r |
| 201 | #token Banner("banner") "banner"\r |
| 202 | #token Align("align") "align"\r |
| 203 | #token Left("left") "left"\r |
| 204 | #token Right("right") "right"\r |
| 205 | #token Center("center") "center"\r |
| 206 | #token Line("line") "line"\r |
| 207 | #token Name("name") "name"\r |
| 208 | \r |
| 209 | #token VarId("varid") "varid"\r |
| 210 | #token Question("question") "question"\r |
| 211 | #token QuestionId("questionid") "questionid"\r |
| 212 | #token Image("image") "image"\r |
| 213 | #token Locked("locked") "locked"\r |
| 214 | #token Rule("rule") "rule"\r |
| 215 | #token EndRule("endrule") "endrule"\r |
| 216 | #token Value("value") "value"\r |
| 217 | #token ResetButton("resetbutton") "resetbutton"\r |
| 218 | #token EndResetButton("endresetbutton") "endresetbutton"\r |
| 219 | #token DefaultStore("defaultstore") "defaultstore"\r |
| 220 | #token Attribute("attribute") "attribute"\r |
| 221 | #token Varstore("varstore") "varstore"\r |
| 222 | #token Efivarstore("efivarstore") "efivarstore"\r |
| 223 | #token VarSize("varsize") "varsize"\r |
| 224 | #token NameValueVarStore("namevaluevarstore") "namevaluevarstore"\r |
| 225 | #token Action("action") "action"\r |
| 226 | #token Config("config") "config"\r |
| 227 | #token EndAction("endaction") "endaction"\r |
| 228 | #token Refresh("refresh") "refresh"\r |
| 229 | #token Interval("interval") "interval"\r |
| 230 | #token VarstoreDevice("varstoredevice") "varstoredevice"\r |
| 231 | //\r |
| 232 | // Define the class and subclass tokens\r |
| 233 | //\r |
| 234 | #token ClassNonDevice("NONDEVICE") "NON_DEVICE"\r |
| 235 | #token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE"\r |
| 236 | #token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE"\r |
| 237 | #token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE"\r |
| 238 | #token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE"\r |
| 239 | #token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE"\r |
| 240 | #token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE"\r |
| 241 | \r |
| 242 | #token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION"\r |
| 243 | #token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION"\r |
| 244 | #token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE"\r |
| 245 | #token SubclassSingleUse("SINGLE_USE") "SINGLE_USE"\r |
| 246 | \r |
| 247 | //\r |
| 248 | // This is the overall definition of a VFR form definition script.\r |
| 249 | //\r |
| 250 | \r |
| 251 | vfrProgram > [UINT8 Return] :\r |
| 252 | <<\r |
| 253 | mParserStatus = 0;\r |
| 254 | mConstantOnlyInExpression = FALSE;\r |
| 255 | >>\r |
| 256 | (\r |
| 257 | vfrPragmaPackDefinition\r |
| 258 | | vfrDataStructDefinition\r |
| 259 | )*\r |
| 260 | vfrFormSetDefinition\r |
| 261 | << $Return = mParserStatus; >>\r |
| 262 | ;\r |
| 263 | \r |
| 264 | pragmaPackShowDef :\r |
| 265 | L:"show" << gCVfrVarDataTypeDB.Pack (L->getLine(), VFR_PACK_SHOW); >>\r |
| 266 | ;\r |
| 267 | \r |
| 268 | pragmaPackStackDef :\r |
| 269 | <<\r |
| 270 | UINT32 LineNum;\r |
| 271 | UINT8 PackAction;\r |
| 272 | CHAR8 *Identifier = NULL;\r |
| 273 | UINT32 PackNumber = DEFAULT_PACK_ALIGN;\r |
| 274 | >>\r |
| 275 | (\r |
| 276 | L1:"push" << LineNum = L1->getLine(); PackAction = VFR_PACK_PUSH; >>\r |
| 277 | | L2:"pop" << LineNum = L2->getLine(); PackAction = VFR_PACK_POP; >>\r |
| 278 | )\r |
| 279 | {\r |
| 280 | "," ID:StringIdentifier << Identifier = ID->getText(); >>\r |
| 281 | }\r |
| 282 | {\r |
| 283 | "," N:Number << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText()); >>\r |
| 284 | }\r |
| 285 | << gCVfrVarDataTypeDB.Pack (LineNum, PackAction, Identifier, PackNumber); >>\r |
| 286 | ;\r |
| 287 | \r |
| 288 | pragmaPackNumber :\r |
| 289 | <<\r |
| 290 | UINT32 LineNum;\r |
| 291 | UINT32 PackNumber = DEFAULT_PACK_ALIGN;\r |
| 292 | >>\r |
| 293 | N:Number << LineNum = N->getLine(); PackNumber = _STOU32(N->getText()); >>\r |
| 294 | << gCVfrVarDataTypeDB.Pack (LineNum, VFR_PACK_ASSIGN, NULL, PackNumber); >>\r |
| 295 | ;\r |
| 296 | \r |
| 297 | vfrPragmaPackDefinition :\r |
| 298 | "\#pragma" "pack" "\("\r |
| 299 | {\r |
| 300 | pragmaPackShowDef\r |
| 301 | | pragmaPackStackDef\r |
| 302 | | pragmaPackNumber\r |
| 303 | }\r |
| 304 | "\)"\r |
| 305 | ;\r |
| 306 | \r |
| 307 | vfrDataStructDefinition :\r |
| 308 | { TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r |
| 309 | { NonNvDataMap }\r |
| 310 | {\r |
| 311 | N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r |
| 312 | }\r |
| 313 | OpenBrace\r |
| 314 | vfrDataStructFields\r |
| 315 | CloseBrace\r |
| 316 | {\r |
| 317 | N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r |
| 318 | }\r |
| 319 | ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r |
| 320 | ;\r |
| 321 | \r |
| 322 | vfrDataStructFields :\r |
| 323 | (\r |
| 324 | dataStructField64 |\r |
| 325 | dataStructField32 |\r |
| 326 | dataStructField16 |\r |
| 327 | dataStructField8 |\r |
| 328 | dataStructFieldBool |\r |
| 329 | dataStructFieldString |\r |
| 330 | dataStructFieldDate |\r |
| 331 | dataStructFieldTime |\r |
| 332 | dataStructFieldUser\r |
| 333 | )*\r |
| 334 | ;\r |
| 335 | \r |
| 336 | dataStructField64 :\r |
| 337 | << UINT32 ArrayNum = 0; >>\r |
| 338 | "UINT64"\r |
| 339 | N:StringIdentifier\r |
| 340 | {\r |
| 341 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 342 | }\r |
| 343 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r |
| 344 | ;\r |
| 345 | \r |
| 346 | dataStructField32 :\r |
| 347 | << UINT32 ArrayNum = 0; >>\r |
| 348 | "UINT32"\r |
| 349 | N:StringIdentifier\r |
| 350 | {\r |
| 351 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 352 | }\r |
| 353 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r |
| 354 | ;\r |
| 355 | \r |
| 356 | dataStructField16 :\r |
| 357 | << UINT32 ArrayNum = 0; >>\r |
| 358 | ("UINT16" | "CHAR16")\r |
| 359 | N:StringIdentifier\r |
| 360 | {\r |
| 361 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 362 | }\r |
| 363 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>\r |
| 364 | ;\r |
| 365 | \r |
| 366 | dataStructField8 :\r |
| 367 | << UINT32 ArrayNum = 0; >>\r |
| 368 | "UINT8"\r |
| 369 | N:StringIdentifier\r |
| 370 | {\r |
| 371 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 372 | }\r |
| 373 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>\r |
| 374 | ;\r |
| 375 | \r |
| 376 | dataStructFieldBool :\r |
| 377 | << UINT32 ArrayNum = 0; >>\r |
| 378 | "BOOLEAN"\r |
| 379 | N:StringIdentifier\r |
| 380 | {\r |
| 381 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 382 | }\r |
| 383 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>\r |
| 384 | ;\r |
| 385 | \r |
| 386 | dataStructFieldString :\r |
| 387 | << UINT32 ArrayNum = 0; >>\r |
| 388 | "EFI_STRING_ID"\r |
| 389 | N:StringIdentifier\r |
| 390 | {\r |
| 391 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 392 | }\r |
| 393 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>\r |
| 394 | ;\r |
| 395 | \r |
| 396 | dataStructFieldDate :\r |
| 397 | << UINT32 ArrayNum = 0; >>\r |
| 398 | "EFI_HII_DATE"\r |
| 399 | N:StringIdentifier\r |
| 400 | {\r |
| 401 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 402 | }\r |
| 403 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>\r |
| 404 | ;\r |
| 405 | \r |
| 406 | dataStructFieldTime :\r |
| 407 | << UINT32 ArrayNum = 0; >>\r |
| 408 | "EFI_HII_TIME"\r |
| 409 | N:StringIdentifier\r |
| 410 | {\r |
| 411 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 412 | }\r |
| 413 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>\r |
| 414 | ;\r |
| 415 | \r |
| 416 | dataStructFieldUser :\r |
| 417 | << UINT32 ArrayNum = 0; >>\r |
| 418 | T:StringIdentifier\r |
| 419 | N:StringIdentifier\r |
| 420 | {\r |
| 421 | OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>\r |
| 422 | }\r |
| 423 | ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r |
| 424 | ;\r |
| 425 | \r |
| 426 | //*****************************************************************************\r |
| 427 | //\r |
| 428 | // the syntax of GUID definition\r |
| 429 | //\r |
| 430 | guidSubDefinition [EFI_GUID &Guid] :\r |
| 431 | G4:Number "," G5:Number "," G6:Number "," G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r |
| 432 | <<\r |
| 433 | Guid.Data4[0] = _STOU8(G4->getText());\r |
| 434 | Guid.Data4[1] = _STOU8(G5->getText());\r |
| 435 | Guid.Data4[2] = _STOU8(G6->getText());\r |
| 436 | Guid.Data4[3] = _STOU8(G7->getText());\r |
| 437 | Guid.Data4[4] = _STOU8(G8->getText());\r |
| 438 | Guid.Data4[5] = _STOU8(G9->getText());\r |
| 439 | Guid.Data4[6] = _STOU8(G10->getText());\r |
| 440 | Guid.Data4[7] = _STOU8(G11->getText());\r |
| 441 | >>\r |
| 442 | ;\r |
| 443 | \r |
| 444 | guidDefinition [EFI_GUID &Guid] :\r |
| 445 | OpenBrace\r |
| 446 | G1:Number "," G2:Number "," G3:Number ","\r |
| 447 | <<\r |
| 448 | Guid.Data1 = _STOU32 (G1->getText());\r |
| 449 | Guid.Data2 = _STOU16 (G2->getText());\r |
| 450 | Guid.Data3 = _STOU16 (G3->getText());\r |
| 451 | >>\r |
| 452 | (\r |
| 453 | OpenBrace guidSubDefinition[Guid] CloseBrace\r |
| 454 | | guidSubDefinition[Guid]\r |
| 455 | )\r |
| 456 | CloseBrace\r |
| 457 | ;\r |
| 458 | \r |
| 459 | //*****************************************************************************\r |
| 460 | //\r |
| 461 | // the syntax of form set definition\r |
| 462 | //\r |
| 463 | vfrFormSetDefinition :\r |
| 464 | <<\r |
| 465 | EFI_GUID Guid;\r |
| 466 | EFI_GUID DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID;\r |
| 467 | EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3;\r |
| 468 | UINT8 ClassGuidNum = 0;\r |
| 469 | CIfrFormSet *FSObj = NULL;\r |
| 470 | UINT16 C, SC;\r |
| 471 | >>\r |
| 472 | L:FormSet\r |
| 473 | Uuid "=" guidDefinition[Guid] ","\r |
| 474 | Title "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r |
| 475 | Help "=" "STRING_TOKEN" "\(" S2:Number "\)" ","\r |
| 476 | {\r |
| 477 | ClassGuid "=" guidDefinition[ClassGuid1] << ++ClassGuidNum; >>\r |
| 478 | {\r |
| 479 | "\|" guidDefinition[ClassGuid2] << ++ClassGuidNum; >>\r |
| 480 | }\r |
| 481 | {\r |
| 482 | "\|" guidDefinition[ClassGuid3] << ++ClassGuidNum; >>\r |
| 483 | }\r |
| 484 | ","\r |
| 485 | }\r |
| 486 | <<\r |
| 487 | switch (ClassGuidNum) {\r |
| 488 | case 0:\r |
| 489 | FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r |
| 490 | FSObj->SetClassGuid(&DefaultClassGuid);\r |
| 491 | break;\r |
| 492 | case 1:\r |
| 493 | FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET));\r |
| 494 | FSObj->SetClassGuid(&ClassGuid1);\r |
| 495 | break;\r |
| 496 | case 2:\r |
| 497 | FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + sizeof(EFI_GUID));\r |
| 498 | FSObj->SetClassGuid(&ClassGuid1);\r |
| 499 | FSObj->SetClassGuid(&ClassGuid2);\r |
| 500 | break;\r |
| 501 | default:\r |
| 502 | FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + 2 * sizeof(EFI_GUID));\r |
| 503 | FSObj->SetClassGuid(&ClassGuid1);\r |
| 504 | FSObj->SetClassGuid(&ClassGuid2);\r |
| 505 | FSObj->SetClassGuid(&ClassGuid3);\r |
| 506 | break;\r |
| 507 | }\r |
| 508 | \r |
| 509 | SET_LINE_INFO (*FSObj, L);\r |
| 510 | FSObj->SetGuid (&Guid);\r |
| 511 | //\r |
| 512 | // for framework vfr to store formset guid used by varstore and efivarstore\r |
| 513 | //\r |
| 514 | if (mCompatibleMode) {\r |
| 515 | memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));\r |
| 516 | }\r |
| 517 | FSObj->SetFormSetTitle (_STOSID(S1->getText()));\r |
| 518 | FSObj->SetHelp (_STOSID(S2->getText()));\r |
| 519 | >>\r |
| 520 | {\r |
| 521 | FC:Class "=" classDefinition[C] "," << {CIfrClass CObj;SET_LINE_INFO (CObj, FC); CObj.SetClass(C);} >>\r |
| 522 | }\r |
| 523 | {\r |
| 524 | FSC:Subclass "=" subclassDefinition[SC] "," << {CIfrSubClass SCObj; SET_LINE_INFO (SCObj, FSC); SCObj.SetSubClass(SC);} >>\r |
| 525 | }\r |
| 526 | <<\r |
| 527 | _DeclareStandardDefaultStorage (GET_LINENO (L));\r |
| 528 | >>\r |
| 529 | vfrFormSetList\r |
| 530 | E:EndFormSet <<\r |
| 531 | if (mCompatibleMode) {\r |
| 532 | //\r |
| 533 | // declare all undefined varstore and efivarstore\r |
| 534 | //\r |
| 535 | _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r |
| 536 | }\r |
| 537 | CRT_END_OP (E); if (FSObj != NULL) delete FSObj;\r |
| 538 | >>\r |
| 539 | ";"\r |
| 540 | ;\r |
| 541 | \r |
| 542 | vfrFormSetList :\r |
| 543 | (\r |
| 544 | vfrFormDefinition |\r |
| 545 | vfrStatementImage |\r |
| 546 | vfrStatementVarStoreLinear |\r |
| 547 | vfrStatementVarStoreEfi |\r |
| 548 | vfrStatementVarStoreNameValue |\r |
| 549 | vfrStatementDefaultStore |\r |
| 550 | vfrStatementDisableIfFormSet\r |
| 551 | )*\r |
| 552 | ;\r |
| 553 | \r |
| 554 | vfrStatementDefaultStore :\r |
| 555 | << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r |
| 556 | D:DefaultStore N:StringIdentifier ","\r |
| 557 | Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"\r |
| 558 | {\r |
| 559 | "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText()); >>\r |
| 560 | }\r |
| 561 | <<\r |
| 562 | if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r |
| 563 | CIfrDefaultStore DSObj;\r |
| 564 | _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText()), DefaultId)), D->getLine();\r |
| 565 | DSObj.SetLineNo(D->getLine());\r |
| 566 | DSObj.SetDefaultName (_STOSID(S->getText()));\r |
| 567 | DSObj.SetDefaultId (DefaultId);\r |
| 568 | } else {\r |
| 569 | _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText()))), D->getLine();\r |
| 570 | }\r |
| 571 | >>\r |
| 572 | ";"\r |
| 573 | ;\r |
| 574 | \r |
| 575 | vfrStatementVarStoreLinear :\r |
| 576 | <<\r |
| 577 | EFI_GUID Guid;\r |
| 578 | CIfrVarStore VSObj;\r |
| 579 | CHAR8 *TypeName;\r |
| 580 | CHAR8 *StoreName;\r |
| 581 | UINT32 LineNum;\r |
| 582 | EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r |
| 583 | UINT32 Size;\r |
| 584 | >>\r |
| 585 | V:Varstore << VSObj.SetLineNo(V->getLine()); >>\r |
| 586 | (\r |
| 587 | TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r |
| 588 | | U8:"UINT8" "," << TypeName = "UINT8"; LineNum = U8->getLine(); >>\r |
| 589 | | U16:"UINT16" "," << TypeName = "UINT16"; LineNum = U16->getLine(); >>\r |
| 590 | | U32:"UINT32" "," << TypeName = "UINT32"; LineNum = U32->getLine(); >>\r |
| 591 | | U64:"UINT64" "," << TypeName = "UINT64"; LineNum = U64->getLine(); >>\r |
| 592 | | D:"EFI_HII_DATE" "," << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>\r |
| 593 | | T:"EFI_HII_TIME" "," << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>\r |
| 594 | )\r |
| 595 | { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r |
| 596 | if (mCompatibleMode) {\r |
| 597 | VarStoreId = _STOU16(FID->getText());\r |
| 598 | }\r |
| 599 | >>\r |
| 600 | }\r |
| 601 | {\r |
| 602 | VarId "=" ID:Number "," <<\r |
| 603 | _PCATCH(\r |
| 604 | (INTN)(VarStoreId = _STOU16(ID->getText())) != 0,\r |
| 605 | (INTN)TRUE,\r |
| 606 | ID,\r |
| 607 | "varid 0 is not allowed."\r |
| 608 | );\r |
| 609 | >>\r |
| 610 | }\r |
| 611 | Name "=" SN:StringIdentifier ","\r |
| 612 | Uuid "=" guidDefinition[Guid]\r |
| 613 | <<\r |
| 614 | if (mCompatibleMode) {\r |
| 615 | StoreName = TypeName;\r |
| 616 | } else {\r |
| 617 | StoreName = SN->getText();\r |
| 618 | }\r |
| 619 | _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r |
| 620 | StoreName,\r |
| 621 | &Guid,\r |
| 622 | &gCVfrVarDataTypeDB,\r |
| 623 | TypeName,\r |
| 624 | VarStoreId\r |
| 625 | ), LineNum);\r |
| 626 | VSObj.SetGuid (&Guid);\r |
| 627 | _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId), SN);\r |
| 628 | VSObj.SetVarStoreId (VarStoreId);\r |
| 629 | _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r |
| 630 | VSObj.SetSize (Size);\r |
| 631 | VSObj.SetName (SN->getText());\r |
| 632 | >>\r |
| 633 | ";"\r |
| 634 | ;\r |
| 635 | \r |
| 636 | vfrStatementVarStoreEfi :\r |
| 637 | <<\r |
| 638 | EFI_GUID Guid;\r |
| 639 | CIfrVarStoreEfi VSEObj;\r |
| 640 | EFI_VARSTORE_ID VarStoreId;\r |
| 641 | UINT32 Attr = 0;\r |
| 642 | >>\r |
| 643 | E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r |
| 644 | SN:StringIdentifier ","\r |
| 645 | Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","\r |
| 646 | << VSEObj.SetAttributes (Attr); >>\r |
| 647 | Name "=" "STRING_TOKEN" "\(" VN:Number "\)" ","\r |
| 648 | VarSize "=" N:Number ","\r |
| 649 | Uuid "=" guidDefinition[Guid] << mCVfrDataStorage.DeclareEfiVarStore (SN->getText(), &Guid, _STOSID(VN->getText()), _STOU32(N->getText())); >>\r |
| 650 | <<\r |
| 651 | VSEObj.SetGuid (&Guid);\r |
| 652 | _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r |
| 653 | VSEObj.SetVarStoreId (VarStoreId);\r |
| 654 | >>\r |
| 655 | ";"\r |
| 656 | ;\r |
| 657 | \r |
| 658 | vfrVarStoreEfiAttr [UINT32 & Attr] :\r |
| 659 | N:Number << $Attr |= _STOU32(N->getText()); >>\r |
| 660 | ;\r |
| 661 | \r |
| 662 | vfrStatementVarStoreNameValue :\r |
| 663 | <<\r |
| 664 | EFI_GUID Guid;\r |
| 665 | CIfrVarStoreNameValue VSNVObj;\r |
| 666 | EFI_VARSTORE_ID VarStoreId;\r |
| 667 | >>\r |
| 668 | L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >>\r |
| 669 | SN:StringIdentifier "," << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText()), SN); >>\r |
| 670 | (\r |
| 671 | Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText())), SN); >>\r |
| 672 | )+\r |
| 673 | Uuid "=" guidDefinition[Guid] << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r |
| 674 | <<\r |
| 675 | VSNVObj.SetGuid (&Guid);\r |
| 676 | _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r |
| 677 | VSNVObj.SetVarStoreId (VarStoreId);\r |
| 678 | >>\r |
| 679 | ";"\r |
| 680 | ;\r |
| 681 | \r |
| 682 | //\r |
| 683 | // keep classDeinition and validClassNames for compatibility but not generate\r |
| 684 | // any IFR object\r |
| 685 | //\r |
| 686 | classDefinition[UINT16 & Class] :\r |
| 687 | << $Class = 0; >>\r |
| 688 | validClassNames[$Class] ( "\|" validClassNames[$Class] )*\r |
| 689 | ;\r |
| 690 | \r |
| 691 | validClassNames[UINT16 & Class] :\r |
| 692 | ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >>\r |
| 693 | | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >>\r |
| 694 | | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >>\r |
| 695 | | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >>\r |
| 696 | | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >>\r |
| 697 | | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>\r |
| 698 | | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >>\r |
| 699 | | N:Number << $Class |= _STOU16(N->getText()); >>\r |
| 700 | ;\r |
| 701 | \r |
| 702 | subclassDefinition[UINT16 & SubClass] :\r |
| 703 | << $SubClass = 0; >>\r |
| 704 | SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>\r |
| 705 | | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>\r |
| 706 | | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>\r |
| 707 | | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>\r |
| 708 | | N:Number << $SubClass |= _STOU16(N->getText()); >>\r |
| 709 | ;\r |
| 710 | \r |
| 711 | vfrStatementDisableIfFormSet :\r |
| 712 | <<\r |
| 713 | CIfrDisableIf DIObj;\r |
| 714 | mConstantOnlyInExpression = TRUE;\r |
| 715 | >>\r |
| 716 | D:DisableIf << DIObj.SetLineNo(D->getLine()); >>\r |
| 717 | vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r |
| 718 | vfrFormSetList\r |
| 719 | E:EndIf << CRT_END_OP (E); >>\r |
| 720 | ";"\r |
| 721 | ;\r |
| 722 | \r |
| 723 | //*****************************************************************************\r |
| 724 | //\r |
| 725 | // the syntax of question header and statement header\r |
| 726 | //\r |
| 727 | vfrStatementHeader[CIfrStatementHeader *SHObj] :\r |
| 728 | Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText())); >>\r |
| 729 | Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText())); >>\r |
| 730 | ;\r |
| 731 | \r |
| 732 | vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r |
| 733 | <<\r |
| 734 | EFI_VARSTORE_INFO Info;\r |
| 735 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 736 | CHAR8 *QName = NULL;\r |
| 737 | CHAR8 *VarIdStr = NULL;\r |
| 738 | >>\r |
| 739 | {\r |
| 740 | Name "=" QN:StringIdentifier "," <<\r |
| 741 | QName = QN->getText();\r |
| 742 | _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r |
| 743 | >>\r |
| 744 | }\r |
| 745 | { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r |
| 746 | {\r |
| 747 | QuestionId "=" ID:Number "," <<\r |
| 748 | QId = _STOQID(ID->getText());\r |
| 749 | _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r |
| 750 | >>\r |
| 751 | }\r |
| 752 | <<\r |
| 753 | switch (QType) {\r |
| 754 | case QUESTION_NORMAL:\r |
| 755 | mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r |
| 756 | break;\r |
| 757 | case QUESTION_DATE:\r |
| 758 | mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r |
| 759 | break;\r |
| 760 | case QUESTION_TIME:\r |
| 761 | mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r |
| 762 | break;\r |
| 763 | default:\r |
| 764 | _PCATCH(VFR_RETURN_FATAL_ERROR);\r |
| 765 | }\r |
| 766 | $QHObj.SetQuestionId (QId);\r |
| 767 | $QHObj.SetVarStoreInfo (&Info);\r |
| 768 | >>\r |
| 769 | vfrStatementHeader[&$QHObj]\r |
| 770 | << _SAVE_CURRQEST_VARINFO (Info); >>\r |
| 771 | << if (VarIdStr != NULL) delete VarIdStr; >>\r |
| 772 | ;\r |
| 773 | \r |
| 774 | vfrQuestionHeaderWithNoStorage[CIfrQuestionHeader *QHObj] :\r |
| 775 | <<\r |
| 776 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 777 | CHAR8 *QName = NULL;\r |
| 778 | >>\r |
| 779 | {\r |
| 780 | Name "=" QN:StringIdentifier "," <<\r |
| 781 | QName = QN->getText();\r |
| 782 | _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r |
| 783 | >>\r |
| 784 | }\r |
| 785 | {\r |
| 786 | QuestionId "=" ID:Number "," <<\r |
| 787 | QId = _STOQID(ID->getText());\r |
| 788 | _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "redefined quesiont ID");\r |
| 789 | >>\r |
| 790 | }\r |
| 791 | <<\r |
| 792 | mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r |
| 793 | $QHObj->SetQuestionId (QId);\r |
| 794 | >>\r |
| 795 | vfrStatementHeader[$QHObj]\r |
| 796 | ;\r |
| 797 | \r |
| 798 | questionheaderFlagsField[UINT8 & Flags] :\r |
| 799 | ReadOnlyFlag << $Flags |= 0x01; >>\r |
| 800 | | InteractiveFlag << $Flags |= 0x04; >>\r |
| 801 | | ResetRequiredFlag << $Flags |= 0x10; >>\r |
| 802 | | OptionOnlyFlag << $Flags |= 0x80; >>\r |
| 803 | | NVAccessFlag\r |
| 804 | | LateCheckFlag\r |
| 805 | ;\r |
| 806 | \r |
| 807 | vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :\r |
| 808 | <<\r |
| 809 | UINT32 Idx;\r |
| 810 | UINT32 LineNo;\r |
| 811 | EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r |
| 812 | CHAR8 *VarIdStr = NULL;\r |
| 813 | CHAR8 *VarStr = NULL;\r |
| 814 | CHAR8 *SName = NULL;\r |
| 815 | CHAR8 *TName = NULL;\r |
| 816 | EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r |
| 817 | EFI_IFR_TYPE_VALUE Dummy = gZeroEfiIfrTypeValue;\r |
| 818 | >>\r |
| 819 | (\r |
| 820 | SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r |
| 821 | OpenBracket I1:Number CloseBracket <<\r |
| 822 | Idx = _STOU32(I1->getText());\r |
| 823 | _STRCAT(&VarIdStr, "[");\r |
| 824 | _STRCAT(&VarIdStr, I1->getText());\r |
| 825 | _STRCAT(&VarIdStr, "]");\r |
| 826 | >>\r |
| 827 | <<\r |
| 828 | VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r |
| 829 | if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r |
| 830 | mCVfrDataStorage.DeclareBufferVarStore (\r |
| 831 | SName,\r |
| 832 | &mFormsetGuid,\r |
| 833 | &gCVfrVarDataTypeDB,\r |
| 834 | SName,\r |
| 835 | EFI_VARSTORE_ID_INVALID,\r |
| 836 | FALSE\r |
| 837 | );\r |
| 838 | VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r |
| 839 | }\r |
| 840 | _PCATCH(VfrReturnCode, SN1);\r |
| 841 | _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);\r |
| 842 | _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r |
| 843 | >>\r |
| 844 | )\r |
| 845 | |\r |
| 846 | (\r |
| 847 | SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r |
| 848 | <<\r |
| 849 | VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r |
| 850 | if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r |
| 851 | mCVfrDataStorage.DeclareBufferVarStore (\r |
| 852 | SName,\r |
| 853 | &mFormsetGuid,\r |
| 854 | &gCVfrVarDataTypeDB,\r |
| 855 | SName,\r |
| 856 | EFI_VARSTORE_ID_INVALID,\r |
| 857 | FALSE\r |
| 858 | );\r |
| 859 | VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r |
| 860 | }\r |
| 861 | _PCATCH(VfrReturnCode, SN2);\r |
| 862 | _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r |
| 863 | if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r |
| 864 | _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r |
| 865 | _STRCAT(&VarStr, TName);\r |
| 866 | }\r |
| 867 | >>\r |
| 868 | \r |
| 869 | (\r |
| 870 | "." <<\r |
| 871 | _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r |
| 872 | _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r |
| 873 | >>\r |
| 874 | SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r |
| 875 | {\r |
| 876 | OpenBracket I2:Number CloseBracket <<\r |
| 877 | Idx = _STOU32(I2->getText());\r |
| 878 | if (mCompatibleMode) Idx --;\r |
| 879 | if (Idx > 0) {\r |
| 880 | //\r |
| 881 | // Idx == 0, [0] can be ignored.\r |
| 882 | // Array[0] is same to Array for unify the varid name to cover [0]\r |
| 883 | //\r |
| 884 | _STRCAT(&VarIdStr, "[");\r |
| 885 | _STRCAT(&VarIdStr, I2->getText());\r |
| 886 | _STRCAT(&VarIdStr, "]");\r |
| 887 | }\r |
| 888 | _STRCAT(&VarStr, "[");\r |
| 889 | _STRCAT(&VarStr, I2->getText());\r |
| 890 | _STRCAT(&VarStr, "]");\r |
| 891 | >>\r |
| 892 | }\r |
| 893 | )* <<\r |
| 894 | switch (VarStoreType) {\r |
| 895 | case EFI_VFR_VARSTORE_EFI:\r |
| 896 | _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r |
| 897 | break;\r |
| 898 | case EFI_VFR_VARSTORE_BUFFER:\r |
| 899 | _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r |
| 900 | _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r |
| 901 | SName,\r |
| 902 | NULL),\r |
| 903 | SN2->getLine());\r |
| 904 | _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (\r |
| 905 | 'a',\r |
| 906 | SName,\r |
| 907 | NULL,\r |
| 908 | $Info.mVarType,\r |
| 909 | $Info.mInfo.mVarOffset,\r |
| 910 | $Info.mVarTotalSize,\r |
| 911 | Dummy),\r |
| 912 | SN2->getLine());\r |
| 913 | break;\r |
| 914 | case EFI_VFR_VARSTORE_NAME:\r |
| 915 | default: break;\r |
| 916 | }\r |
| 917 | \r |
| 918 | QuestVarIdStr = VarIdStr;\r |
| 919 | if (VarStr != NULL) {delete VarStr;}\r |
| 920 | >>\r |
| 921 | )\r |
| 922 | ;\r |
| 923 | \r |
| 924 | vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] :\r |
| 925 | <<\r |
| 926 | UINT32 Idx;\r |
| 927 | VarIdStr = NULL; LineNo = 0;\r |
| 928 | >>\r |
| 929 | (\r |
| 930 | SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>\r |
| 931 | OpenBracket I1:Number CloseBracket <<\r |
| 932 | _STRCAT(&VarIdStr, "[");\r |
| 933 | _STRCAT(&VarIdStr, I1->getText());\r |
| 934 | _STRCAT(&VarIdStr, "]");\r |
| 935 | mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask);\r |
| 936 | if (mConstantOnlyInExpression) {\r |
| 937 | _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r |
| 938 | }\r |
| 939 | >>\r |
| 940 | )\r |
| 941 | |\r |
| 942 | (\r |
| 943 | SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>\r |
| 944 | (\r |
| 945 | "." << \r |
| 946 | _STRCAT (&VarIdStr, ".");\r |
| 947 | if (mConstantOnlyInExpression) {\r |
| 948 | _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r |
| 949 | }\r |
| 950 | >>\r |
| 951 | SF:StringIdentifier << _STRCAT (&VarIdStr, SF->getText()); >>\r |
| 952 | {\r |
| 953 | OpenBracket I2:Number CloseBracket <<\r |
| 954 | Idx = _STOU32(I2->getText());\r |
| 955 | if (mCompatibleMode) Idx --;\r |
| 956 | if (Idx > 0) {\r |
| 957 | //\r |
| 958 | // Idx == 0, [0] can be ignored.\r |
| 959 | // Array[0] is same to Array\r |
| 960 | //\r |
| 961 | _STRCAT(&VarIdStr, "[");\r |
| 962 | _STRCAT(&VarIdStr, I2->getText());\r |
| 963 | _STRCAT(&VarIdStr, "]");\r |
| 964 | }\r |
| 965 | >>\r |
| 966 | }\r |
| 967 | )*\r |
| 968 | << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r |
| 969 | )\r |
| 970 | ;\r |
| 971 | \r |
| 972 | vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r |
| 973 | N1:Number <<\r |
| 974 | switch ($Type) {\r |
| 975 | case EFI_IFR_TYPE_NUM_SIZE_8 :\r |
| 976 | $Value.u8 = _STOU8(N1->getText());\r |
| 977 | break;\r |
| 978 | case EFI_IFR_TYPE_NUM_SIZE_16 :\r |
| 979 | $Value.u16 = _STOU16(N1->getText());\r |
| 980 | break;\r |
| 981 | case EFI_IFR_TYPE_NUM_SIZE_32 :\r |
| 982 | $Value.u32 = _STOU32(N1->getText());\r |
| 983 | break;\r |
| 984 | case EFI_IFR_TYPE_NUM_SIZE_64 :\r |
| 985 | $Value.u64 = _STOU64(N1->getText());\r |
| 986 | break;\r |
| 987 | case EFI_IFR_TYPE_BOOLEAN :\r |
| 988 | $Value.b = _STOU8(N1->getText());\r |
| 989 | break;\r |
| 990 | case EFI_IFR_TYPE_STRING :\r |
| 991 | $Value.string = _STOU16(N1->getText());\r |
| 992 | break;\r |
| 993 | case EFI_IFR_TYPE_TIME :\r |
| 994 | case EFI_IFR_TYPE_DATE :\r |
| 995 | default :\r |
| 996 | break;\r |
| 997 | }\r |
| 998 | >>\r |
| 999 | | B1:True << $Value.b = TRUE; >>\r |
| 1000 | | B2:False << $Value.b = FALSE; >>\r |
| 1001 | | O1:One << $Value.u8 = _STOU8(O1->getText()); >>\r |
| 1002 | | O2:Ones << $Value.u64 = _STOU64(O2->getText()); >>\r |
| 1003 | | Z:Zero << $Value.u8 = _STOU8(Z->getText()); >>\r |
| 1004 | | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(), SECOND->getText()); >>\r |
| 1005 | | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText()); >>\r |
| 1006 | | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText()); >>\r |
| 1007 | ;\r |
| 1008 | \r |
| 1009 | //*****************************************************************************\r |
| 1010 | //\r |
| 1011 | // the syntax of form definition\r |
| 1012 | //\r |
| 1013 | vfrFormDefinition :\r |
| 1014 | << CIfrForm FObj; >>\r |
| 1015 | F:Form << FObj.SetLineNo(F->getLine()); >>\r |
| 1016 | FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText())), S1); >>\r |
| 1017 | Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText())); >>\r |
| 1018 | (\r |
| 1019 | vfrStatementImage |\r |
| 1020 | vfrStatementLocked |\r |
| 1021 | vfrStatementRules |\r |
| 1022 | vfrStatementDefault |\r |
| 1023 | vfrStatementStat |\r |
| 1024 | vfrStatementQuestions |\r |
| 1025 | vfrStatementConditional |\r |
| 1026 | vfrStatementLabel |\r |
| 1027 | vfrStatementBanner |\r |
| 1028 | // Just for framework vfr compatibility\r |
| 1029 | vfrStatementInvalid\r |
| 1030 | )*\r |
| 1031 | E:EndForm <<\r |
| 1032 | if (mCompatibleMode) {\r |
| 1033 | //\r |
| 1034 | // Add Label for Framework Vfr\r |
| 1035 | //\r |
| 1036 | CIfrLabel LObj1;\r |
| 1037 | LObj1.SetLineNo(E->getLine());\r |
| 1038 | LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r |
| 1039 | CIfrLabel LObj2;\r |
| 1040 | LObj2.SetLineNo(E->getLine());\r |
| 1041 | LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0\r |
| 1042 | CIfrLabel LObj3;\r |
| 1043 | LObj3.SetLineNo(E->getLine());\r |
| 1044 | LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r |
| 1045 | //\r |
| 1046 | // Declare undefined Question\r |
| 1047 | //\r |
| 1048 | if (gCFormPkg.HavePendingUnassigned()) {\r |
| 1049 | gCFormPkg.DeclarePendingQuestion (\r |
| 1050 | gCVfrVarDataTypeDB,\r |
| 1051 | mCVfrDataStorage,\r |
| 1052 | mCVfrQuestionDB,\r |
| 1053 | &mFormsetGuid,\r |
| 1054 | E->getLine()\r |
| 1055 | );\r |
| 1056 | }\r |
| 1057 | }\r |
| 1058 | //\r |
| 1059 | // mCVfrQuestionDB.PrintAllQuestion();\r |
| 1060 | //\r |
| 1061 | CRT_END_OP (E);\r |
| 1062 | >>\r |
| 1063 | ";"\r |
| 1064 | ;\r |
| 1065 | \r |
| 1066 | vfrStatementRules :\r |
| 1067 | << CIfrRule RObj; >>\r |
| 1068 | R:Rule << RObj.SetLineNo(R->getLine()); >>\r |
| 1069 | S1:StringIdentifier "," <<\r |
| 1070 | mCVfrRulesDB.RegisterRule (S1->getText());\r |
| 1071 | RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));\r |
| 1072 | >>\r |
| 1073 | vfrStatementExpression[0]\r |
| 1074 | E:EndRule << CRT_END_OP (E); >>\r |
| 1075 | ";"\r |
| 1076 | ;\r |
| 1077 | \r |
| 1078 | vfrStatementDefault :\r |
| 1079 | <<\r |
| 1080 | BOOLEAN IsExp = FALSE;\r |
| 1081 | EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r |
| 1082 | CIfrDefault DObj;\r |
| 1083 | EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r |
| 1084 | CHAR8 *VarStoreName = NULL;\r |
| 1085 | EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r |
| 1086 | >>\r |
| 1087 | D:Default << DObj.SetLineNo(D->getLine()); >>\r |
| 1088 | (\r |
| 1089 | (\r |
| 1090 | vfrStatementValue "," << IsExp = TRUE; DObj.SetScope (1); CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r |
| 1091 | | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] "," << \r |
| 1092 | \r |
| 1093 | if (gCurrentIfrOpcode != NULL && gCurrentIfrOpcode->GetObjBinAddr() != NULL) {\r |
| 1094 | EFI_IFR_OP_HEADER *TempOpCode;\r |
| 1095 | TempOpCode = (EFI_IFR_OP_HEADER *) gCurrentIfrOpcode->GetObjBinAddr();\r |
| 1096 | switch (TempOpCode->OpCode) {\r |
| 1097 | case EFI_IFR_NUMERIC_OP:\r |
| 1098 | EFI_IFR_NUMERIC *TempNumricCode;\r |
| 1099 | TempNumricCode = (EFI_IFR_NUMERIC *) TempOpCode;\r |
| 1100 | switch (_GET_CURRQEST_DATATYPE()) {\r |
| 1101 | case EFI_IFR_TYPE_NUM_SIZE_64:\r |
| 1102 | if (Val.u64 < TempNumricCode->data.u64.MinValue || Val.u64 > TempNumricCode->data.u64.MaxValue) {\r |
| 1103 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r |
| 1104 | }\r |
| 1105 | break;\r |
| 1106 | case EFI_IFR_TYPE_NUM_SIZE_32:\r |
| 1107 | if (Val.u32 < TempNumricCode->data.u32.MinValue || Val.u32 > TempNumricCode->data.u32.MaxValue) {\r |
| 1108 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r |
| 1109 | }\r |
| 1110 | break;\r |
| 1111 | case EFI_IFR_TYPE_NUM_SIZE_16:\r |
| 1112 | if (Val.u16 < TempNumricCode->data.u16.MinValue || Val.u16 > TempNumricCode->data.u16.MaxValue) {\r |
| 1113 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r |
| 1114 | }\r |
| 1115 | break;\r |
| 1116 | case EFI_IFR_TYPE_NUM_SIZE_8:\r |
| 1117 | if (Val.u8 < TempNumricCode->data.u8.MinValue || Val.u8 > TempNumricCode->data.u8.MaxValue) {\r |
| 1118 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r |
| 1119 | }\r |
| 1120 | break;\r |
| 1121 | }\r |
| 1122 | break;\r |
| 1123 | case EFI_IFR_ONE_OF_OP:\r |
| 1124 | EFI_IFR_ONE_OF *TempOneOfCode;\r |
| 1125 | TempOneOfCode = (EFI_IFR_ONE_OF *) TempOpCode;\r |
| 1126 | if (TempOneOfCode->data.u64.MinValue != 0 || TempOneOfCode->data.u64.MaxValue != 0 || TempOneOfCode->data.u64.Step != 0) {\r |
| 1127 | //OneOf MinMaxStep Data is set, Val value will be checked for MinMaxStep.\r |
| 1128 | switch (_GET_CURRQEST_DATATYPE()) {\r |
| 1129 | case EFI_IFR_TYPE_NUM_SIZE_64:\r |
| 1130 | if (Val.u64 < TempOneOfCode->data.u64.MinValue || Val.u64 > TempOneOfCode->data.u64.MaxValue) {\r |
| 1131 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r |
| 1132 | }\r |
| 1133 | break;\r |
| 1134 | case EFI_IFR_TYPE_NUM_SIZE_32:\r |
| 1135 | if (Val.u32 < TempOneOfCode->data.u32.MinValue || Val.u32 > TempOneOfCode->data.u32.MaxValue) {\r |
| 1136 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r |
| 1137 | }\r |
| 1138 | break;\r |
| 1139 | case EFI_IFR_TYPE_NUM_SIZE_16:\r |
| 1140 | if (Val.u16 < TempOneOfCode->data.u16.MinValue || Val.u16 > TempOneOfCode->data.u16.MaxValue) {\r |
| 1141 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r |
| 1142 | }\r |
| 1143 | break;\r |
| 1144 | case EFI_IFR_TYPE_NUM_SIZE_8:\r |
| 1145 | if (Val.u8 < TempOneOfCode->data.u8.MinValue || Val.u8 > TempOneOfCode->data.u8.MaxValue) {\r |
| 1146 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "OneOf default value must be between MinValue and MaxValue.");\r |
| 1147 | }\r |
| 1148 | break;\r |
| 1149 | }\r |
| 1150 | }\r |
| 1151 | break;\r |
| 1152 | }\r |
| 1153 | }\r |
| 1154 | DObj.SetType (_GET_CURRQEST_DATATYPE()); \r |
| 1155 | DObj.SetValue(Val);\r |
| 1156 | >>\r |
| 1157 | )\r |
| 1158 | {\r |
| 1159 | DefaultStore "=" SN:StringIdentifier "," << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r |
| 1160 | }\r |
| 1161 | <<\r |
| 1162 | _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r |
| 1163 | _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());\r |
| 1164 | if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r |
| 1165 | _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r |
| 1166 | DefaultId,\r |
| 1167 | _GET_CURRQEST_VARTINFO(),\r |
| 1168 | VarStoreName,\r |
| 1169 | _GET_CURRQEST_DATATYPE (),\r |
| 1170 | Val),\r |
| 1171 | D->getLine()\r |
| 1172 | );\r |
| 1173 | }\r |
| 1174 | >>\r |
| 1175 | )\r |
| 1176 | ;\r |
| 1177 | \r |
| 1178 | vfrStatementStat :\r |
| 1179 | vfrStatementSubTitle |\r |
| 1180 | vfrStatementStaticText |\r |
| 1181 | vfrStatementCrossReference\r |
| 1182 | ;\r |
| 1183 | \r |
| 1184 | vfrStatementQuestions :\r |
| 1185 | vfrStatementBooleanType |\r |
| 1186 | vfrStatementDate |\r |
| 1187 | vfrStatementNumericType |\r |
| 1188 | vfrStatementStringType |\r |
| 1189 | vfrStatementOrderedList |\r |
| 1190 | vfrStatementTime\r |
| 1191 | ;\r |
| 1192 | \r |
| 1193 | vfrStatementConditional :\r |
| 1194 | vfrStatementDisableIfStat |\r |
| 1195 | vfrStatementSuppressIfStat | //enhance to be compatible for framework endif\r |
| 1196 | vfrStatementGrayOutIfStat |\r |
| 1197 | vfrStatementInconsistentIfStat //to be compatible for framework\r |
| 1198 | ;\r |
| 1199 | \r |
| 1200 | vfrStatementConditionalNew :\r |
| 1201 | vfrStatementDisableIfStat |\r |
| 1202 | vfrStatementSuppressIfStatNew |\r |
| 1203 | vfrStatementGrayOutIfStatNew |\r |
| 1204 | vfrStatementInconsistentIfStat //to be compatible for framework\r |
| 1205 | ;\r |
| 1206 | \r |
| 1207 | vfrStatementSuppressIfStat :\r |
| 1208 | <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r |
| 1209 | | vfrStatementSuppressIfStatNew\r |
| 1210 | ;\r |
| 1211 | \r |
| 1212 | vfrStatementGrayOutIfStat :\r |
| 1213 | <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r |
| 1214 | | vfrStatementGrayOutIfStatNew\r |
| 1215 | ;\r |
| 1216 | \r |
| 1217 | vfrStatementInvalid :\r |
| 1218 | (\r |
| 1219 | vfrStatementInvalidHidden |\r |
| 1220 | vfrStatementInvalidInventory |\r |
| 1221 | vfrStatementInvalidSaveRestoreDefaults\r |
| 1222 | )\r |
| 1223 | << _CRT_OP (TRUE); >>\r |
| 1224 | ;\r |
| 1225 | \r |
| 1226 | flagsField :\r |
| 1227 | Number | InteractiveFlag | ManufacturingFlag | DefaultFlag |\r |
| 1228 | NVAccessFlag | ResetRequiredFlag | LateCheckFlag\r |
| 1229 | ;\r |
| 1230 | \r |
| 1231 | vfrStatementValue :\r |
| 1232 | << CIfrValue VObj; >>\r |
| 1233 | V:Value << VObj.SetLineNo(V->getLine()); >>\r |
| 1234 | "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r |
| 1235 | ;\r |
| 1236 | \r |
| 1237 | vfrStatementSubTitle :\r |
| 1238 | << CIfrSubtitle SObj; >>\r |
| 1239 | L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r |
| 1240 | Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText())); >>\r |
| 1241 | {\r |
| 1242 | "," FLAGS "=" vfrSubtitleFlags[SObj]\r |
| 1243 | }\r |
| 1244 | { vfrStatementStatTagList "," }\r |
| 1245 | E:";" << CRT_END_OP (E); >>\r |
| 1246 | ;\r |
| 1247 | \r |
| 1248 | vfrSubtitleFlags [CIfrSubtitle & SObj] :\r |
| 1249 | << UINT8 LFlags = 0; >>\r |
| 1250 | subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r |
| 1251 | << _PCATCH(SObj.SetFlags (LFlags)); >>\r |
| 1252 | ;\r |
| 1253 | \r |
| 1254 | subtitleFlagsField [UINT8 & Flags] :\r |
| 1255 | N:Number << $Flags |= _STOU8(N->getText()); >>\r |
| 1256 | | "HORIZONTAL" << $Flags |= 0x01; >>\r |
| 1257 | ;\r |
| 1258 | \r |
| 1259 | vfrStatementStaticText :\r |
| 1260 | <<\r |
| 1261 | UINT8 Flags = 0;\r |
| 1262 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 1263 | EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;\r |
| 1264 | >>\r |
| 1265 | T:Text\r |
| 1266 | Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r |
| 1267 | Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r |
| 1268 | {\r |
| 1269 | "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText()); >>\r |
| 1270 | }\r |
| 1271 | {\r |
| 1272 | "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r |
| 1273 | "," Key "=" KN:Number\r |
| 1274 | }\r |
| 1275 | <<\r |
| 1276 | if (Flags & EFI_IFR_FLAG_CALLBACK) {\r |
| 1277 | CIfrAction AObj;\r |
| 1278 | mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r |
| 1279 | AObj.SetLineNo (F->getLine());\r |
| 1280 | AObj.SetQuestionId (QId);\r |
| 1281 | AObj.SetPrompt (_STOSID(S2->getText()));\r |
| 1282 | AObj.SetHelp (_STOSID(S1->getText()));\r |
| 1283 | _PCATCH(AObj.SetFlags (Flags), F->getLine());\r |
| 1284 | AssignQuestionKey (AObj, KN);\r |
| 1285 | CRT_END_OP (KN);\r |
| 1286 | } else {\r |
| 1287 | CIfrText TObj;\r |
| 1288 | TObj.SetLineNo (T->getLine());\r |
| 1289 | TObj.SetHelp (_STOSID(S1->getText()));\r |
| 1290 | TObj.SetPrompt (_STOSID(S2->getText()));\r |
| 1291 | TObj.SetTextTwo (TxtTwo);\r |
| 1292 | }\r |
| 1293 | >>\r |
| 1294 | { "," vfrStatementStatTagList }\r |
| 1295 | ";"\r |
| 1296 | ;\r |
| 1297 | \r |
| 1298 | staticTextFlagsField[UINT8 & HFlags] :\r |
| 1299 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1300 | | questionheaderFlagsField[HFlags]\r |
| 1301 | ;\r |
| 1302 | \r |
| 1303 | vfrStatementCrossReference :\r |
| 1304 | vfrStatementGoto |\r |
| 1305 | vfrStatementResetButton\r |
| 1306 | ;\r |
| 1307 | \r |
| 1308 | vfrStatementGoto :\r |
| 1309 | <<\r |
| 1310 | UINT8 RefType = 1;\r |
| 1311 | EFI_STRING_ID DevPath;\r |
| 1312 | EFI_GUID FSId;\r |
| 1313 | EFI_FORM_ID FId;\r |
| 1314 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 1315 | UINT32 BitMask;\r |
| 1316 | CIfrQuestionHeader *QHObj = NULL;\r |
| 1317 | CIfrRef *R1Obj = NULL;\r |
| 1318 | CIfrRef2 *R2Obj = NULL;\r |
| 1319 | CIfrRef3 *R3Obj = NULL;\r |
| 1320 | CIfrRef4 *R4Obj = NULL;\r |
| 1321 | >>\r |
| 1322 | G:Goto\r |
| 1323 | (\r |
| 1324 | (\r |
| 1325 | DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r |
| 1326 | FormSetGuid "=" guidDefinition[FSId] ","\r |
| 1327 | FormId "=" F1:Number ","\r |
| 1328 | Question "=" QN1:Number ","\r |
| 1329 | <<\r |
| 1330 | RefType = 4;\r |
| 1331 | DevPath = _STOSID(P->getText());\r |
| 1332 | FId = _STOFID(F1->getText());\r |
| 1333 | QId = _STOQID(QN1->getText());\r |
| 1334 | >>\r |
| 1335 | )\r |
| 1336 | |\r |
| 1337 | (\r |
| 1338 | FormSetGuid "=" guidDefinition[FSId] ","\r |
| 1339 | FormId "=" F2:Number ","\r |
| 1340 | Question "=" QN2:Number ","\r |
| 1341 | <<\r |
| 1342 | RefType = 3;\r |
| 1343 | FId = _STOFID(F2->getText());\r |
| 1344 | QId = _STOQID(QN2->getText());\r |
| 1345 | >>\r |
| 1346 | )\r |
| 1347 | |\r |
| 1348 | (\r |
| 1349 | FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText()); >>\r |
| 1350 | Question "="\r |
| 1351 | (\r |
| 1352 | QN3:StringIdentifier "," << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>\r |
| 1353 | | QN4:Number "," << QId = _STOQID(QN4->getText()); >>\r |
| 1354 | )\r |
| 1355 | )\r |
| 1356 | |\r |
| 1357 | (\r |
| 1358 | F4:Number "," <<\r |
| 1359 | RefType = 1;\r |
| 1360 | FId = _STOFID(F4->getText());\r |
| 1361 | >>\r |
| 1362 | )\r |
| 1363 | )\r |
| 1364 | <<\r |
| 1365 | switch (RefType) {\r |
| 1366 | case 4:\r |
| 1367 | {\r |
| 1368 | R4Obj = new CIfrRef4;\r |
| 1369 | QHObj = R4Obj;\r |
| 1370 | R4Obj->SetLineNo(G->getLine());\r |
| 1371 | R4Obj->SetDevicePath (DevPath);\r |
| 1372 | R4Obj->SetFormSetId (FSId);\r |
| 1373 | R4Obj->SetFormId (FId);\r |
| 1374 | R4Obj->SetQuestionId (QId);\r |
| 1375 | break;\r |
| 1376 | }\r |
| 1377 | case 3:\r |
| 1378 | {\r |
| 1379 | R3Obj = new CIfrRef3;\r |
| 1380 | QHObj = R3Obj;\r |
| 1381 | R3Obj->SetLineNo(G->getLine());\r |
| 1382 | R3Obj->SetFormSetId (FSId);\r |
| 1383 | R3Obj->SetFormId (FId);\r |
| 1384 | R3Obj->SetQuestionId (QId);\r |
| 1385 | break;\r |
| 1386 | }\r |
| 1387 | case 2:\r |
| 1388 | {\r |
| 1389 | R2Obj = new CIfrRef2;\r |
| 1390 | QHObj = R2Obj;\r |
| 1391 | R2Obj->SetLineNo(G->getLine());\r |
| 1392 | R2Obj->SetFormId (FId);\r |
| 1393 | _PCATCH(R2Obj->SetQuestionId (QId), QN3);\r |
| 1394 | break;\r |
| 1395 | }\r |
| 1396 | case 1:\r |
| 1397 | {\r |
| 1398 | R1Obj = new CIfrRef;\r |
| 1399 | QHObj = R1Obj;\r |
| 1400 | R1Obj->SetLineNo(G->getLine());\r |
| 1401 | R1Obj->SetFormId (FId);\r |
| 1402 | break;\r |
| 1403 | }\r |
| 1404 | default: break;\r |
| 1405 | }\r |
| 1406 | >>\r |
| 1407 | vfrQuestionHeaderWithNoStorage[QHObj]\r |
| 1408 | { "," vfrStatementStatTagList }\r |
| 1409 | { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r |
| 1410 | {\r |
| 1411 | "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r |
| 1412 | }\r |
| 1413 | ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} >>\r |
| 1414 | ;\r |
| 1415 | \r |
| 1416 | vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r |
| 1417 | << UINT8 HFlags = 0; >>\r |
| 1418 | gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r |
| 1419 | << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r |
| 1420 | ;\r |
| 1421 | \r |
| 1422 | gotoFlagsField[UINT8 & HFlags] :\r |
| 1423 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1424 | | questionheaderFlagsField[HFlags]\r |
| 1425 | ;\r |
| 1426 | \r |
| 1427 | getStringId :\r |
| 1428 | "STRING_TOKEN" "\("\r |
| 1429 | IdVal:Number\r |
| 1430 | "\)"\r |
| 1431 | ;\r |
| 1432 | \r |
| 1433 | vfrStatementResetButton :\r |
| 1434 | <<\r |
| 1435 | CIfrResetButton RBObj;\r |
| 1436 | UINT16 DefaultId;\r |
| 1437 | >>\r |
| 1438 | L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r |
| 1439 | DefaultStore\r |
| 1440 | "=" N:StringIdentifier "," <<\r |
| 1441 | _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r |
| 1442 | RBObj.SetDefaultId (DefaultId);\r |
| 1443 | >>\r |
| 1444 | vfrStatementHeader[&RBObj] ","\r |
| 1445 | { vfrStatementStatTagList "," }\r |
| 1446 | E:EndResetButton << CRT_END_OP (E); >>\r |
| 1447 | ";"\r |
| 1448 | ;\r |
| 1449 | \r |
| 1450 | vfrStatementBooleanType :\r |
| 1451 | vfrStatementCheckBox |\r |
| 1452 | vfrStatementAction\r |
| 1453 | ;\r |
| 1454 | \r |
| 1455 | //*****************************************************\r |
| 1456 | // Syntax of checkbox\r |
| 1457 | //\r |
| 1458 | // Example:\r |
| 1459 | // checkbox\r |
| 1460 | // varid = MySTestData.mField1,\r |
| 1461 | // prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r |
| 1462 | // help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r |
| 1463 | // flags = CHECKBOX_DEFAULT | CALLBACK,\r |
| 1464 | // default value = TRUE, defaultstore = MyDefaultStore,\r |
| 1465 | // endcheckbox;\r |
| 1466 | //\r |
| 1467 | vfrStatementCheckBox :\r |
| 1468 | <<\r |
| 1469 | CIfrCheckBox CBObj;\r |
| 1470 | EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r |
| 1471 | CHAR8 *VarStoreName = NULL;\r |
| 1472 | UINT32 DataTypeSize;\r |
| 1473 | >>\r |
| 1474 | L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r |
| 1475 | vfrQuestionHeader[CBObj] "," << //check data type\r |
| 1476 | _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r |
| 1477 | if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r |
| 1478 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r |
| 1479 | } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r |
| 1480 | (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r |
| 1481 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r |
| 1482 | }\r |
| 1483 | >>\r |
| 1484 | {\r |
| 1485 | F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r |
| 1486 | <<\r |
| 1487 | _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r |
| 1488 | Val.b = TRUE;\r |
| 1489 | if (CBObj.GetFlags () & 0x01) {\r |
| 1490 | _PCATCH(\r |
| 1491 | mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r |
| 1492 | EFI_HII_DEFAULT_CLASS_STANDARD,\r |
| 1493 | _GET_CURRQEST_VARTINFO(),\r |
| 1494 | VarStoreName,\r |
| 1495 | _GET_CURRQEST_DATATYPE (),\r |
| 1496 | Val\r |
| 1497 | ),\r |
| 1498 | VFR_RETURN_SUCCESS,\r |
| 1499 | L,\r |
| 1500 | "No standard default storage found"\r |
| 1501 | );\r |
| 1502 | }\r |
| 1503 | if (CBObj.GetFlags () & 0x02) {\r |
| 1504 | _PCATCH(\r |
| 1505 | mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r |
| 1506 | EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r |
| 1507 | _GET_CURRQEST_VARTINFO(),\r |
| 1508 | VarStoreName,\r |
| 1509 | _GET_CURRQEST_DATATYPE (),\r |
| 1510 | Val\r |
| 1511 | ),\r |
| 1512 | VFR_RETURN_SUCCESS,\r |
| 1513 | L,\r |
| 1514 | "No manufacturing default storage found"\r |
| 1515 | );\r |
| 1516 | }\r |
| 1517 | >>\r |
| 1518 | }\r |
| 1519 | {\r |
| 1520 | Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r |
| 1521 | }\r |
| 1522 | vfrStatementQuestionOptionList\r |
| 1523 | E:EndCheckBox << CRT_END_OP (E); >>\r |
| 1524 | ";"\r |
| 1525 | ;\r |
| 1526 | \r |
| 1527 | vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r |
| 1528 | <<\r |
| 1529 | UINT8 LFlags = 0;\r |
| 1530 | UINT8 HFlags = 0;\r |
| 1531 | >>\r |
| 1532 | checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r |
| 1533 | << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r |
| 1534 | ;\r |
| 1535 | \r |
| 1536 | checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r |
| 1537 | N:Number <<\r |
| 1538 | if (mCompatibleMode) {\r |
| 1539 | //\r |
| 1540 | // set question flag\r |
| 1541 | //\r |
| 1542 | $LFlags |= _STOU8(N->getText());\r |
| 1543 | } else {\r |
| 1544 | _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r |
| 1545 | }\r |
| 1546 | >>\r |
| 1547 | | D:"DEFAULT" <<\r |
| 1548 | if (mCompatibleMode) {\r |
| 1549 | //\r |
| 1550 | // set question Default flag\r |
| 1551 | //\r |
| 1552 | $LFlags |= 0x01;\r |
| 1553 | } else {\r |
| 1554 | _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r |
| 1555 | }\r |
| 1556 | >>\r |
| 1557 | | M:"MANUFACTURING" <<\r |
| 1558 | if (mCompatibleMode) {\r |
| 1559 | //\r |
| 1560 | // set question MFG flag\r |
| 1561 | //\r |
| 1562 | $LFlags |= 0x02;\r |
| 1563 | } else {\r |
| 1564 | _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r |
| 1565 | }\r |
| 1566 | >>\r |
| 1567 | | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r |
| 1568 | | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r |
| 1569 | | questionheaderFlagsField[HFlags]\r |
| 1570 | ;\r |
| 1571 | \r |
| 1572 | //*****************************************************\r |
| 1573 | // Syntax of action\r |
| 1574 | //\r |
| 1575 | // Example:\r |
| 1576 | // action\r |
| 1577 | // prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r |
| 1578 | // help = STRING_TOKEN(STR_ACTION_HELP),\r |
| 1579 | // flags = CALLBACK,\r |
| 1580 | // config = STRING_TOKEN(STR_ACTION_CONFIG),\r |
| 1581 | // endaction;\r |
| 1582 | //\r |
| 1583 | vfrStatementAction :\r |
| 1584 | << CIfrAction AObj; >>\r |
| 1585 | L:Action << AObj.SetLineNo(L->getLine()); >>\r |
| 1586 | vfrQuestionHeaderWithNoStorage[&AObj] ","\r |
| 1587 | { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r |
| 1588 | Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText())); >>\r |
| 1589 | vfrStatementQuestionTagList\r |
| 1590 | E:EndAction << CRT_END_OP (E); >>\r |
| 1591 | ";"\r |
| 1592 | ;\r |
| 1593 | \r |
| 1594 | vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r |
| 1595 | << UINT8 HFlags = 0; >>\r |
| 1596 | actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r |
| 1597 | << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r |
| 1598 | ;\r |
| 1599 | \r |
| 1600 | actionFlagsField[UINT8 & HFlags] :\r |
| 1601 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1602 | | questionheaderFlagsField[HFlags]\r |
| 1603 | ;\r |
| 1604 | \r |
| 1605 | vfrStatementDate :\r |
| 1606 | <<\r |
| 1607 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 1608 | CHAR8 *VarIdStr[3] = {NULL, };\r |
| 1609 | CIfrDate DObj;\r |
| 1610 | EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r |
| 1611 | >>\r |
| 1612 | L:Date << DObj.SetLineNo(L->getLine()); >>\r |
| 1613 | (\r |
| 1614 | (\r |
| 1615 | vfrQuestionHeader[DObj, QUESTION_DATE] ","\r |
| 1616 | { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r |
| 1617 | vfrStatementQuestionOptionList\r |
| 1618 | )\r |
| 1619 | |\r |
| 1620 | (\r |
| 1621 | Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r |
| 1622 | << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r |
| 1623 | Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r |
| 1624 | Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r |
| 1625 | minMaxDateStepDefault[Val.date, 0]\r |
| 1626 | \r |
| 1627 | Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r |
| 1628 | << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r |
| 1629 | Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r |
| 1630 | Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r |
| 1631 | minMaxDateStepDefault[Val.date, 1]\r |
| 1632 | \r |
| 1633 | Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r |
| 1634 | << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r |
| 1635 | Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r |
| 1636 | Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r |
| 1637 | minMaxDateStepDefault[Val.date, 2]\r |
| 1638 | <<\r |
| 1639 | mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r |
| 1640 | DObj.SetQuestionId (QId);\r |
| 1641 | DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r |
| 1642 | DObj.SetPrompt (_STOSID(YP->getText()));\r |
| 1643 | DObj.SetHelp (_STOSID(YH->getText()));\r |
| 1644 | if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r |
| 1645 | >>\r |
| 1646 | << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r |
| 1647 | )\r |
| 1648 | ( vfrStatementInconsistentIf )*\r |
| 1649 | )\r |
| 1650 | E:EndDate << CRT_END_OP (E); >>\r |
| 1651 | ";"\r |
| 1652 | ;\r |
| 1653 | \r |
| 1654 | minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r |
| 1655 | Minimum "=" MinN:Number ","\r |
| 1656 | Maximum "=" MaxN:Number ","\r |
| 1657 | { "step" "=" Number "," }\r |
| 1658 | {\r |
| 1659 | "default" "=" N:Number "," <<\r |
| 1660 | switch (KeyValue) {\r |
| 1661 | case 0: \r |
| 1662 | D.Year = _STOU16(N->getText());\r |
| 1663 | if (D.Year < _STOU16 (MinN->getText()) || D.Year > _STOU16 (MaxN->getText())) {\r |
| 1664 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r |
| 1665 | }\r |
| 1666 | break;\r |
| 1667 | case 1: \r |
| 1668 | D.Month = _STOU8(N->getText()); \r |
| 1669 | if (D.Month < 1 || D.Month > 12) {\r |
| 1670 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r |
| 1671 | }\r |
| 1672 | break;\r |
| 1673 | case 2: \r |
| 1674 | D.Day = _STOU8(N->getText()); \r |
| 1675 | if (D.Day < 1 || D.Day > 31) {\r |
| 1676 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r |
| 1677 | }\r |
| 1678 | break;\r |
| 1679 | }\r |
| 1680 | >>\r |
| 1681 | }\r |
| 1682 | ;\r |
| 1683 | \r |
| 1684 | vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r |
| 1685 | << UINT8 LFlags = 0; >>\r |
| 1686 | dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r |
| 1687 | << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r |
| 1688 | ;\r |
| 1689 | \r |
| 1690 | dateFlagsField [UINT8 & Flags] :\r |
| 1691 | N:Number << $Flags |= _STOU8(N->getText()); >>\r |
| 1692 | | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r |
| 1693 | | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r |
| 1694 | | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r |
| 1695 | | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r |
| 1696 | | "STORAGE_TIME" << $Flags |= 0x10; >>\r |
| 1697 | | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r |
| 1698 | ;\r |
| 1699 | \r |
| 1700 | vfrStatementNumericType :\r |
| 1701 | vfrStatementNumeric |\r |
| 1702 | vfrStatementOneOf\r |
| 1703 | ;\r |
| 1704 | \r |
| 1705 | vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r |
| 1706 | <<\r |
| 1707 | UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r |
| 1708 | UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r |
| 1709 | UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r |
| 1710 | UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r |
| 1711 | >>\r |
| 1712 | Minimum "=" I:Number ","\r |
| 1713 | <<\r |
| 1714 | switch (_GET_CURRQEST_DATATYPE ()) {\r |
| 1715 | case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r |
| 1716 | case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r |
| 1717 | case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r |
| 1718 | case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText()); break;\r |
| 1719 | }\r |
| 1720 | >>\r |
| 1721 | Maximum "=" A:Number ","\r |
| 1722 | <<\r |
| 1723 | switch (_GET_CURRQEST_DATATYPE ()) {\r |
| 1724 | case EFI_IFR_TYPE_NUM_SIZE_64 : \r |
| 1725 | MaxU8 = _STOU64(A->getText()); \r |
| 1726 | if (MaxU8 < MinU8) {\r |
| 1727 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r |
| 1728 | }\r |
| 1729 | break;\r |
| 1730 | case EFI_IFR_TYPE_NUM_SIZE_32 : \r |
| 1731 | MaxU4 = _STOU32(A->getText()); \r |
| 1732 | if (MaxU4 < MinU4) {\r |
| 1733 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r |
| 1734 | }\r |
| 1735 | break;\r |
| 1736 | case EFI_IFR_TYPE_NUM_SIZE_16 : \r |
| 1737 | MaxU2 = _STOU16(A->getText()); \r |
| 1738 | if (MaxU2 < MinU2) {\r |
| 1739 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r |
| 1740 | }\r |
| 1741 | break;\r |
| 1742 | case EFI_IFR_TYPE_NUM_SIZE_8 : \r |
| 1743 | MaxU1 = _STOU8(A->getText()); \r |
| 1744 | if (MaxU1 < MinU1) {\r |
| 1745 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r |
| 1746 | }\r |
| 1747 | break;\r |
| 1748 | }\r |
| 1749 | >>\r |
| 1750 | {\r |
| 1751 | STEP "=" S:Number ","\r |
| 1752 | <<\r |
| 1753 | switch (_GET_CURRQEST_DATATYPE ()) {\r |
| 1754 | case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r |
| 1755 | case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r |
| 1756 | case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r |
| 1757 | case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText()); break;\r |
| 1758 | }\r |
| 1759 | >>\r |
| 1760 | }\r |
| 1761 | <<\r |
| 1762 | switch (_GET_CURRQEST_DATATYPE ()) {\r |
| 1763 | case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r |
| 1764 | case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r |
| 1765 | case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r |
| 1766 | case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r |
| 1767 | }\r |
| 1768 | >>\r |
| 1769 | ;\r |
| 1770 | \r |
| 1771 | vfrStatementNumeric :\r |
| 1772 | <<\r |
| 1773 | CIfrNumeric NObj;\r |
| 1774 | UINT32 DataTypeSize;\r |
| 1775 | >>\r |
| 1776 | L:Numeric << NObj.SetLineNo(L->getLine()); >>\r |
| 1777 | vfrQuestionHeader[NObj] "," << // check data type\r |
| 1778 | _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r |
| 1779 | if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r |
| 1780 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r |
| 1781 | }\r |
| 1782 | _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r |
| 1783 | >>\r |
| 1784 | { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r |
| 1785 | {\r |
| 1786 | Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r |
| 1787 | }\r |
| 1788 | vfrSetMinMaxStep[NObj]\r |
| 1789 | vfrStatementQuestionOptionList\r |
| 1790 | E:EndNumeric << CRT_END_OP (E); >>\r |
| 1791 | ";"\r |
| 1792 | ;\r |
| 1793 | \r |
| 1794 | vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r |
| 1795 | <<\r |
| 1796 | UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r |
| 1797 | UINT8 HFlags = 0;\r |
| 1798 | >>\r |
| 1799 | numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r |
| 1800 | << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r |
| 1801 | ;\r |
| 1802 | \r |
| 1803 | numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r |
| 1804 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1805 | | "DISPLAY_INT_DEC" << $LFlags |= 0x00; >>\r |
| 1806 | | "DISPLAY_UINT_DEC" << $LFlags |= 0x10; >>\r |
| 1807 | | "DISPLAY_UINT_HEX" << $LFlags |= 0x20; >>\r |
| 1808 | | questionheaderFlagsField[HFlags]\r |
| 1809 | ;\r |
| 1810 | \r |
| 1811 | vfrStatementOneOf :\r |
| 1812 | <<\r |
| 1813 | CIfrOneOf OObj;\r |
| 1814 | UINT32 DataTypeSize;\r |
| 1815 | >>\r |
| 1816 | L:OneOf << OObj.SetLineNo(L->getLine()); >>\r |
| 1817 | vfrQuestionHeader[OObj] "," << //check data type\r |
| 1818 | _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r |
| 1819 | if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r |
| 1820 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r |
| 1821 | }\r |
| 1822 | _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r |
| 1823 | >>\r |
| 1824 | { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r |
| 1825 | {\r |
| 1826 | vfrSetMinMaxStep[OObj]\r |
| 1827 | }\r |
| 1828 | vfrStatementQuestionOptionList\r |
| 1829 | E:EndOneOf << CRT_END_OP (E); >>\r |
| 1830 | ";"\r |
| 1831 | ;\r |
| 1832 | \r |
| 1833 | vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r |
| 1834 | <<\r |
| 1835 | UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r |
| 1836 | UINT8 HFlags = 0;\r |
| 1837 | >>\r |
| 1838 | numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r |
| 1839 | << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r |
| 1840 | ;\r |
| 1841 | \r |
| 1842 | vfrStatementStringType :\r |
| 1843 | vfrStatementString |\r |
| 1844 | vfrStatementPassword\r |
| 1845 | ;\r |
| 1846 | \r |
| 1847 | vfrStatementString :\r |
| 1848 | <<\r |
| 1849 | CIfrString SObj;\r |
| 1850 | >>\r |
| 1851 | L:String << SObj.SetLineNo(L->getLine()); >>\r |
| 1852 | vfrQuestionHeader[SObj] ","\r |
| 1853 | { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r |
| 1854 | {\r |
| 1855 | Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r |
| 1856 | }\r |
| 1857 | MinSize "=" MIN:Number "," << SObj.SetMinSize (_STOU8(MIN->getText())); >>\r |
| 1858 | MaxSize "=" MAX:Number "," << SObj.SetMaxSize (_STOU8(MAX->getText())); >>\r |
| 1859 | vfrStatementQuestionOptionList\r |
| 1860 | E:EndString << CRT_END_OP (E); >>\r |
| 1861 | ";"\r |
| 1862 | ;\r |
| 1863 | \r |
| 1864 | vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r |
| 1865 | <<\r |
| 1866 | UINT8 LFlags = 0;\r |
| 1867 | UINT8 HFlags = 0;\r |
| 1868 | >>\r |
| 1869 | stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r |
| 1870 | << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r |
| 1871 | ;\r |
| 1872 | \r |
| 1873 | stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r |
| 1874 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1875 | | "MULTI_LINE" << $LFlags = 0x01; >>\r |
| 1876 | | questionheaderFlagsField[HFlags]\r |
| 1877 | ;\r |
| 1878 | \r |
| 1879 | vfrStatementPassword :\r |
| 1880 | <<\r |
| 1881 | CIfrPassword PObj;\r |
| 1882 | >>\r |
| 1883 | L:Password << PObj.SetLineNo(L->getLine()); >>\r |
| 1884 | vfrQuestionHeader[PObj] ","\r |
| 1885 | { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r |
| 1886 | {\r |
| 1887 | Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r |
| 1888 | }\r |
| 1889 | MinSize "=" MIN:Number "," << PObj.SetMinSize (_STOU16(MIN->getText())); >>\r |
| 1890 | MaxSize "=" MAX:Number "," << PObj.SetMaxSize (_STOU16(MAX->getText())); >>\r |
| 1891 | { Encoding "=" Number "," }\r |
| 1892 | vfrStatementQuestionOptionList\r |
| 1893 | E:EndPassword << CRT_END_OP (E); >>\r |
| 1894 | ";"\r |
| 1895 | ;\r |
| 1896 | \r |
| 1897 | vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r |
| 1898 | << UINT8 HFlags = 0; >>\r |
| 1899 | passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r |
| 1900 | << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r |
| 1901 | ;\r |
| 1902 | \r |
| 1903 | passwordFlagsField [UINT8 & HFlags] :\r |
| 1904 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1905 | | questionheaderFlagsField[HFlags]\r |
| 1906 | ;\r |
| 1907 | \r |
| 1908 | vfrStatementOrderedList :\r |
| 1909 | <<\r |
| 1910 | CIfrOrderedList OLObj;\r |
| 1911 | >>\r |
| 1912 | L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r |
| 1913 | vfrQuestionHeader[OLObj] ","\r |
| 1914 | << OLObj.SetMaxContainers ((UINT8) _GET_CURRQEST_ARRAY_SIZE()); >>\r |
| 1915 | {\r |
| 1916 | MaxContainers "=" M:Number "," << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r |
| 1917 | }\r |
| 1918 | { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r |
| 1919 | vfrStatementQuestionOptionList\r |
| 1920 | E:EndList << CRT_END_OP (E); >>\r |
| 1921 | ";"\r |
| 1922 | ;\r |
| 1923 | \r |
| 1924 | vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r |
| 1925 | <<\r |
| 1926 | UINT8 HFlags = 0;\r |
| 1927 | UINT8 LFlags = 0;\r |
| 1928 | >>\r |
| 1929 | orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r |
| 1930 | << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r |
| 1931 | ;\r |
| 1932 | \r |
| 1933 | orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r |
| 1934 | N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r |
| 1935 | | "UNIQUE" << $LFlags |= 0x01; >>\r |
| 1936 | | "NOEMPTY" << $LFlags |= 0x02; >>\r |
| 1937 | | questionheaderFlagsField[HFlags]\r |
| 1938 | ;\r |
| 1939 | \r |
| 1940 | vfrStatementTime :\r |
| 1941 | <<\r |
| 1942 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 1943 | CHAR8 *VarIdStr[3] = {NULL, };\r |
| 1944 | CIfrTime TObj;\r |
| 1945 | EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r |
| 1946 | >>\r |
| 1947 | L:Time << TObj.SetLineNo(L->getLine()); >>\r |
| 1948 | (\r |
| 1949 | (\r |
| 1950 | vfrQuestionHeader[TObj, QUESTION_TIME] ","\r |
| 1951 | { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r |
| 1952 | vfrStatementDefault\r |
| 1953 | )\r |
| 1954 | |\r |
| 1955 | (\r |
| 1956 | Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r |
| 1957 | << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r |
| 1958 | Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r |
| 1959 | Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r |
| 1960 | minMaxTimeStepDefault[Val.time, 0]\r |
| 1961 | \r |
| 1962 | Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r |
| 1963 | << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r |
| 1964 | Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r |
| 1965 | Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r |
| 1966 | minMaxTimeStepDefault[Val.time, 1]\r |
| 1967 | \r |
| 1968 | Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r |
| 1969 | << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r |
| 1970 | Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r |
| 1971 | Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r |
| 1972 | minMaxTimeStepDefault[Val.time, 2]\r |
| 1973 | <<\r |
| 1974 | mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r |
| 1975 | TObj.SetQuestionId (QId);\r |
| 1976 | TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r |
| 1977 | TObj.SetPrompt (_STOSID(HP->getText()));\r |
| 1978 | TObj.SetHelp (_STOSID(HH->getText()));\r |
| 1979 | if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r |
| 1980 | >>\r |
| 1981 | << {CIfrDefault DefaultObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r |
| 1982 | )\r |
| 1983 | ( vfrStatementInconsistentIf )*\r |
| 1984 | )\r |
| 1985 | E:EndTime << CRT_END_OP (E); >>\r |
| 1986 | ";"\r |
| 1987 | ;\r |
| 1988 | \r |
| 1989 | minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r |
| 1990 | Minimum "=" Number ","\r |
| 1991 | Maximum "=" Number ","\r |
| 1992 | { "step" "=" Number "," }\r |
| 1993 | {\r |
| 1994 | "default" "=" N:Number "," <<\r |
| 1995 | switch (KeyValue) {\r |
| 1996 | case 0: \r |
| 1997 | T.Hour = _STOU8(N->getText()); \r |
| 1998 | if (T.Hour > 23) {\r |
| 1999 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r |
| 2000 | }\r |
| 2001 | break;\r |
| 2002 | case 1: \r |
| 2003 | T.Minute = _STOU8(N->getText()); \r |
| 2004 | if (T.Minute > 59) {\r |
| 2005 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r |
| 2006 | }\r |
| 2007 | break;\r |
| 2008 | case 2: \r |
| 2009 | T.Second = _STOU8(N->getText());\r |
| 2010 | if (T.Second > 59) {\r |
| 2011 | _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r |
| 2012 | }\r |
| 2013 | break;\r |
| 2014 | }\r |
| 2015 | >>\r |
| 2016 | }\r |
| 2017 | ;\r |
| 2018 | \r |
| 2019 | vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r |
| 2020 | << UINT8 LFlags = 0; >>\r |
| 2021 | timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r |
| 2022 | << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r |
| 2023 | ;\r |
| 2024 | \r |
| 2025 | timeFlagsField [UINT8 & Flags] :\r |
| 2026 | N:Number << $Flags |= _STOU8(N->getText()); >>\r |
| 2027 | | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r |
| 2028 | | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r |
| 2029 | | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r |
| 2030 | | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r |
| 2031 | | "STORAGE_TIME" << $Flags |= 0x10; >>\r |
| 2032 | | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r |
| 2033 | ;\r |
| 2034 | \r |
| 2035 | vfrStatementQuestionTag :\r |
| 2036 | vfrStatementStatTag "," |\r |
| 2037 | vfrStatementInconsistentIf |\r |
| 2038 | vfrStatementNoSubmitIf |\r |
| 2039 | vfrStatementDisableIfQuest |\r |
| 2040 | vfrStatementRefresh |\r |
| 2041 | vfrStatementVarstoreDevice\r |
| 2042 | ;\r |
| 2043 | \r |
| 2044 | vfrStatementQuestionTagList :\r |
| 2045 | ( vfrStatementQuestionTag )*\r |
| 2046 | ;\r |
| 2047 | \r |
| 2048 | vfrStatementQuestionOptionTag :\r |
| 2049 | vfrStatementSuppressIfQuest |\r |
| 2050 | vfrStatementGrayOutIfQuest |\r |
| 2051 | vfrStatementValue |\r |
| 2052 | vfrStatementDefault |\r |
| 2053 | vfrStatementOptions\r |
| 2054 | ;\r |
| 2055 | \r |
| 2056 | vfrStatementQuestionOptionList :\r |
| 2057 | (\r |
| 2058 | vfrStatementQuestionTag |\r |
| 2059 | vfrStatementQuestionOptionTag\r |
| 2060 | )*\r |
| 2061 | ;\r |
| 2062 | \r |
| 2063 | vfrStatementStatList :\r |
| 2064 | vfrStatementStat |\r |
| 2065 | vfrStatementQuestions |\r |
| 2066 | vfrStatementConditionalNew |\r |
| 2067 | vfrStatementLabel |\r |
| 2068 | // Just for framework vfr compatibility\r |
| 2069 | vfrStatementInvalid\r |
| 2070 | ;\r |
| 2071 | \r |
| 2072 | vfrStatementStatListOld :\r |
| 2073 | vfrStatementStat |\r |
| 2074 | vfrStatementQuestions |\r |
| 2075 | vfrStatementLabel |\r |
| 2076 | // Just for framework vfr compatibility\r |
| 2077 | vfrStatementInvalid\r |
| 2078 | ;\r |
| 2079 | \r |
| 2080 | vfrStatementDisableIfStat :\r |
| 2081 | << \r |
| 2082 | CIfrDisableIf DIObj; \r |
| 2083 | mConstantOnlyInExpression = TRUE;\r |
| 2084 | >>\r |
| 2085 | L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r |
| 2086 | vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r |
| 2087 | ( vfrStatementStatList )*\r |
| 2088 | E:EndIf << CRT_END_OP (E); >>\r |
| 2089 | ";"\r |
| 2090 | ;\r |
| 2091 | \r |
| 2092 | vfrStatementInconsistentIfStat :\r |
| 2093 | << CIfrInconsistentIf IIObj; >>\r |
| 2094 | L:InconsistentIf <<\r |
| 2095 | if (!mCompatibleMode) {\r |
| 2096 | _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r |
| 2097 | }\r |
| 2098 | IIObj.SetLineNo(L->getLine());\r |
| 2099 | >>\r |
| 2100 | Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText())); >>\r |
| 2101 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2102 | vfrStatementExpression[0]\r |
| 2103 | E:EndIf << CRT_END_OP (E); >>\r |
| 2104 | ";"\r |
| 2105 | ;\r |
| 2106 | \r |
| 2107 | //\r |
| 2108 | // Compatible for framework vfr file\r |
| 2109 | //\r |
| 2110 | vfrStatementgrayoutIfSuppressIf:\r |
| 2111 | << CIfrSuppressIf SIObj; >>\r |
| 2112 | L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r |
| 2113 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2114 | vfrStatementExpression[0]\r |
| 2115 | ";"\r |
| 2116 | ;\r |
| 2117 | \r |
| 2118 | vfrStatementsuppressIfGrayOutIf:\r |
| 2119 | << CIfrGrayOutIf GOIObj; >>\r |
| 2120 | L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r |
| 2121 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2122 | vfrStatementExpression[0]\r |
| 2123 | ";"\r |
| 2124 | ;\r |
| 2125 | \r |
| 2126 | vfrStatementSuppressIfStatNew :\r |
| 2127 | << CIfrSuppressIf SIObj;>>\r |
| 2128 | L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r |
| 2129 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2130 | vfrStatementExpression[0]\r |
| 2131 | ";"\r |
| 2132 | ( vfrStatementStatList )*\r |
| 2133 | E: EndIf ";" << CRT_END_OP (E); >>\r |
| 2134 | ;\r |
| 2135 | \r |
| 2136 | vfrStatementGrayOutIfStatNew :\r |
| 2137 | << CIfrGrayOutIf GOIObj;>>\r |
| 2138 | L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r |
| 2139 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2140 | vfrStatementExpression[0]\r |
| 2141 | ";"\r |
| 2142 | ( vfrStatementStatList )*\r |
| 2143 | E: EndIf ";" << CRT_END_OP (E); >>\r |
| 2144 | ;\r |
| 2145 | \r |
| 2146 | vfrStatementSuppressIfStatOld :\r |
| 2147 | <<\r |
| 2148 | CIfrSuppressIf SIObj;\r |
| 2149 | BOOLEAN GrayOutExist = FALSE;\r |
| 2150 | >>\r |
| 2151 | L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r |
| 2152 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2153 | vfrStatementExpression[0]\r |
| 2154 | ";"\r |
| 2155 | {\r |
| 2156 | vfrStatementsuppressIfGrayOutIf\r |
| 2157 | << GrayOutExist = TRUE; >>\r |
| 2158 | }\r |
| 2159 | ( vfrStatementStatListOld )*\r |
| 2160 | E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r |
| 2161 | ;\r |
| 2162 | \r |
| 2163 | vfrStatementGrayOutIfStatOld :\r |
| 2164 | <<\r |
| 2165 | CIfrGrayOutIf GOIObj;\r |
| 2166 | BOOLEAN SuppressExist = FALSE;\r |
| 2167 | >>\r |
| 2168 | L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r |
| 2169 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2170 | vfrStatementExpression[0]\r |
| 2171 | ";"\r |
| 2172 | {\r |
| 2173 | vfrStatementgrayoutIfSuppressIf\r |
| 2174 | << SuppressExist = TRUE; >>\r |
| 2175 | }\r |
| 2176 | ( vfrStatementStatListOld )*\r |
| 2177 | E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r |
| 2178 | ;\r |
| 2179 | \r |
| 2180 | vfrImageTag :\r |
| 2181 | << CIfrImage IObj; >>\r |
| 2182 | L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText())); IObj.SetLineNo(L->getLine()); >>\r |
| 2183 | ;\r |
| 2184 | \r |
| 2185 | vfrLockedTag :\r |
| 2186 | << CIfrLocked LObj; >>\r |
| 2187 | L:Locked << LObj.SetLineNo(L->getLine()); >>\r |
| 2188 | ;\r |
| 2189 | \r |
| 2190 | vfrStatementStatTag :\r |
| 2191 | vfrImageTag |\r |
| 2192 | vfrLockedTag\r |
| 2193 | ;\r |
| 2194 | \r |
| 2195 | vfrStatementStatTagList :\r |
| 2196 | vfrStatementStatTag ( "," vfrStatementStatTag )*\r |
| 2197 | ;\r |
| 2198 | \r |
| 2199 | vfrStatementImage :\r |
| 2200 | vfrImageTag\r |
| 2201 | ";"\r |
| 2202 | ;\r |
| 2203 | \r |
| 2204 | vfrStatementLocked :\r |
| 2205 | vfrLockedTag\r |
| 2206 | ";"\r |
| 2207 | ;\r |
| 2208 | \r |
| 2209 | vfrStatementInconsistentIf :\r |
| 2210 | << CIfrInconsistentIf IIObj; >>\r |
| 2211 | L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r |
| 2212 | Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText())); >>\r |
| 2213 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2214 | vfrStatementExpression[0]\r |
| 2215 | E:EndIf << CRT_END_OP (E); >>\r |
| 2216 | ;\r |
| 2217 | \r |
| 2218 | vfrStatementNoSubmitIf :\r |
| 2219 | << CIfrNoSubmitIf NSIObj; >>\r |
| 2220 | L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r |
| 2221 | Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText())); >>\r |
| 2222 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2223 | vfrStatementExpression[0]\r |
| 2224 | E:EndIf << CRT_END_OP (E); >>\r |
| 2225 | ;\r |
| 2226 | \r |
| 2227 | vfrStatementDisableIfQuest :\r |
| 2228 | << \r |
| 2229 | CIfrDisableIf DIObj; \r |
| 2230 | mConstantOnlyInExpression = TRUE;\r |
| 2231 | >>\r |
| 2232 | L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r |
| 2233 | vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r |
| 2234 | vfrStatementQuestionOptionList\r |
| 2235 | E:EndIf << CRT_END_OP (E); >>\r |
| 2236 | ;\r |
| 2237 | \r |
| 2238 | vfrStatementRefresh :\r |
| 2239 | << CIfrRefresh RObj; >>\r |
| 2240 | L:Refresh << RObj.SetLineNo(L->getLine()); >>\r |
| 2241 | Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText())); >>\r |
| 2242 | ;\r |
| 2243 | \r |
| 2244 | vfrStatementVarstoreDevice :\r |
| 2245 | << CIfrVarStoreDevice VDObj; >>\r |
| 2246 | L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r |
| 2247 | "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText())); >>\r |
| 2248 | ;\r |
| 2249 | \r |
| 2250 | vfrStatementSuppressIfQuest :\r |
| 2251 | << CIfrSuppressIf SIObj; >>\r |
| 2252 | L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r |
| 2253 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2254 | vfrStatementExpression[0] ";"\r |
| 2255 | vfrStatementQuestionOptionList\r |
| 2256 | E:EndIf << CRT_END_OP (E); >>\r |
| 2257 | ;\r |
| 2258 | \r |
| 2259 | vfrStatementGrayOutIfQuest :\r |
| 2260 | << CIfrGrayOutIf GOIObj; >>\r |
| 2261 | L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r |
| 2262 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2263 | vfrStatementExpression[0] ";"\r |
| 2264 | vfrStatementQuestionOptionList\r |
| 2265 | E:EndIf << CRT_END_OP (E); >>\r |
| 2266 | ;\r |
| 2267 | \r |
| 2268 | vfrStatementOptions :\r |
| 2269 | vfrStatementOneOfOption\r |
| 2270 | ;\r |
| 2271 | \r |
| 2272 | vfrStatementOneOfOption :\r |
| 2273 | <<\r |
| 2274 | EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r |
| 2275 | CIfrOneOfOption OOOObj;\r |
| 2276 | CHAR8 *VarStoreName = NULL;\r |
| 2277 | >>\r |
| 2278 | L:Option << OOOObj.SetLineNo(L->getLine()); >>\r |
| 2279 | Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText())); >>\r |
| 2280 | Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r |
| 2281 | F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r |
| 2282 | <<\r |
| 2283 | _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r |
| 2284 | if (OOOObj.GetFlags () & 0x10) {\r |
| 2285 | _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r |
| 2286 | EFI_HII_DEFAULT_CLASS_STANDARD,\r |
| 2287 | _GET_CURRQEST_VARTINFO(),\r |
| 2288 | VarStoreName,\r |
| 2289 | _GET_CURRQEST_DATATYPE (),\r |
| 2290 | Val\r |
| 2291 | ), L->getLine());\r |
| 2292 | }\r |
| 2293 | if (OOOObj.GetFlags () & 0x20) {\r |
| 2294 | _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r |
| 2295 | EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r |
| 2296 | _GET_CURRQEST_VARTINFO(),\r |
| 2297 | VarStoreName,\r |
| 2298 | _GET_CURRQEST_DATATYPE (),\r |
| 2299 | Val\r |
| 2300 | ), L->getLine());\r |
| 2301 | }\r |
| 2302 | >>\r |
| 2303 | {\r |
| 2304 | "," Key "=" KN:Number <<\r |
| 2305 | if (!mCompatibleMode) {\r |
| 2306 | _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r |
| 2307 | }\r |
| 2308 | //\r |
| 2309 | // Guid Option Key\r |
| 2310 | //\r |
| 2311 | CIfrOptionKey IfrOptionKey (\r |
| 2312 | gCurrentQuestion->QUESTION_ID(),\r |
| 2313 | Val,\r |
| 2314 | _STOQID(KN->getText())\r |
| 2315 | );\r |
| 2316 | SET_LINE_INFO (IfrOptionKey, KN);\r |
| 2317 | >>\r |
| 2318 | }\r |
| 2319 | (\r |
| 2320 | T:"," vfrImageTag << OOOObj.SetScope (1); CRT_END_OP (T); >>\r |
| 2321 | )*\r |
| 2322 | ";"\r |
| 2323 | ;\r |
| 2324 | \r |
| 2325 | vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r |
| 2326 | <<\r |
| 2327 | UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r |
| 2328 | UINT8 HFlags = 0;\r |
| 2329 | >>\r |
| 2330 | oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r |
| 2331 | << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r |
| 2332 | << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r |
| 2333 | ;\r |
| 2334 | \r |
| 2335 | oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r |
| 2336 | N:Number << $LFlags |= _STOU8(N->getText()); >>\r |
| 2337 | | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r |
| 2338 | | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r |
| 2339 | | InteractiveFlag << $HFlags |= 0x04; >>\r |
| 2340 | | NVAccessFlag << $HFlags |= 0x08; >>\r |
| 2341 | | ResetRequiredFlag << $HFlags |= 0x10; >>\r |
| 2342 | | LateCheckFlag << $HFlags |= 0x20; >>\r |
| 2343 | | ManufacturingFlag << $LFlags |= 0x20; >>\r |
| 2344 | | DefaultFlag << $LFlags |= 0x10; >>\r |
| 2345 | ;\r |
| 2346 | \r |
| 2347 | vfrStatementLabel :\r |
| 2348 | L:Label\r |
| 2349 | N:Number <<\r |
| 2350 | if (mCompatibleMode) {\r |
| 2351 | //\r |
| 2352 | // Add end Label for Framework Vfr\r |
| 2353 | //\r |
| 2354 | CIfrLabel LObj1;\r |
| 2355 | LObj1.SetLineNo(L->getLine());\r |
| 2356 | LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r |
| 2357 | }\r |
| 2358 | \r |
| 2359 | {\r |
| 2360 | CIfrLabel LObj2;\r |
| 2361 | LObj2.SetLineNo(L->getLine());\r |
| 2362 | LObj2.SetNumber (_STOU16(N->getText()));\r |
| 2363 | }\r |
| 2364 | >>\r |
| 2365 | ";"\r |
| 2366 | ;\r |
| 2367 | \r |
| 2368 | vfrStatementBanner :\r |
| 2369 | << CIfrBanner BObj; >>\r |
| 2370 | B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r |
| 2371 | Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText())); >>\r |
| 2372 | (\r |
| 2373 | (\r |
| 2374 | Line L:Number "," << BObj.SetLine (_STOU16(L->getText())); >>\r |
| 2375 | Align\r |
| 2376 | (\r |
| 2377 | Left << BObj.SetAlign (0); >>\r |
| 2378 | | Center << BObj.SetAlign (1); >>\r |
| 2379 | | Right << BObj.SetAlign (2); >>\r |
| 2380 | ) ";"\r |
| 2381 | )\r |
| 2382 | |\r |
| 2383 | (\r |
| 2384 | Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText()));} >>\r |
| 2385 | )\r |
| 2386 | )\r |
| 2387 | ;\r |
| 2388 | \r |
| 2389 | //******************************************************************************\r |
| 2390 | //\r |
| 2391 | // keep some syntax for compatibility but not generate any IFR object\r |
| 2392 | //\r |
| 2393 | vfrStatementInvalidHidden :\r |
| 2394 | L:Hidden <<\r |
| 2395 | if (!mCompatibleMode) {\r |
| 2396 | _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r |
| 2397 | }\r |
| 2398 | >>\r |
| 2399 | Value "=" Number ","\r |
| 2400 | Key "=" Number ";"\r |
| 2401 | ;\r |
| 2402 | \r |
| 2403 | vfrStatementInvalidInconsistentIf :\r |
| 2404 | InconsistentIf\r |
| 2405 | Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r |
| 2406 | { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r |
| 2407 | vfrStatementExpression[0]\r |
| 2408 | EndIf\r |
| 2409 | ";"\r |
| 2410 | ;\r |
| 2411 | \r |
| 2412 | vfrStatementInvalidInventory :\r |
| 2413 | L:Inventory <<\r |
| 2414 | if (!mCompatibleMode) {\r |
| 2415 | _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r |
| 2416 | }\r |
| 2417 | >>\r |
| 2418 | Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r |
| 2419 | Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r |
| 2420 | {\r |
| 2421 | Text "=" "STRING_TOKEN" "\(" Number "\)"\r |
| 2422 | }\r |
| 2423 | ";"\r |
| 2424 | ;\r |
| 2425 | \r |
| 2426 | vfrStatementInvalidSaveRestoreDefaults :\r |
| 2427 | (\r |
| 2428 | L:Save <<\r |
| 2429 | if (!mCompatibleMode) {\r |
| 2430 | _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r |
| 2431 | }\r |
| 2432 | >>\r |
| 2433 | |\r |
| 2434 | K:Restore <<\r |
| 2435 | if (!mCompatibleMode) {\r |
| 2436 | _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r |
| 2437 | }\r |
| 2438 | >>\r |
| 2439 | )\r |
| 2440 | Defaults ","\r |
| 2441 | FormId "=" Number ","\r |
| 2442 | Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r |
| 2443 | Help "=" "STRING_TOKEN" "\(" Number "\)"\r |
| 2444 | { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r |
| 2445 | { "," Key "=" Number }\r |
| 2446 | ";"\r |
| 2447 | ;\r |
| 2448 | \r |
| 2449 | //******************************************************************************\r |
| 2450 | //\r |
| 2451 | // The syntax of expression\r |
| 2452 | //\r |
| 2453 | #token Dup("dup") "dup"\r |
| 2454 | #token VarEqVal("vareqval") "vareqval"\r |
| 2455 | #token Var("var") "var"\r |
| 2456 | #token IdEqVal("ideqval") "ideqval"\r |
| 2457 | #token IdEqId("ideqid") "ideqid"\r |
| 2458 | #token IdEqValList("ideqvallist") "ideqvallist"\r |
| 2459 | #token QuestionRef("questionref") "questionref"\r |
| 2460 | #token RuleRef("ruleref") "ruleref"\r |
| 2461 | #token StringRef("stringref") "stringref"\r |
| 2462 | #token PushThis("pushthis") "pushthis"\r |
| 2463 | #token True("TRUE") "TRUE"\r |
| 2464 | #token False("FALSE") "FALSE"\r |
| 2465 | #token One("ONE") "ONE"\r |
| 2466 | #token Ones("ONES") "ONES"\r |
| 2467 | #token Zero("ZERO") "ZERO"\r |
| 2468 | #token Undefined("UNDEFINED") "UNDEFINED"\r |
| 2469 | #token Version("VERSION") "VERSION"\r |
| 2470 | #token Length("length") "length"\r |
| 2471 | #token AND("AND") "AND"\r |
| 2472 | #token OR("OR") "OR"\r |
| 2473 | #token NOT("NOT") "NOT"\r |
| 2474 | #token BitWiseNot("~") "\~"\r |
| 2475 | #token BoolVal("boolval") "boolval"\r |
| 2476 | #token StringVal("stringval") "stringval"\r |
| 2477 | #token UnIntVal("unintval") "unintval"\r |
| 2478 | #token ToUpper("toupper") "toupper"\r |
| 2479 | #token ToLower("tolower") "tolower"\r |
| 2480 | #token Match("match") "match"\r |
| 2481 | #token Catenate("catenate") "catenate"\r |
| 2482 | #token QuestionRefVal("questionrefval") "questionrefval"\r |
| 2483 | #token StringRefVal("stringrefval") "stringrefval"\r |
| 2484 | \r |
| 2485 | //\r |
| 2486 | // Root expression extension function called by other function.\r |
| 2487 | //\r |
| 2488 | vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r |
| 2489 | << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>\r |
| 2490 | andTerm[$RootLevel, $ExpOpCount]\r |
| 2491 | (\r |
| 2492 | L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r |
| 2493 | )*\r |
| 2494 | <<\r |
| 2495 | //\r |
| 2496 | // Extend OpCode Scope only for the root expression.\r |
| 2497 | //\r |
| 2498 | if ($ExpOpCount > 1 && $RootLevel == 0) {\r |
| 2499 | if (_SET_SAVED_OPHDR_SCOPE()) {\r |
| 2500 | CIfrEnd EObj;\r |
| 2501 | if (mCIfrOpHdrLineNo != 0) {\r |
| 2502 | EObj.SetLineNo (mCIfrOpHdrLineNo);\r |
| 2503 | }\r |
| 2504 | }\r |
| 2505 | }\r |
| 2506 | >>\r |
| 2507 | ;\r |
| 2508 | \r |
| 2509 | //\r |
| 2510 | // Add new sub function for the sub expression extension to remember the ExpOpCount\r |
| 2511 | // This funciton is only called by sub expression.\r |
| 2512 | //\r |
| 2513 | vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r |
| 2514 | andTerm[$RootLevel, $ExpOpCount]\r |
| 2515 | (\r |
| 2516 | L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r |
| 2517 | )*\r |
| 2518 | ;\r |
| 2519 | \r |
| 2520 | andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2521 | bitwiseorTerm[$RootLevel, $ExpOpCount]\r |
| 2522 | (\r |
| 2523 | L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r |
| 2524 | )*\r |
| 2525 | ;\r |
| 2526 | \r |
| 2527 | bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2528 | bitwiseandTerm[$RootLevel, $ExpOpCount]\r |
| 2529 | (\r |
| 2530 | L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r |
| 2531 | )*\r |
| 2532 | ;\r |
| 2533 | \r |
| 2534 | bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2535 | equalTerm[$RootLevel, $ExpOpCount]\r |
| 2536 | (\r |
| 2537 | L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r |
| 2538 | )*\r |
| 2539 | ;\r |
| 2540 | \r |
| 2541 | equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2542 | compareTerm[$RootLevel, $ExpOpCount]\r |
| 2543 | (\r |
| 2544 | (\r |
| 2545 | L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r |
| 2546 | )\r |
| 2547 | |\r |
| 2548 | (\r |
| 2549 | L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r |
| 2550 | )\r |
| 2551 | )*\r |
| 2552 | ;\r |
| 2553 | \r |
| 2554 | compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2555 | shiftTerm[$RootLevel, $ExpOpCount]\r |
| 2556 | (\r |
| 2557 | (\r |
| 2558 | L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r |
| 2559 | )\r |
| 2560 | |\r |
| 2561 | (\r |
| 2562 | L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r |
| 2563 | )\r |
| 2564 | |\r |
| 2565 | (\r |
| 2566 | L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r |
| 2567 | )\r |
| 2568 | |\r |
| 2569 | (\r |
| 2570 | L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r |
| 2571 | )\r |
| 2572 | )*\r |
| 2573 | ;\r |
| 2574 | \r |
| 2575 | shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2576 | addMinusTerm[$RootLevel, $ExpOpCount]\r |
| 2577 | (\r |
| 2578 | (\r |
| 2579 | L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r |
| 2580 | )\r |
| 2581 | |\r |
| 2582 | (\r |
| 2583 | L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r |
| 2584 | )\r |
| 2585 | )*\r |
| 2586 | ;\r |
| 2587 | \r |
| 2588 | addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2589 | multdivmodTerm[$RootLevel, $ExpOpCount]\r |
| 2590 | (\r |
| 2591 | (\r |
| 2592 | L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r |
| 2593 | )\r |
| 2594 | |\r |
| 2595 | (\r |
| 2596 | L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r |
| 2597 | )\r |
| 2598 | )*\r |
| 2599 | ;\r |
| 2600 | \r |
| 2601 | multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2602 | castTerm[$RootLevel, $ExpOpCount]\r |
| 2603 | (\r |
| 2604 | (\r |
| 2605 | L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r |
| 2606 | )\r |
| 2607 | |\r |
| 2608 | (\r |
| 2609 | L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r |
| 2610 | )\r |
| 2611 | |\r |
| 2612 | (\r |
| 2613 | L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r |
| 2614 | )\r |
| 2615 | )*\r |
| 2616 | ;\r |
| 2617 | \r |
| 2618 | castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2619 | << UINT8 CastType = 0xFF; >>\r |
| 2620 | (\r |
| 2621 | L:"\("\r |
| 2622 | (\r |
| 2623 | Boolean << CastType = 0; >>\r |
| 2624 | | Uint64 << CastType = 1; >>\r |
| 2625 | | Uint32 << CastType = 1; >>\r |
| 2626 | | Uint16 << CastType = 1; >>\r |
| 2627 | | Uint8 << CastType = 1; >>\r |
| 2628 | )\r |
| 2629 | "\)"\r |
| 2630 | )*\r |
| 2631 | atomTerm[$RootLevel, $ExpOpCount]\r |
| 2632 | <<\r |
| 2633 | switch (CastType) {\r |
| 2634 | case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r |
| 2635 | case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r |
| 2636 | }\r |
| 2637 | >>\r |
| 2638 | ;\r |
| 2639 | \r |
| 2640 | atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2641 | vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r |
| 2642 | | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r |
| 2643 | | vfrExpressionParen[$RootLevel, $ExpOpCount]\r |
| 2644 | | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r |
| 2645 | | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r |
| 2646 | | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r |
| 2647 | | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r |
| 2648 | | (\r |
| 2649 | L:NOT\r |
| 2650 | atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r |
| 2651 | )\r |
| 2652 | ;\r |
| 2653 | \r |
| 2654 | vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2655 | L:Catenate\r |
| 2656 | "\("\r |
| 2657 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 2658 | ","\r |
| 2659 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 2660 | "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r |
| 2661 | ;\r |
| 2662 | \r |
| 2663 | vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2664 | L:Match\r |
| 2665 | "\("\r |
| 2666 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 2667 | ","\r |
| 2668 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 2669 | "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r |
| 2670 | ;\r |
| 2671 | \r |
| 2672 | vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r |
| 2673 | "\("\r |
| 2674 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 2675 | "\)"\r |
| 2676 | ;\r |
| 2677 | \r |
| 2678 | vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2679 | dupExp[$RootLevel, $ExpOpCount]\r |
| 2680 | | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r |
| 2681 | | ideqvalExp[$RootLevel, $ExpOpCount]\r |
| 2682 | | ideqidExp[$RootLevel, $ExpOpCount]\r |
| 2683 | | ideqvallistExp[$RootLevel, $ExpOpCount]\r |
| 2684 | | questionref13Exp[$RootLevel, $ExpOpCount]\r |
| 2685 | | rulerefExp[$RootLevel, $ExpOpCount]\r |
| 2686 | | stringref1Exp[$RootLevel, $ExpOpCount]\r |
| 2687 | | pushthisExp[$RootLevel, $ExpOpCount]\r |
| 2688 | ;\r |
| 2689 | \r |
| 2690 | dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2691 | L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r |
| 2692 | ;\r |
| 2693 | \r |
| 2694 | vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2695 | <<\r |
| 2696 | EFI_QUESTION_ID QId;\r |
| 2697 | UINT32 Mask;\r |
| 2698 | UINT16 ConstVal;\r |
| 2699 | CHAR8 *VarIdStr;\r |
| 2700 | UINT32 LineNo;\r |
| 2701 | EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r |
| 2702 | EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r |
| 2703 | >>\r |
| 2704 | L:VarEqVal <<\r |
| 2705 | if (!mCompatibleMode) {\r |
| 2706 | _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r |
| 2707 | }\r |
| 2708 | >>\r |
| 2709 | VK:Var\r |
| 2710 | OpenParen\r |
| 2711 | VN:Number <<\r |
| 2712 | VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r |
| 2713 | VfrReturnCode = mCVfrDataStorage.GetVarStoreType (VarIdStr, VarStoreType);\r |
| 2714 | if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r |
| 2715 | _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r |
| 2716 | VarIdStr,\r |
| 2717 | &mFormsetGuid,\r |
| 2718 | _STOSID(VN->getText()),\r |
| 2719 | 0x2, //default type is UINT16\r |
| 2720 | FALSE\r |
| 2721 | ), VN);\r |
| 2722 | } else {\r |
| 2723 | _PCATCH (VfrReturnCode, VN);\r |
| 2724 | }\r |
| 2725 | mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r |
| 2726 | LineNo = GET_LINENO(VN);\r |
| 2727 | >>\r |
| 2728 | CloseParen\r |
| 2729 | (\r |
| 2730 | (\r |
| 2731 | "=="\r |
| 2732 | V1:Number << ConstVal = _STOU16(V1->getText()); >>\r |
| 2733 | <<\r |
| 2734 | if (Mask == 0) {\r |
| 2735 | CIfrEqIdVal EIVObj (L->getLine());\r |
| 2736 | _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r |
| 2737 | EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r |
| 2738 | EIVObj.SetValue (ConstVal);\r |
| 2739 | $ExpOpCount++;\r |
| 2740 | } else {\r |
| 2741 | IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r |
| 2742 | }\r |
| 2743 | >>\r |
| 2744 | )\r |
| 2745 | |\r |
| 2746 | (\r |
| 2747 | "<="\r |
| 2748 | V2:Number << ConstVal = _STOU16(V2->getText()); >>\r |
| 2749 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r |
| 2750 | )\r |
| 2751 | |\r |
| 2752 | (\r |
| 2753 | "<"\r |
| 2754 | V3:Number << ConstVal = _STOU16(V3->getText()); >>\r |
| 2755 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r |
| 2756 | )\r |
| 2757 | |\r |
| 2758 | (\r |
| 2759 | ">="\r |
| 2760 | V4:Number << ConstVal = _STOU16(V4->getText()); >>\r |
| 2761 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r |
| 2762 | )\r |
| 2763 | |\r |
| 2764 | (\r |
| 2765 | ">"\r |
| 2766 | V5:Number << ConstVal = _STOU16(V5->getText()); >>\r |
| 2767 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r |
| 2768 | )\r |
| 2769 | )\r |
| 2770 | ;\r |
| 2771 | \r |
| 2772 | ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2773 | <<\r |
| 2774 | EFI_QUESTION_ID QId;\r |
| 2775 | UINT32 Mask;\r |
| 2776 | UINT16 ConstVal;\r |
| 2777 | CHAR8 *VarIdStr;\r |
| 2778 | UINT32 LineNo;\r |
| 2779 | >>\r |
| 2780 | L:IdEqVal\r |
| 2781 | vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r |
| 2782 | (\r |
| 2783 | (\r |
| 2784 | "=="\r |
| 2785 | V1:Number << ConstVal = _STOU16(V1->getText()); >>\r |
| 2786 | <<\r |
| 2787 | if (Mask == 0) {\r |
| 2788 | CIfrEqIdVal EIVObj (L->getLine());\r |
| 2789 | _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r |
| 2790 | EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r |
| 2791 | EIVObj.SetValue (ConstVal);\r |
| 2792 | $ExpOpCount++;\r |
| 2793 | } else {\r |
| 2794 | IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r |
| 2795 | }\r |
| 2796 | >>\r |
| 2797 | )\r |
| 2798 | |\r |
| 2799 | (\r |
| 2800 | "<="\r |
| 2801 | V2:Number << ConstVal = _STOU16(V2->getText()); >>\r |
| 2802 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r |
| 2803 | )\r |
| 2804 | |\r |
| 2805 | (\r |
| 2806 | "<"\r |
| 2807 | V3:Number << ConstVal = _STOU16(V3->getText()); >>\r |
| 2808 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r |
| 2809 | )\r |
| 2810 | |\r |
| 2811 | (\r |
| 2812 | ">="\r |
| 2813 | V4:Number << ConstVal = _STOU16(V4->getText()); >>\r |
| 2814 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r |
| 2815 | )\r |
| 2816 | |\r |
| 2817 | (\r |
| 2818 | ">"\r |
| 2819 | V5:Number << ConstVal = _STOU16(V5->getText()); >>\r |
| 2820 | << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r |
| 2821 | )\r |
| 2822 | )\r |
| 2823 | ;\r |
| 2824 | \r |
| 2825 | ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2826 | <<\r |
| 2827 | EFI_QUESTION_ID QId[2];\r |
| 2828 | UINT32 Mask[2];\r |
| 2829 | CHAR8 *VarIdStr[2];\r |
| 2830 | UINT32 LineNo[2];\r |
| 2831 | >>\r |
| 2832 | L:IdEqId\r |
| 2833 | vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r |
| 2834 | (\r |
| 2835 | (\r |
| 2836 | "=="\r |
| 2837 | vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r |
| 2838 | <<\r |
| 2839 | if (Mask[0] & Mask[1]) {\r |
| 2840 | IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r |
| 2841 | } else {\r |
| 2842 | CIfrEqIdId EIIObj(L->getLine());\r |
| 2843 | _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r |
| 2844 | EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r |
| 2845 | EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r |
| 2846 | $ExpOpCount++;\r |
| 2847 | }\r |
| 2848 | >>\r |
| 2849 | )\r |
| 2850 | |\r |
| 2851 | (\r |
| 2852 | "<="\r |
| 2853 | vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r |
| 2854 | << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r |
| 2855 | )\r |
| 2856 | |\r |
| 2857 | (\r |
| 2858 | "<"\r |
| 2859 | vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r |
| 2860 | << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r |
| 2861 | )\r |
| 2862 | |\r |
| 2863 | (\r |
| 2864 | ">="\r |
| 2865 | vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r |
| 2866 | << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r |
| 2867 | )\r |
| 2868 | |\r |
| 2869 | (\r |
| 2870 | ">"\r |
| 2871 | vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r |
| 2872 | << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r |
| 2873 | )\r |
| 2874 | )\r |
| 2875 | ;\r |
| 2876 | \r |
| 2877 | ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2878 | <<\r |
| 2879 | UINT16 ListLen = 0;\r |
| 2880 | EFI_QUESTION_ID QId;\r |
| 2881 | UINT32 Mask;\r |
| 2882 | UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r |
| 2883 | CHAR8 *VarIdStr;\r |
| 2884 | UINT32 LineNo;\r |
| 2885 | >>\r |
| 2886 | L:IdEqValList\r |
| 2887 | vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r |
| 2888 | "=="\r |
| 2889 | (\r |
| 2890 | V:Number << ValueList[ListLen] = _STOU16(V->getText()); ListLen++; >>\r |
| 2891 | )+\r |
| 2892 | <<\r |
| 2893 | if (Mask != 0) {\r |
| 2894 | IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r |
| 2895 | } else {\r |
| 2896 | UINT16 Index;\r |
| 2897 | CIfrEqIdList EILObj(L->getLine());\r |
| 2898 | if (QId != EFI_QUESTION_ID_INVALID) {\r |
| 2899 | EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r |
| 2900 | }\r |
| 2901 | EILObj.SetListLength (ListLen);\r |
| 2902 | for (Index = 0; Index < ListLen; Index++) {\r |
| 2903 | EILObj.SetValueList (Index, ValueList[Index]);\r |
| 2904 | }\r |
| 2905 | \r |
| 2906 | EILObj.UpdateIfrBuffer();\r |
| 2907 | _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r |
| 2908 | \r |
| 2909 | if (QId == EFI_QUESTION_ID_INVALID) {\r |
| 2910 | EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r |
| 2911 | }\r |
| 2912 | $ExpOpCount++;\r |
| 2913 | }\r |
| 2914 | >>\r |
| 2915 | ;\r |
| 2916 | \r |
| 2917 | questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2918 | <<\r |
| 2919 | UINT8 Type = 0x1;\r |
| 2920 | EFI_STRING_ID DevPath;\r |
| 2921 | EFI_GUID Guid;\r |
| 2922 | EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r |
| 2923 | UINT32 BitMask;\r |
| 2924 | CHAR8 *QName = NULL;\r |
| 2925 | UINT32 LineNo = 0;\r |
| 2926 | >>\r |
| 2927 | L:QuestionRef\r |
| 2928 | (\r |
| 2929 | (\r |
| 2930 | << Type = 0x3; >>\r |
| 2931 | {\r |
| 2932 | Path "=" "STRING_TOKEN" "\(" S:Number "\)" << Type = 0x4; DevPath = _STOSID(S->getText()); >>\r |
| 2933 | }\r |
| 2934 | {\r |
| 2935 | Uuid "=" guidDefinition[Guid] << Type = 0x5; >>\r |
| 2936 | }\r |
| 2937 | )\r |
| 2938 | |\r |
| 2939 | (\r |
| 2940 | "\("\r |
| 2941 | (\r |
| 2942 | QN:StringIdentifier <<\r |
| 2943 | QName = QN->getText();\r |
| 2944 | LineNo = QN->getLine();\r |
| 2945 | mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r |
| 2946 | >>\r |
| 2947 | | ID:Number << QId = _STOQID(ID->getText()); >>\r |
| 2948 | )\r |
| 2949 | "\)"\r |
| 2950 | )\r |
| 2951 | )\r |
| 2952 | <<\r |
| 2953 | switch (Type) {\r |
| 2954 | case 0x1: {CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); break;}\r |
| 2955 | case 0x3: {CIfrQuestionRef3 QR3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3Obj, ($ExpOpCount == 0), L->getLine()); break;}\r |
| 2956 | case 0x4: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r |
| 2957 | case 0x5: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}\r |
| 2958 | }\r |
| 2959 | $ExpOpCount++;\r |
| 2960 | >>\r |
| 2961 | ;\r |
| 2962 | \r |
| 2963 | rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2964 | L:RuleRef\r |
| 2965 | "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r |
| 2966 | ;\r |
| 2967 | \r |
| 2968 | //******************************************************\r |
| 2969 | // PARSE:\r |
| 2970 | // stringref (STR_FORM_SET_TITLE)\r |
| 2971 | //\r |
| 2972 | stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2973 | L:StringRef\r |
| 2974 | "\(" S:Number "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>\r |
| 2975 | ;\r |
| 2976 | \r |
| 2977 | pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2978 | L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r |
| 2979 | ;\r |
| 2980 | \r |
| 2981 | vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2982 | L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r |
| 2983 | | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r |
| 2984 | | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r |
| 2985 | | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r |
| 2986 | | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r |
| 2987 | | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r |
| 2988 | | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r |
| 2989 | | V:Number << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >>\r |
| 2990 | ;\r |
| 2991 | \r |
| 2992 | vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 2993 | lengthExp[$RootLevel, $ExpOpCount]\r |
| 2994 | | bitwisenotExp[$RootLevel, $ExpOpCount]\r |
| 2995 | | question2refExp[$RootLevel, $ExpOpCount]\r |
| 2996 | | stringref2Exp[$RootLevel, $ExpOpCount]\r |
| 2997 | | toboolExp[$RootLevel, $ExpOpCount]\r |
| 2998 | | unintExp[$RootLevel, $ExpOpCount]\r |
| 2999 | | toupperExp[$RootLevel, $ExpOpCount]\r |
| 3000 | | tolwerExp[$RootLevel, $ExpOpCount]\r |
| 3001 | ;\r |
| 3002 | \r |
| 3003 | lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3004 | L:Length\r |
| 3005 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3006 | << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3007 | ;\r |
| 3008 | \r |
| 3009 | bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3010 | L:BitWiseNot\r |
| 3011 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3012 | << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3013 | ;\r |
| 3014 | \r |
| 3015 | question2refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3016 | L:QuestionRefVal\r |
| 3017 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3018 | << { CIfrQuestionRef2 QR2Obj(L->getLine()); $ExpOpCount++; } >>\r |
| 3019 | ;\r |
| 3020 | \r |
| 3021 | stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3022 | L:StringRefVal\r |
| 3023 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3024 | << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r |
| 3025 | ;\r |
| 3026 | \r |
| 3027 | toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3028 | L:BoolVal\r |
| 3029 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3030 | << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3031 | ;\r |
| 3032 | \r |
| 3033 | tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3034 | << UINT8 Fmt = 0; >>\r |
| 3035 | L:StringVal\r |
| 3036 | {\r |
| 3037 | Format "=" F:Number "," << Fmt = _STOU8(F->getText()); >>\r |
| 3038 | }\r |
| 3039 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3040 | << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r |
| 3041 | ;\r |
| 3042 | \r |
| 3043 | unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3044 | L:UnIntVal\r |
| 3045 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3046 | << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3047 | ;\r |
| 3048 | \r |
| 3049 | toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3050 | L:ToUpper\r |
| 3051 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3052 | << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3053 | ;\r |
| 3054 | \r |
| 3055 | tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3056 | L:ToLower\r |
| 3057 | "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r |
| 3058 | << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3059 | ;\r |
| 3060 | \r |
| 3061 | vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3062 | conditionalExp[$RootLevel, $ExpOpCount]\r |
| 3063 | | findExp[$RootLevel, $ExpOpCount]\r |
| 3064 | | midExp[$RootLevel, $ExpOpCount]\r |
| 3065 | | tokenExp[$RootLevel, $ExpOpCount]\r |
| 3066 | | spanExp[$RootLevel, $ExpOpCount]\r |
| 3067 | ;\r |
| 3068 | \r |
| 3069 | #token Cond("cond") "cond"\r |
| 3070 | #token Find("find") "find"\r |
| 3071 | #token Mid("mid") "mid"\r |
| 3072 | #token Tok("token") "token"\r |
| 3073 | #token Span("span") "span"\r |
| 3074 | \r |
| 3075 | conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3076 | L:Cond "\("\r |
| 3077 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3078 | "?"\r |
| 3079 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3080 | ":"\r |
| 3081 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3082 | "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3083 | ;\r |
| 3084 | \r |
| 3085 | findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3086 | << UINT8 Format; >>\r |
| 3087 | L:Find "\("\r |
| 3088 | findFormat[Format] ( "\|" findFormat[Format] )*\r |
| 3089 | ","\r |
| 3090 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3091 | ","\r |
| 3092 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3093 | ","\r |
| 3094 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3095 | "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r |
| 3096 | ;\r |
| 3097 | \r |
| 3098 | findFormat [UINT8 & Format] :\r |
| 3099 | "SENSITIVE" << $Format = 0x00; >>\r |
| 3100 | | "INSENSITIVE" << $Format = 0x01; >>\r |
| 3101 | ;\r |
| 3102 | \r |
| 3103 | midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3104 | L:Mid "\("\r |
| 3105 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3106 | ","\r |
| 3107 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3108 | ","\r |
| 3109 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3110 | "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3111 | ;\r |
| 3112 | \r |
| 3113 | tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3114 | L:Tok "\("\r |
| 3115 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3116 | ","\r |
| 3117 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3118 | ","\r |
| 3119 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3120 | "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r |
| 3121 | ;\r |
| 3122 | \r |
| 3123 | spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r |
| 3124 | << UINT8 Flags = 0; >>\r |
| 3125 | S:Span "\("\r |
| 3126 | FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r |
| 3127 | ","\r |
| 3128 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3129 | ","\r |
| 3130 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3131 | ","\r |
| 3132 | vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r |
| 3133 | "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r |
| 3134 | ;\r |
| 3135 | \r |
| 3136 | spanFlags [UINT8 & Flags] :\r |
| 3137 | N:Number << $Flags |= _STOU8(N->getText()); >>\r |
| 3138 | | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r |
| 3139 | | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r |
| 3140 | ;\r |
| 3141 | \r |
| 3142 | #token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r |
| 3143 | #token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r |
| 3144 | \r |
| 3145 | //******************************************************************************\r |
| 3146 | //\r |
| 3147 | // Parser class definition.\r |
| 3148 | //\r |
| 3149 | class EfiVfrParser {\r |
| 3150 | <<\r |
| 3151 | private:\r |
| 3152 | UINT8 mParserStatus;\r |
| 3153 | BOOLEAN mConstantOnlyInExpression;\r |
| 3154 | \r |
| 3155 | CVfrDefaultStore mCVfrDefaultStore;\r |
| 3156 | CVfrDataStorage mCVfrDataStorage;\r |
| 3157 | CVfrQuestionDB mCVfrQuestionDB;\r |
| 3158 | CVfrRulesDB mCVfrRulesDB;\r |
| 3159 | \r |
| 3160 | CIfrOpHeader *mCIfrOpHdr;\r |
| 3161 | UINT32 mCIfrOpHdrLineNo;\r |
| 3162 | VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r |
| 3163 | VOID _CLEAR_SAVED_OPHDR (VOID);\r |
| 3164 | BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r |
| 3165 | \r |
| 3166 | \r |
| 3167 | EFI_VARSTORE_INFO mCurrQestVarInfo;\r |
| 3168 | \r |
| 3169 | //\r |
| 3170 | // For framework vfr compatibility\r |
| 3171 | //\r |
| 3172 | BOOLEAN mCompatibleMode;\r |
| 3173 | EFI_GUID mFormsetGuid;\r |
| 3174 | \r |
| 3175 | VOID _CRT_OP (IN BOOLEAN);\r |
| 3176 | \r |
| 3177 | VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r |
| 3178 | EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r |
| 3179 | \r |
| 3180 | UINT8 _GET_CURRQEST_DATATYPE ();\r |
| 3181 | UINT32 _GET_CURRQEST_VARSIZE ();\r |
| 3182 | UINT32 _GET_CURRQEST_ARRAY_SIZE();\r |
| 3183 | \r |
| 3184 | public:\r |
| 3185 | VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CHAR8 *);\r |
| 3186 | VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r |
| 3187 | VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r |
| 3188 | VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r |
| 3189 | VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CHAR8 *);\r |
| 3190 | \r |
| 3191 | VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r |
| 3192 | \r |
| 3193 | CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r |
| 3194 | CHAR8* _U32TOS (IN UINT32);\r |
| 3195 | UINT8 _STOU8 (IN CHAR8 *);\r |
| 3196 | UINT16 _STOU16 (IN CHAR8 *);\r |
| 3197 | UINT32 _STOU32 (IN CHAR8 *);\r |
| 3198 | UINT64 _STOU64 (IN CHAR8 *);\r |
| 3199 | EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r |
| 3200 | EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *);\r |
| 3201 | \r |
| 3202 | EFI_STRING_ID _STOSID (IN CHAR8 *);\r |
| 3203 | EFI_FORM_ID _STOFID (IN CHAR8 *);\r |
| 3204 | EFI_QUESTION_ID _STOQID (IN CHAR8 *);\r |
| 3205 | \r |
| 3206 | VOID _STRCAT (IN OUT CHAR8 **, IN CHAR8 *);\r |
| 3207 | \r |
| 3208 | VOID _DeclareDefaultLinearVarStore (IN UINT32);\r |
| 3209 | VOID _DeclareStandardDefaultStorage (IN UINT32);\r |
| 3210 | VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r |
| 3211 | \r |
| 3212 | VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r |
| 3213 | \r |
| 3214 | VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r |
| 3215 | VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r |
| 3216 | VOID IdEqIdDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_COMPARE_TYPE);\r |
| 3217 | VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r |
| 3218 | //\r |
| 3219 | // For framework vfr compatibility\r |
| 3220 | //\r |
| 3221 | VOID SetCompatibleMode (IN BOOLEAN);\r |
| 3222 | >>\r |
| 3223 | }\r |
| 3224 | \r |
| 3225 | <<\r |
| 3226 | VOID\r |
| 3227 | EfiVfrParser::_SAVE_OPHDR_COND (\r |
| 3228 | IN CIfrOpHeader &OpHdr,\r |
| 3229 | IN BOOLEAN Cond,\r |
| 3230 | IN UINT32 LineNo\r |
| 3231 | )\r |
| 3232 | {\r |
| 3233 | if (Cond == TRUE) {\r |
| 3234 | if (mCIfrOpHdr != NULL) {\r |
| 3235 | return ;\r |
| 3236 | }\r |
| 3237 | mCIfrOpHdr = new CIfrOpHeader(OpHdr);\r |
| 3238 | mCIfrOpHdrLineNo = LineNo;\r |
| 3239 | }\r |
| 3240 | }\r |
| 3241 | \r |
| 3242 | VOID\r |
| 3243 | EfiVfrParser::_CLEAR_SAVED_OPHDR (\r |
| 3244 | VOID\r |
| 3245 | )\r |
| 3246 | {\r |
| 3247 | mCIfrOpHdr = NULL;\r |
| 3248 | mCIfrOpHdrLineNo = 0;\r |
| 3249 | }\r |
| 3250 | \r |
| 3251 | BOOLEAN\r |
| 3252 | EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r |
| 3253 | VOID\r |
| 3254 | )\r |
| 3255 | {\r |
| 3256 | if (mCIfrOpHdr != NULL) {\r |
| 3257 | mCIfrOpHdr->SetScope (1);\r |
| 3258 | return TRUE;\r |
| 3259 | }\r |
| 3260 | //\r |
| 3261 | // IfrOpHdr is not set, FALSE is return.\r |
| 3262 | //\r |
| 3263 | return FALSE;\r |
| 3264 | }\r |
| 3265 | \r |
| 3266 | VOID\r |
| 3267 | EfiVfrParser::_CRT_OP (\r |
| 3268 | IN BOOLEAN Crt\r |
| 3269 | )\r |
| 3270 | {\r |
| 3271 | gCreateOp = Crt;\r |
| 3272 | }\r |
| 3273 | \r |
| 3274 | VOID\r |
| 3275 | EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r |
| 3276 | IN EFI_VARSTORE_INFO &Info\r |
| 3277 | )\r |
| 3278 | {\r |
| 3279 | mCurrQestVarInfo = Info;\r |
| 3280 | }\r |
| 3281 | \r |
| 3282 | EFI_VARSTORE_INFO &\r |
| 3283 | EfiVfrParser::_GET_CURRQEST_VARTINFO (\r |
| 3284 | VOID\r |
| 3285 | )\r |
| 3286 | {\r |
| 3287 | return mCurrQestVarInfo;\r |
| 3288 | }\r |
| 3289 | \r |
| 3290 | UINT32\r |
| 3291 | EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r |
| 3292 | VOID\r |
| 3293 | )\r |
| 3294 | {\r |
| 3295 | UINT8 Size = 1;\r |
| 3296 | \r |
| 3297 | switch (mCurrQestVarInfo.mVarType) {\r |
| 3298 | case EFI_IFR_TYPE_NUM_SIZE_8:\r |
| 3299 | Size = 1;\r |
| 3300 | break;\r |
| 3301 | \r |
| 3302 | case EFI_IFR_TYPE_NUM_SIZE_16:\r |
| 3303 | Size = 2;\r |
| 3304 | break;\r |
| 3305 | \r |
| 3306 | case EFI_IFR_TYPE_NUM_SIZE_32:\r |
| 3307 | Size = 4;\r |
| 3308 | break;\r |
| 3309 | \r |
| 3310 | case EFI_IFR_TYPE_NUM_SIZE_64:\r |
| 3311 | Size = 8;\r |
| 3312 | break;\r |
| 3313 | \r |
| 3314 | default:\r |
| 3315 | break;\r |
| 3316 | }\r |
| 3317 | \r |
| 3318 | return (mCurrQestVarInfo.mVarTotalSize / Size);\r |
| 3319 | }\r |
| 3320 | \r |
| 3321 | UINT8\r |
| 3322 | EfiVfrParser::_GET_CURRQEST_DATATYPE (\r |
| 3323 | VOID\r |
| 3324 | )\r |
| 3325 | {\r |
| 3326 | return mCurrQestVarInfo.mVarType;\r |
| 3327 | }\r |
| 3328 | \r |
| 3329 | UINT32\r |
| 3330 | EfiVfrParser::_GET_CURRQEST_VARSIZE (\r |
| 3331 | VOID\r |
| 3332 | )\r |
| 3333 | {\r |
| 3334 | return mCurrQestVarInfo.mVarTotalSize;\r |
| 3335 | }\r |
| 3336 | \r |
| 3337 | VOID\r |
| 3338 | EfiVfrParser::_PCATCH (\r |
| 3339 | IN INTN ReturnCode,\r |
| 3340 | IN INTN ExpectCode,\r |
| 3341 | IN ANTLRTokenPtr Tok,\r |
| 3342 | IN CHAR8 *ErrorMsg\r |
| 3343 | )\r |
| 3344 | {\r |
| 3345 | if (ReturnCode != ExpectCode) {\r |
| 3346 | mParserStatus++;\r |
| 3347 | gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r |
| 3348 | }\r |
| 3349 | }\r |
| 3350 | \r |
| 3351 | VOID\r |
| 3352 | EfiVfrParser::_PCATCH (\r |
| 3353 | IN EFI_VFR_RETURN_CODE ReturnCode\r |
| 3354 | )\r |
| 3355 | {\r |
| 3356 | mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);\r |
| 3357 | }\r |
| 3358 | \r |
| 3359 | VOID\r |
| 3360 | EfiVfrParser::_PCATCH (\r |
| 3361 | IN EFI_VFR_RETURN_CODE ReturnCode,\r |
| 3362 | IN ANTLRTokenPtr Tok\r |
| 3363 | )\r |
| 3364 | {\r |
| 3365 | mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r |
| 3366 | }\r |
| 3367 | \r |
| 3368 | VOID\r |
| 3369 | EfiVfrParser::_PCATCH (\r |
| 3370 | IN EFI_VFR_RETURN_CODE ReturnCode,\r |
| 3371 | IN UINT32 LineNum\r |
| 3372 | )\r |
| 3373 | {\r |
| 3374 | mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r |
| 3375 | }\r |
| 3376 | \r |
| 3377 | VOID\r |
| 3378 | EfiVfrParser::_PCATCH (\r |
| 3379 | IN EFI_VFR_RETURN_CODE ReturnCode,\r |
| 3380 | IN UINT32 LineNum,\r |
| 3381 | IN CHAR8 *ErrorMsg\r |
| 3382 | )\r |
| 3383 | {\r |
| 3384 | mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum, ErrorMsg);\r |
| 3385 | }\r |
| 3386 | \r |
| 3387 | VOID\r |
| 3388 | EfiVfrParser::syn (\r |
| 3389 | ANTLRAbstractToken *Tok,\r |
| 3390 | ANTLRChar *Egroup,\r |
| 3391 | SetWordType *Eset,\r |
| 3392 | ANTLRTokenType ETok,\r |
| 3393 | INT32 Huh\r |
| 3394 | )\r |
| 3395 | {\r |
| 3396 | gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r |
| 3397 | \r |
| 3398 | mParserStatus += 1;\r |
| 3399 | }\r |
| 3400 | \r |
| 3401 | CHAR8 *\r |
| 3402 | EfiVfrParser::TrimHex (\r |
| 3403 | IN CHAR8 *Str,\r |
| 3404 | OUT BOOLEAN *IsHex\r |
| 3405 | )\r |
| 3406 | {\r |
| 3407 | *IsHex = FALSE;\r |
| 3408 | \r |
| 3409 | while (*Str && *Str == ' ') {\r |
| 3410 | Str++;\r |
| 3411 | }\r |
| 3412 | while (*Str && *Str == '0') {\r |
| 3413 | Str++;\r |
| 3414 | }\r |
| 3415 | if (*Str && (*Str == 'x' || *Str == 'X')) {\r |
| 3416 | Str++;\r |
| 3417 | *IsHex = TRUE;\r |
| 3418 | }\r |
| 3419 | \r |
| 3420 | return Str;\r |
| 3421 | }\r |
| 3422 | \r |
| 3423 | CHAR8 *\r |
| 3424 | EfiVfrParser::_U32TOS (\r |
| 3425 | IN UINT32 Value\r |
| 3426 | )\r |
| 3427 | {\r |
| 3428 | CHAR8 *Str;\r |
| 3429 | Str = new CHAR8[20];\r |
| 3430 | sprintf (Str, "%d", Value);\r |
| 3431 | return Str;\r |
| 3432 | }\r |
| 3433 | \r |
| 3434 | UINT8\r |
| 3435 | EfiVfrParser::_STOU8 (\r |
| 3436 | IN CHAR8*Str\r |
| 3437 | )\r |
| 3438 | {\r |
| 3439 | BOOLEAN IsHex;\r |
| 3440 | UINT8 Value;\r |
| 3441 | CHAR8 c;\r |
| 3442 | \r |
| 3443 | Str = TrimHex (Str, &IsHex);\r |
| 3444 | for (Value = 0; (c = *Str) != '\0'; Str++) {\r |
| 3445 | //\r |
| 3446 | // BUG: does not handle overflow here\r |
| 3447 | //\r |
| 3448 | (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r |
| 3449 | \r |
| 3450 | if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r |
| 3451 | Value += (c - 'a' + 10);\r |
| 3452 | }\r |
| 3453 | if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r |
| 3454 | Value += (c - 'A' + 10);\r |
| 3455 | }\r |
| 3456 | if (c >= '0' && c <= '9') {\r |
| 3457 | Value += (c - '0');\r |
| 3458 | }\r |
| 3459 | }\r |
| 3460 | \r |
| 3461 | return Value;\r |
| 3462 | }\r |
| 3463 | \r |
| 3464 | UINT16\r |
| 3465 | EfiVfrParser::_STOU16 (\r |
| 3466 | IN CHAR8*Str\r |
| 3467 | )\r |
| 3468 | {\r |
| 3469 | BOOLEAN IsHex;\r |
| 3470 | UINT16 Value;\r |
| 3471 | CHAR8 c;\r |
| 3472 | \r |
| 3473 | Str = TrimHex (Str, &IsHex);\r |
| 3474 | for (Value = 0; (c = *Str) != '\0'; Str++) {\r |
| 3475 | //\r |
| 3476 | // BUG: does not handle overflow here\r |
| 3477 | //\r |
| 3478 | (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r |
| 3479 | \r |
| 3480 | if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r |
| 3481 | Value += (c - 'a' + 10);\r |
| 3482 | }\r |
| 3483 | if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r |
| 3484 | Value += (c - 'A' + 10);\r |
| 3485 | }\r |
| 3486 | if (c >= '0' && c <= '9') {\r |
| 3487 | Value += (c - '0');\r |
| 3488 | }\r |
| 3489 | }\r |
| 3490 | \r |
| 3491 | return Value;\r |
| 3492 | }\r |
| 3493 | \r |
| 3494 | UINT32\r |
| 3495 | EfiVfrParser::_STOU32 (\r |
| 3496 | IN CHAR8*Str\r |
| 3497 | )\r |
| 3498 | {\r |
| 3499 | BOOLEAN IsHex;\r |
| 3500 | UINT32 Value;\r |
| 3501 | CHAR8 c;\r |
| 3502 | \r |
| 3503 | Str = TrimHex (Str, &IsHex);\r |
| 3504 | for (Value = 0; (c = *Str) != '\0'; Str++) {\r |
| 3505 | //\r |
| 3506 | // BUG: does not handle overflow here\r |
| 3507 | //\r |
| 3508 | (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r |
| 3509 | \r |
| 3510 | if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r |
| 3511 | Value += (c - 'a' + 10);\r |
| 3512 | }\r |
| 3513 | if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r |
| 3514 | Value += (c - 'A' + 10);\r |
| 3515 | }\r |
| 3516 | if (c >= '0' && c <= '9') {\r |
| 3517 | Value += (c - '0');\r |
| 3518 | }\r |
| 3519 | }\r |
| 3520 | \r |
| 3521 | return Value;\r |
| 3522 | }\r |
| 3523 | \r |
| 3524 | UINT64\r |
| 3525 | EfiVfrParser::_STOU64 (\r |
| 3526 | IN CHAR8*Str\r |
| 3527 | )\r |
| 3528 | {\r |
| 3529 | BOOLEAN IsHex;\r |
| 3530 | UINT64 Value;\r |
| 3531 | CHAR8 c;\r |
| 3532 | \r |
| 3533 | Str = TrimHex (Str, &IsHex);\r |
| 3534 | for (Value = 0; (c = *Str) != '\0'; Str++) {\r |
| 3535 | //\r |
| 3536 | // BUG: does not handle overflow here\r |
| 3537 | //\r |
| 3538 | (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r |
| 3539 | \r |
| 3540 | if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r |
| 3541 | Value += (c - 'a' + 10);\r |
| 3542 | }\r |
| 3543 | if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r |
| 3544 | Value += (c - 'A' + 10);\r |
| 3545 | }\r |
| 3546 | if (c >= '0' && c <= '9') {\r |
| 3547 | Value += (c - '0');\r |
| 3548 | }\r |
| 3549 | }\r |
| 3550 | \r |
| 3551 | return Value;\r |
| 3552 | }\r |
| 3553 | \r |
| 3554 | EFI_HII_DATE\r |
| 3555 | EfiVfrParser::_STOD (\r |
| 3556 | IN CHAR8 *Year,\r |
| 3557 | IN CHAR8 *Month,\r |
| 3558 | IN CHAR8 *Day\r |
| 3559 | )\r |
| 3560 | {\r |
| 3561 | EFI_HII_DATE Date;\r |
| 3562 | \r |
| 3563 | Date.Year = _STOU16 (Year);\r |
| 3564 | Date.Month = _STOU8 (Month);\r |
| 3565 | Date.Day = _STOU8 (Day);\r |
| 3566 | \r |
| 3567 | return Date;\r |
| 3568 | }\r |
| 3569 | \r |
| 3570 | EFI_HII_TIME\r |
| 3571 | EfiVfrParser::_STOT (\r |
| 3572 | IN CHAR8 *Hour,\r |
| 3573 | IN CHAR8 *Minute,\r |
| 3574 | IN CHAR8 *Second\r |
| 3575 | )\r |
| 3576 | {\r |
| 3577 | EFI_HII_TIME Time;\r |
| 3578 | \r |
| 3579 | Time.Hour = _STOU8 (Hour);\r |
| 3580 | Time.Minute = _STOU8 (Minute);\r |
| 3581 | Time.Second = _STOU8 (Second);\r |
| 3582 | \r |
| 3583 | return Time;\r |
| 3584 | }\r |
| 3585 | \r |
| 3586 | EFI_STRING_ID\r |
| 3587 | EfiVfrParser::_STOSID (\r |
| 3588 | IN CHAR8 *Str\r |
| 3589 | )\r |
| 3590 | {\r |
| 3591 | return (EFI_STRING_ID)_STOU16(Str);\r |
| 3592 | }\r |
| 3593 | \r |
| 3594 | EFI_FORM_ID\r |
| 3595 | EfiVfrParser::_STOFID (\r |
| 3596 | IN CHAR8 *Str\r |
| 3597 | )\r |
| 3598 | {\r |
| 3599 | return (EFI_FORM_ID)_STOU16(Str);\r |
| 3600 | }\r |
| 3601 | \r |
| 3602 | EFI_QUESTION_ID\r |
| 3603 | EfiVfrParser::_STOQID (\r |
| 3604 | IN CHAR8 *Str\r |
| 3605 | )\r |
| 3606 | {\r |
| 3607 | return (EFI_QUESTION_ID)_STOU16(Str);\r |
| 3608 | }\r |
| 3609 | \r |
| 3610 | VOID\r |
| 3611 | EfiVfrParser::_STRCAT (\r |
| 3612 | IN OUT CHAR8 **Dest,\r |
| 3613 | IN CHAR8 *Src\r |
| 3614 | )\r |
| 3615 | {\r |
| 3616 | CHAR8 *NewStr;\r |
| 3617 | UINT32 Len;\r |
| 3618 | \r |
| 3619 | if ((Dest == NULL) || (Src == NULL)) {\r |
| 3620 | return;\r |
| 3621 | }\r |
| 3622 | \r |
| 3623 | Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r |
| 3624 | Len += strlen (Src);\r |
| 3625 | if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r |
| 3626 | return;\r |
| 3627 | }\r |
| 3628 | NewStr[0] = '\0';\r |
| 3629 | if (*Dest != NULL) {\r |
| 3630 | strcpy (NewStr, *Dest);\r |
| 3631 | delete *Dest;\r |
| 3632 | }\r |
| 3633 | strcat (NewStr, Src);\r |
| 3634 | \r |
| 3635 | *Dest = NewStr;\r |
| 3636 | }\r |
| 3637 | \r |
| 3638 | //\r |
| 3639 | // framework vfr to default declare varstore for each structure\r |
| 3640 | //\r |
| 3641 | VOID\r |
| 3642 | EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r |
| 3643 | IN UINT32 LineNo\r |
| 3644 | )\r |
| 3645 | {\r |
| 3646 | SVfrVarStorageNode *pNode;\r |
| 3647 | UINT32 TypeSize;\r |
| 3648 | BOOLEAN FirstNode;\r |
| 3649 | \r |
| 3650 | FirstNode = TRUE;\r |
| 3651 | pNode = mCVfrDataStorage.GetBufferVarStoreList();\r |
| 3652 | if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r |
| 3653 | //\r |
| 3654 | // Create the default Buffer Var Store when no VarStore is defined.\r |
| 3655 | // its name should be "Setup"\r |
| 3656 | //\r |
| 3657 | gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r |
| 3658 | CIfrVarStore VSObj;\r |
| 3659 | VSObj.SetLineNo (LineNo);\r |
| 3660 | VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r |
| 3661 | VSObj.SetSize (TypeSize);\r |
| 3662 | //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r |
| 3663 | VSObj.SetName ("Setup");\r |
| 3664 | VSObj.SetGuid (&mFormsetGuid);\r |
| 3665 | #ifdef VFREXP_DEBUG\r |
| 3666 | printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r |
| 3667 | #endif\r |
| 3668 | } else {\r |
| 3669 | for (; pNode != NULL; pNode = pNode->mNext) {\r |
| 3670 | //\r |
| 3671 | // create the default varstore opcode for not declared varstore\r |
| 3672 | // the first varstore name should be "Setup"\r |
| 3673 | //\r |
| 3674 | if (!pNode->mAssignedFlag) {\r |
| 3675 | CIfrVarStore VSObj;\r |
| 3676 | VSObj.SetLineNo (LineNo);\r |
| 3677 | VSObj.SetVarStoreId (pNode->mVarStoreId);\r |
| 3678 | VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r |
| 3679 | if (FirstNode) {\r |
| 3680 | VSObj.SetName ("Setup");\r |
| 3681 | FirstNode = FALSE;\r |
| 3682 | } else {\r |
| 3683 | VSObj.SetName (pNode->mVarStoreName);\r |
| 3684 | }\r |
| 3685 | VSObj.SetGuid (&pNode->mGuid);\r |
| 3686 | #ifdef VFREXP_DEBUG\r |
| 3687 | printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r |
| 3688 | #endif\r |
| 3689 | }\r |
| 3690 | }\r |
| 3691 | }\r |
| 3692 | \r |
| 3693 | pNode = mCVfrDataStorage.GetEfiVarStoreList();\r |
| 3694 | for (; pNode != NULL; pNode = pNode->mNext) {\r |
| 3695 | //\r |
| 3696 | // create the default efi varstore opcode for not exist varstore\r |
| 3697 | //\r |
| 3698 | if (!pNode->mAssignedFlag) {\r |
| 3699 | CIfrVarStoreEfi VSEObj;\r |
| 3700 | VSEObj.SetLineNo (LineNo);\r |
| 3701 | VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r |
| 3702 | VSEObj.SetGuid (&pNode->mGuid);\r |
| 3703 | VSEObj.SetVarStoreId (pNode->mVarStoreId);\r |
| 3704 | #ifdef VFREXP_DEBUG\r |
| 3705 | printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r |
| 3706 | #endif\r |
| 3707 | }\r |
| 3708 | }\r |
| 3709 | \r |
| 3710 | }\r |
| 3711 | \r |
| 3712 | VOID\r |
| 3713 | EfiVfrParser::_DeclareDefaultLinearVarStore (\r |
| 3714 | IN UINT32 LineNo\r |
| 3715 | )\r |
| 3716 | {\r |
| 3717 | UINT32 Index;\r |
| 3718 | CHAR8 **TypeNameList;\r |
| 3719 | UINT32 ListSize;\r |
| 3720 | \r |
| 3721 | gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r |
| 3722 | \r |
| 3723 | for (Index = 0; Index < ListSize; Index++) {\r |
| 3724 | UINT32 Size;\r |
| 3725 | EFI_VARSTORE_ID VarStoreId;\r |
| 3726 | CIfrVarStore VSObj;\r |
| 3727 | \r |
| 3728 | VSObj.SetLineNo (LineNo);\r |
| 3729 | mCVfrDataStorage.DeclareBufferVarStore (\r |
| 3730 | TypeNameList[Index],\r |
| 3731 | &mFormsetGuid,\r |
| 3732 | &gCVfrVarDataTypeDB,\r |
| 3733 | TypeNameList[Index],\r |
| 3734 | EFI_VARSTORE_ID_INVALID\r |
| 3735 | );\r |
| 3736 | mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r |
| 3737 | VSObj.SetVarStoreId (VarStoreId);\r |
| 3738 | gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r |
| 3739 | VSObj.SetSize (Size);\r |
| 3740 | VSObj.SetName (TypeNameList[Index]);\r |
| 3741 | VSObj.SetGuid (&mFormsetGuid);\r |
| 3742 | }\r |
| 3743 | \r |
| 3744 | //\r |
| 3745 | // not required to declare Date and Time VarStore,\r |
| 3746 | // because code to support old format Data and Time\r |
| 3747 | //\r |
| 3748 | if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {\r |
| 3749 | UINT32 Size;\r |
| 3750 | EFI_VARSTORE_ID VarStoreId;\r |
| 3751 | CIfrVarStore VSObj;\r |
| 3752 | \r |
| 3753 | VSObj.SetLineNo (LineNo);\r |
| 3754 | mCVfrDataStorage.DeclareBufferVarStore (\r |
| 3755 | "Date",\r |
| 3756 | &mFormsetGuid,\r |
| 3757 | &gCVfrVarDataTypeDB,\r |
| 3758 | "EFI_HII_DATE",\r |
| 3759 | EFI_VARSTORE_ID_INVALID\r |
| 3760 | );\r |
| 3761 | mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);\r |
| 3762 | VSObj.SetVarStoreId (VarStoreId);\r |
| 3763 | gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);\r |
| 3764 | VSObj.SetSize (Size);\r |
| 3765 | VSObj.SetName ("Date");\r |
| 3766 | VSObj.SetGuid (&mFormsetGuid);\r |
| 3767 | }\r |
| 3768 | \r |
| 3769 | if (gCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {\r |
| 3770 | UINT32 Size;\r |
| 3771 | EFI_VARSTORE_ID VarStoreId;\r |
| 3772 | CIfrVarStore VSObj;\r |
| 3773 | \r |
| 3774 | VSObj.SetLineNo (LineNo);\r |
| 3775 | mCVfrDataStorage.DeclareBufferVarStore (\r |
| 3776 | "Time",\r |
| 3777 | &mFormsetGuid,\r |
| 3778 | &gCVfrVarDataTypeDB,\r |
| 3779 | "EFI_HII_TIME",\r |
| 3780 | EFI_VARSTORE_ID_INVALID\r |
| 3781 | );\r |
| 3782 | mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);\r |
| 3783 | VSObj.SetVarStoreId (VarStoreId);\r |
| 3784 | gCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);\r |
| 3785 | VSObj.SetSize (Size);\r |
| 3786 | VSObj.SetName ("Time");\r |
| 3787 | VSObj.SetGuid (&mFormsetGuid);\r |
| 3788 | }\r |
| 3789 | }\r |
| 3790 | \r |
| 3791 | VOID\r |
| 3792 | EfiVfrParser::_DeclareStandardDefaultStorage (\r |
| 3793 | IN UINT32 LineNo\r |
| 3794 | )\r |
| 3795 | {\r |
| 3796 | //\r |
| 3797 | // Default Store is declared.\r |
| 3798 | //\r |
| 3799 | CIfrDefaultStore DSObj;\r |
| 3800 | \r |
| 3801 | mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r |
| 3802 | DSObj.SetLineNo (LineNo);\r |
| 3803 | DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r |
| 3804 | DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r |
| 3805 | \r |
| 3806 | //\r |
| 3807 | // Default MANUFACTURING Store is declared.\r |
| 3808 | //\r |
| 3809 | CIfrDefaultStore DSObjMF;\r |
| 3810 | \r |
| 3811 | mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r |
| 3812 | DSObjMF.SetLineNo (LineNo);\r |
| 3813 | DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r |
| 3814 | DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r |
| 3815 | }\r |
| 3816 | \r |
| 3817 | VOID\r |
| 3818 | EfiVfrParser::AssignQuestionKey (\r |
| 3819 | IN CIfrQuestionHeader &QHObj,\r |
| 3820 | IN ANTLRTokenPtr KeyTok\r |
| 3821 | )\r |
| 3822 | {\r |
| 3823 | UINT16 KeyValue;\r |
| 3824 | \r |
| 3825 | if (KeyTok == NULL) {\r |
| 3826 | return;\r |
| 3827 | }\r |
| 3828 | \r |
| 3829 | KeyValue = _STOU16 (KeyTok->getText());\r |
| 3830 | \r |
| 3831 | if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r |
| 3832 | /*\r |
| 3833 | * if the question is not CALLBACK ignore the key.\r |
| 3834 | */\r |
| 3835 | _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r |
| 3836 | QHObj.SetQuestionId (KeyValue);\r |
| 3837 | }\r |
| 3838 | }\r |
| 3839 | \r |
| 3840 | VOID\r |
| 3841 | EfiVfrParser::ConvertIdExpr (\r |
| 3842 | IN UINT32 &ExpOpCount,\r |
| 3843 | IN UINT32 LineNo,\r |
| 3844 | IN EFI_QUESTION_ID QId,\r |
| 3845 | IN CHAR8 *VarIdStr,\r |
| 3846 | IN UINT32 BitMask\r |
| 3847 | )\r |
| 3848 | {\r |
| 3849 | CIfrQuestionRef1 QR1Obj(LineNo);\r |
| 3850 | QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r |
| 3851 | _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r |
| 3852 | \r |
| 3853 | if (BitMask != 0) {\r |
| 3854 | CIfrUint32 U32Obj(LineNo);\r |
| 3855 | U32Obj.SetValue (BitMask);\r |
| 3856 | \r |
| 3857 | CIfrBitWiseAnd BWAObj(LineNo);\r |
| 3858 | \r |
| 3859 | CIfrUint8 U8Obj(LineNo);\r |
| 3860 | switch (BitMask) {\r |
| 3861 | case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r |
| 3862 | case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r |
| 3863 | case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r |
| 3864 | case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r |
| 3865 | case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r |
| 3866 | }\r |
| 3867 | \r |
| 3868 | CIfrShiftRight SRObj(LineNo);\r |
| 3869 | }\r |
| 3870 | \r |
| 3871 | ExpOpCount += 4;\r |
| 3872 | }\r |
| 3873 | \r |
| 3874 | VOID\r |
| 3875 | EfiVfrParser::IdEqValDoSpecial (\r |
| 3876 | IN UINT32 &ExpOpCount,\r |
| 3877 | IN UINT32 LineNo,\r |
| 3878 | IN EFI_QUESTION_ID QId,\r |
| 3879 | IN CHAR8 *VarIdStr,\r |
| 3880 | IN UINT32 BitMask,\r |
| 3881 | IN UINT16 ConstVal,\r |
| 3882 | IN EFI_COMPARE_TYPE CompareType\r |
| 3883 | )\r |
| 3884 | {\r |
| 3885 | ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r |
| 3886 | \r |
| 3887 | if (ConstVal > 0xFF) {\r |
| 3888 | CIfrUint16 U16Obj(LineNo);\r |
| 3889 | U16Obj.SetValue (ConstVal);\r |
| 3890 | } else {\r |
| 3891 | CIfrUint8 U8Obj(LineNo);\r |
| 3892 | U8Obj.SetValue ((UINT8)ConstVal);\r |
| 3893 | }\r |
| 3894 | \r |
| 3895 | switch (CompareType) {\r |
| 3896 | case EQUAL :\r |
| 3897 | {\r |
| 3898 | CIfrEqual EObj(LineNo);\r |
| 3899 | break;\r |
| 3900 | }\r |
| 3901 | case LESS_EQUAL :\r |
| 3902 | {\r |
| 3903 | CIfrLessEqual LEObj(LineNo);\r |
| 3904 | break;\r |
| 3905 | }\r |
| 3906 | case LESS_THAN :\r |
| 3907 | {\r |
| 3908 | CIfrLessThan LTObj(LineNo);\r |
| 3909 | break;\r |
| 3910 | }\r |
| 3911 | case GREATER_EQUAL :\r |
| 3912 | {\r |
| 3913 | CIfrGreaterEqual GEObj(LineNo);\r |
| 3914 | break;\r |
| 3915 | }\r |
| 3916 | case GREATER_THAN :\r |
| 3917 | {\r |
| 3918 | CIfrGreaterThan GTObj(LineNo);\r |
| 3919 | break;\r |
| 3920 | }\r |
| 3921 | }\r |
| 3922 | \r |
| 3923 | ExpOpCount += 2;\r |
| 3924 | }\r |
| 3925 | \r |
| 3926 | VOID\r |
| 3927 | EfiVfrParser::IdEqIdDoSpecial (\r |
| 3928 | IN UINT32 &ExpOpCount,\r |
| 3929 | IN UINT32 LineNo,\r |
| 3930 | IN EFI_QUESTION_ID QId1,\r |
| 3931 | IN CHAR8 *VarId1Str,\r |
| 3932 | IN UINT32 BitMask1,\r |
| 3933 | IN EFI_QUESTION_ID QId2,\r |
| 3934 | IN CHAR8 *VarId2Str,\r |
| 3935 | IN UINT32 BitMask2,\r |
| 3936 | IN EFI_COMPARE_TYPE CompareType\r |
| 3937 | )\r |
| 3938 | {\r |
| 3939 | ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r |
| 3940 | ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r |
| 3941 | \r |
| 3942 | switch (CompareType) {\r |
| 3943 | case EQUAL :\r |
| 3944 | {\r |
| 3945 | CIfrEqual EObj(LineNo);\r |
| 3946 | break;\r |
| 3947 | }\r |
| 3948 | case LESS_EQUAL :\r |
| 3949 | {\r |
| 3950 | CIfrLessEqual LEObj(LineNo);\r |
| 3951 | break;\r |
| 3952 | }\r |
| 3953 | case LESS_THAN :\r |
| 3954 | {\r |
| 3955 | CIfrLessThan LTObj(LineNo);\r |
| 3956 | break;\r |
| 3957 | }\r |
| 3958 | case GREATER_EQUAL :\r |
| 3959 | {\r |
| 3960 | CIfrGreaterEqual GEObj(LineNo);\r |
| 3961 | break;\r |
| 3962 | }\r |
| 3963 | case GREATER_THAN :\r |
| 3964 | {\r |
| 3965 | CIfrGreaterThan GTObj(LineNo);\r |
| 3966 | break;\r |
| 3967 | }\r |
| 3968 | }\r |
| 3969 | \r |
| 3970 | ExpOpCount++;\r |
| 3971 | }\r |
| 3972 | \r |
| 3973 | VOID\r |
| 3974 | EfiVfrParser::IdEqListDoSpecial (\r |
| 3975 | IN UINT32 &ExpOpCount,\r |
| 3976 | IN UINT32 LineNo,\r |
| 3977 | IN EFI_QUESTION_ID QId,\r |
| 3978 | IN CHAR8 *VarIdStr,\r |
| 3979 | IN UINT32 BitMask,\r |
| 3980 | IN UINT16 ListLen,\r |
| 3981 | IN UINT16 *ValueList\r |
| 3982 | )\r |
| 3983 | {\r |
| 3984 | UINT16 Index;\r |
| 3985 | \r |
| 3986 | if (ListLen == 0) {\r |
| 3987 | return;\r |
| 3988 | }\r |
| 3989 | \r |
| 3990 | IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r |
| 3991 | for (Index = 1; Index < ListLen; Index++) {\r |
| 3992 | IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r |
| 3993 | CIfrOr OObj (LineNo);\r |
| 3994 | ExpOpCount++;\r |
| 3995 | }\r |
| 3996 | }\r |
| 3997 | \r |
| 3998 | //\r |
| 3999 | // For framework vfr compatibility\r |
| 4000 | //\r |
| 4001 | VOID\r |
| 4002 | EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r |
| 4003 | {\r |
| 4004 | mCompatibleMode = Mode;\r |
| 4005 | mCVfrQuestionDB.SetCompatibleMode (Mode);\r |
| 4006 | }\r |
| 4007 | >>\r |