]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Remove obsolete PCDs (new ones are moved to MdePkg and MdeModulePkg)
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
CommitLineData
97fa0ee9
YL
1/*++ @file\r
2Vfr Syntax\r
3\r
e4ac870f 4Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
40d841f6 5This program and the accompanying materials\r
30fdf114
LG
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
30fdf114
LG
13--*/\r
14\r
15#header<<\r
16\r
17#include "EfiVfr.h"\r
18#include "VfrFormPkg.h"\r
19#include "VfrError.h"\r
20#include "VfrUtilityLib.h"\r
21#include "AToken.h"\r
22#include "ATokPtr.h"\r
23>>\r
24\r
25<<\r
26#include "stdio.h"\r
27#include "PBlackBox.h"\r
28#include "DLexerBase.h"\r
29#include "VfrLexer.h"\r
30#include "AToken.h"\r
31\r
32#define GET_LINENO(Obj) ((Obj)->getLine())\r
33#define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)\r
34#define CRT_END_OP(Obj) {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)\r
35\r
36typedef ANTLRCommonToken ANTLRToken;\r
37\r
38class CVfrDLGLexer : public VfrLexer\r
39{\r
40public:\r
41 CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};\r
42 INT32 errstd (char *Text)\r
43 {\r
44 printf ("unrecognized input '%s'\n", Text);\r
45 }\r
46};\r
47\r
48UINT8\r
49VfrParserStart (\r
50 IN FILE *File,\r
4234283c 51 IN INPUT_INFO_TO_SYNTAX *InputInfo\r
30fdf114
LG
52 )\r
53{\r
54 ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r
4234283c
LG
55 VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode);\r
56 VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid);\r
30fdf114
LG
57 return VfrParser.parser()->vfrProgram();\r
58}\r
59>>\r
60\r
61//\r
62// Define a lexical class for parsing quoted strings. Basically\r
63// starts with a double quote, and ends with a double quote that\r
64// is not preceeded with a backslash.\r
65//\r
66#lexclass QUOTED_STRING\r
67#token TheString "~[\"]*\"" << mode (START); >>\r
68\r
69//\r
70// Define a lexclass for skipping over C++ style comments\r
71//\r
72#lexclass CPP_COMMENT\r
73#token "~[\n]*" << skip (); >>\r
74#token "\n" << skip (); mode (START); newline (); >>\r
75\r
76//\r
77// Standard lexclass is START\r
78//\r
79#lexclass START\r
80\r
81//\r
82// Find start of C++ style comments\r
83//\r
84#token "//" << skip (); mode (CPP_COMMENT); >>\r
85\r
86//\r
87// Skip whitespace\r
88//\r
89#token "[\ \t]" << skip (); >>\r
90\r
91//\r
92// Skip over newlines, but count them\r
93//\r
94#token "\n" << skip (); newline (); >>\r
95\r
96//\r
97// Skip over 'extern' in any included .H file\r
98//\r
99#token "extern" << skip (); mode (CPP_COMMENT); >>\r
100\r
101//\r
102// Tokens for the different keywords. Syntax is:\r
103// TokenName("ErrorMessageText") "TokenString"\r
104// where:\r
105// TokenName is the token name (must be capitalized) that is used in the rules\r
106// ErrorMessageText is the string the compiler emits when it detects a syntax error\r
107// TokenString is the actual matching string used in the user script\r
108//\r
109#token FormPkgType("formpkgtype") "formpkgtype"\r
110#token OpenBrace("{") "\{"\r
111#token CloseBrace("}") "\}"\r
112#token OpenParen("(") "\("\r
113#token CloseParen(")") "\)"\r
114#token OpenBracket("[") "\["\r
115#token CloseBracket("]") "\]"\r
116\r
117#token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >>\r
118#token DevicePath("devicepath") "devicepath"\r
119#token FormSet("formset") "formset"\r
120#token FormSetId("formsetid") "formsetid"\r
121#token EndFormSet("endformset") "endformset"\r
122#token Title("title") "title"\r
123#token FormId("formid") "formid"\r
124#token OneOf("oneof") "oneof"\r
125#token EndOneOf("endoneof") "endoneof"\r
126#token Prompt("prompt") "prompt"\r
127#token OrderedList("orderedlist") "orderedlist"\r
128#token MaxContainers("maxcontainers") "maxcontainers"\r
129#token EndList("endlist") "endlist"\r
130#token EndForm("endform") "endform"\r
131#token Form("form") "form"\r
52302d4d
LG
132#token FormMap("formmap") "formmap"\r
133#token MapTitle("maptitle") "maptitle"\r
134#token MapGuid("mapguid") "mapguid"\r
30fdf114 135#token Subtitle("subtitle") "subtitle"\r
e8a47801 136#token EndSubtitle("endsubtitle") "endsubtitle"\r
30fdf114
LG
137#token Help("help") "help"\r
138#token Text("text") "text"\r
139#token Option("option") "option"\r
140#token FLAGS("flags") "flags"\r
141#token Date("date") "date"\r
142#token EndDate("enddate") "enddate"\r
143#token Year("year") "year"\r
144#token Month("month") "month"\r
145#token Day("day") "day"\r
146#token Time("time") "time"\r
147#token EndTime("endtime") "endtime"\r
148#token Hour("hour") "hour"\r
149#token Minute("minute") "minute"\r
150#token Second("second") "second"\r
151#token GrayOutIf("grayoutif") "grayoutif"\r
152#token Label("label") "label"\r
153#token Timeout("timeout") "timeout"\r
154#token Inventory("inventory") "inventory"\r
155#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"\r
156#token Struct("struct") "struct"\r
157#token Boolean("BOOLEAN") "BOOLEAN"\r
158#token Uint64("UINT64") "UINT64"\r
159#token Uint32("UINT32") "UINT32"\r
160#token Uint16("UINT16") "UINT16"\r
161#token Char16("CHAR16") "CHAR16"\r
162#token Uint8("UINT8") "UINT8"\r
163#token Uuid("guid") "guid"\r
164#token CheckBox("checkbox") "checkbox"\r
165#token EndCheckBox("endcheckbox") "endcheckbox"\r
166#token Numeric("numeric") "numeric"\r
167#token EndNumeric("endnumeric") "endnumeric"\r
168#token Minimum("minimum") "minimum"\r
169#token Maximum("maximum") "maximum"\r
170#token STEP("step") "step"\r
171#token Default("default") "default"\r
172#token Password("password") "password"\r
173#token EndPassword("endpassword") "endpassword"\r
174#token String("string") "string"\r
175#token EndString("endstring") "endstring"\r
176#token MinSize("minsize") "minsize"\r
177#token MaxSize("maxsize") "maxsize"\r
178#token Encoding("encoding") "encoding"\r
179#token SuppressIf("suppressif") "suppressif"\r
180#token DisableIf("disableif") "disableif"\r
181#token Hidden("hidden") "hidden"\r
182#token Goto("goto") "goto"\r
183#token FormSetGuid("formsetguid") "formsetguid"\r
184#token InconsistentIf("inconsistentif") "inconsistentif"\r
ea0f6464 185#token WarningIf("warningif") "warningif"\r
30fdf114
LG
186#token NoSubmitIf("nosubmitif") "nosubmitif"\r
187#token EndIf("endif") "endif"\r
188#token Key("key") "key"\r
189#token DefaultFlag("DEFAULT") "DEFAULT"\r
190#token ManufacturingFlag("MANUFACTURING") "MANUFACTURING"\r
191#token InteractiveFlag("INTERACTIVE") "INTERACTIVE"\r
192#token NVAccessFlag("NV_ACCESS") "NV_ACCESS"\r
193#token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"\r
194#token LateCheckFlag("LATE_CHECK") "LATE_CHECK"\r
195#token ReadOnlyFlag("READ_ONLY") "READ_ONLY"\r
196#token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"\r
197#token Class("class") "class"\r
198#token Subclass("subclass") "subclass"\r
199#token ClassGuid("classguid") "classguid"\r
200#token TypeDef("typedef") "typedef"\r
201#token Restore("restore") "restore"\r
202#token Save("save") "save"\r
203#token Defaults("defaults") "defaults"\r
204#token Banner("banner") "banner"\r
205#token Align("align") "align"\r
206#token Left("left") "left"\r
207#token Right("right") "right"\r
208#token Center("center") "center"\r
209#token Line("line") "line"\r
210#token Name("name") "name"\r
211\r
212#token VarId("varid") "varid"\r
213#token Question("question") "question"\r
214#token QuestionId("questionid") "questionid"\r
215#token Image("image") "image"\r
216#token Locked("locked") "locked"\r
217#token Rule("rule") "rule"\r
218#token EndRule("endrule") "endrule"\r
219#token Value("value") "value"\r
52302d4d
LG
220#token Read("read") "read"\r
221#token Write("write") "write"\r
30fdf114
LG
222#token ResetButton("resetbutton") "resetbutton"\r
223#token EndResetButton("endresetbutton") "endresetbutton"\r
224#token DefaultStore("defaultstore") "defaultstore"\r
225#token Attribute("attribute") "attribute"\r
226#token Varstore("varstore") "varstore"\r
227#token Efivarstore("efivarstore") "efivarstore"\r
228#token VarSize("varsize") "varsize"\r
229#token NameValueVarStore("namevaluevarstore") "namevaluevarstore"\r
230#token Action("action") "action"\r
231#token Config("config") "config"\r
232#token EndAction("endaction") "endaction"\r
233#token Refresh("refresh") "refresh"\r
234#token Interval("interval") "interval"\r
235#token VarstoreDevice("varstoredevice") "varstoredevice"\r
da92f276
LG
236#token GuidOp("guidop") "guidop"\r
237#token EndGuidOp("endguidop") "endguidop"\r
238#token DataType("datatype") "datatype"\r
239#token Data("data") "data"\r
4234283c 240#token Modal("modal") "modal"\r
da92f276 241\r
30fdf114
LG
242//\r
243// Define the class and subclass tokens\r
244//\r
245#token ClassNonDevice("NONDEVICE") "NON_DEVICE"\r
246#token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE"\r
247#token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE"\r
248#token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE"\r
249#token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE"\r
250#token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE"\r
251#token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE"\r
252\r
253#token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION"\r
254#token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION"\r
255#token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE"\r
256#token SubclassSingleUse("SINGLE_USE") "SINGLE_USE"\r
257\r
258//\r
259// This is the overall definition of a VFR form definition script.\r
260//\r
261\r
262vfrProgram > [UINT8 Return] :\r
263 <<\r
52302d4d
LG
264 mParserStatus = 0;\r
265 mCIfrOpHdrIndex = 0;\r
30fdf114
LG
266 mConstantOnlyInExpression = FALSE;\r
267 >>\r
268 (\r
269 vfrPragmaPackDefinition\r
270 | vfrDataStructDefinition\r
271 )*\r
272 vfrFormSetDefinition\r
273 << $Return = mParserStatus; >>\r
274 ;\r
275\r
276pragmaPackShowDef :\r
277 L:"show" << gCVfrVarDataTypeDB.Pack (L->getLine(), VFR_PACK_SHOW); >>\r
278 ;\r
279\r
280pragmaPackStackDef :\r
281 <<\r
282 UINT32 LineNum;\r
283 UINT8 PackAction;\r
284 CHAR8 *Identifier = NULL;\r
285 UINT32 PackNumber = DEFAULT_PACK_ALIGN;\r
286 >>\r
287 (\r
288 L1:"push" << LineNum = L1->getLine(); PackAction = VFR_PACK_PUSH; >>\r
289 | L2:"pop" << LineNum = L2->getLine(); PackAction = VFR_PACK_POP; >>\r
290 )\r
291 {\r
292 "," ID:StringIdentifier << Identifier = ID->getText(); >>\r
293 }\r
294 {\r
e4ac870f 295 "," N:Number << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText(), N->getLine()); >>\r
30fdf114
LG
296 }\r
297 << gCVfrVarDataTypeDB.Pack (LineNum, PackAction, Identifier, PackNumber); >>\r
298 ;\r
299\r
300pragmaPackNumber :\r
301 <<\r
302 UINT32 LineNum;\r
303 UINT32 PackNumber = DEFAULT_PACK_ALIGN;\r
304 >>\r
e4ac870f 305 N:Number << LineNum = N->getLine(); PackNumber = _STOU32(N->getText(), N->getLine()); >>\r
30fdf114
LG
306 << gCVfrVarDataTypeDB.Pack (LineNum, VFR_PACK_ASSIGN, NULL, PackNumber); >>\r
307 ;\r
308\r
309vfrPragmaPackDefinition :\r
310 "\#pragma" "pack" "\("\r
311 {\r
312 pragmaPackShowDef\r
313 | pragmaPackStackDef\r
314 | pragmaPackNumber\r
315 }\r
316 "\)"\r
317 ;\r
318\r
319vfrDataStructDefinition :\r
320 { TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
321 { NonNvDataMap }\r
322 {\r
323 N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
324 }\r
325 OpenBrace\r
326 vfrDataStructFields\r
327 CloseBrace\r
328 {\r
329 N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
330 }\r
331 ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
332 ;\r
333\r
334vfrDataStructFields :\r
335 (\r
336 dataStructField64 |\r
337 dataStructField32 |\r
338 dataStructField16 |\r
339 dataStructField8 |\r
340 dataStructFieldBool |\r
341 dataStructFieldString |\r
342 dataStructFieldDate |\r
343 dataStructFieldTime |\r
4234283c 344 dataStructFieldRef |\r
30fdf114
LG
345 dataStructFieldUser\r
346 )*\r
347 ;\r
348\r
349dataStructField64 :\r
350 << UINT32 ArrayNum = 0; >>\r
52302d4d 351 D:"UINT64"\r
30fdf114
LG
352 N:StringIdentifier\r
353 {\r
e4ac870f 354 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 355 }\r
52302d4d 356 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
357 ;\r
358\r
359dataStructField32 :\r
360 << UINT32 ArrayNum = 0; >>\r
52302d4d 361 D:"UINT32"\r
30fdf114
LG
362 N:StringIdentifier\r
363 {\r
e4ac870f 364 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 365 }\r
52302d4d 366 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
367 ;\r
368\r
369dataStructField16 :\r
52302d4d
LG
370 << \r
371 UINT32 ArrayNum = 0; \r
372 >>\r
30fdf114
LG
373 ("UINT16" | "CHAR16")\r
374 N:StringIdentifier\r
375 {\r
e4ac870f 376 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 377 }\r
52302d4d 378 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
30fdf114
LG
379 ;\r
380\r
381dataStructField8 :\r
382 << UINT32 ArrayNum = 0; >>\r
52302d4d 383 D:"UINT8"\r
30fdf114
LG
384 N:StringIdentifier\r
385 {\r
e4ac870f 386 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 387 }\r
52302d4d 388 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
389 ;\r
390\r
391dataStructFieldBool :\r
392 << UINT32 ArrayNum = 0; >>\r
52302d4d 393 D:"BOOLEAN"\r
30fdf114
LG
394 N:StringIdentifier\r
395 {\r
e4ac870f 396 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 397 }\r
52302d4d 398 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
399 ;\r
400\r
401dataStructFieldString :\r
402 << UINT32 ArrayNum = 0; >>\r
52302d4d 403 D:"EFI_STRING_ID"\r
30fdf114
LG
404 N:StringIdentifier\r
405 {\r
e4ac870f 406 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 407 }\r
52302d4d 408 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
409 ;\r
410\r
411dataStructFieldDate :\r
412 << UINT32 ArrayNum = 0; >>\r
52302d4d 413 D:"EFI_HII_DATE"\r
30fdf114
LG
414 N:StringIdentifier\r
415 {\r
e4ac870f 416 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 417 }\r
52302d4d 418 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
419 ;\r
420\r
421dataStructFieldTime :\r
422 << UINT32 ArrayNum = 0; >>\r
52302d4d 423 D:"EFI_HII_TIME"\r
30fdf114
LG
424 N:StringIdentifier\r
425 {\r
e4ac870f 426 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114 427 }\r
52302d4d 428 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
30fdf114
LG
429 ;\r
430\r
4234283c
LG
431dataStructFieldRef :\r
432 << UINT32 ArrayNum = 0; >>\r
433 D:"EFI_HII_REF"\r
434 N:StringIdentifier\r
435 {\r
e4ac870f 436 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
4234283c
LG
437 }\r
438 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
439 ;\r
440\r
30fdf114
LG
441dataStructFieldUser :\r
442 << UINT32 ArrayNum = 0; >>\r
443 T:StringIdentifier\r
444 N:StringIdentifier\r
445 {\r
e4ac870f 446 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
30fdf114
LG
447 }\r
448 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r
449 ;\r
450\r
451//*****************************************************************************\r
452//\r
453// the syntax of GUID definition\r
454//\r
455guidSubDefinition [EFI_GUID &Guid] :\r
456 G4:Number "," G5:Number "," G6:Number "," G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
457 <<\r
e4ac870f
LG
458 Guid.Data4[0] = _STOU8(G4->getText(), G4->getLine());\r
459 Guid.Data4[1] = _STOU8(G5->getText(), G5->getLine());\r
460 Guid.Data4[2] = _STOU8(G6->getText(), G6->getLine());\r
461 Guid.Data4[3] = _STOU8(G7->getText(), G7->getLine());\r
462 Guid.Data4[4] = _STOU8(G8->getText(), G8->getLine());\r
463 Guid.Data4[5] = _STOU8(G9->getText(), G9->getLine());\r
464 Guid.Data4[6] = _STOU8(G10->getText(), G10->getLine());\r
465 Guid.Data4[7] = _STOU8(G11->getText(), G11->getLine());\r
30fdf114
LG
466 >>\r
467 ;\r
468\r
469guidDefinition [EFI_GUID &Guid] :\r
470 OpenBrace\r
471 G1:Number "," G2:Number "," G3:Number ","\r
472 <<\r
e4ac870f
LG
473 Guid.Data1 = _STOU32 (G1->getText(), G1->getLine());\r
474 Guid.Data2 = _STOU16 (G2->getText(), G2->getLine());\r
475 Guid.Data3 = _STOU16 (G3->getText(), G3->getLine());\r
30fdf114
LG
476 >>\r
477 (\r
478 OpenBrace guidSubDefinition[Guid] CloseBrace\r
479 | guidSubDefinition[Guid]\r
480 )\r
481 CloseBrace\r
482 ;\r
483\r
484//*****************************************************************************\r
485//\r
486// the syntax of form set definition\r
487//\r
488vfrFormSetDefinition :\r
489 <<\r
490 EFI_GUID Guid;\r
491 EFI_GUID DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID;\r
492 EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3;\r
493 UINT8 ClassGuidNum = 0;\r
494 CIfrFormSet *FSObj = NULL;\r
495 UINT16 C, SC;\r
4afd3d04 496 CHAR8* InsertOpcodeAddr = NULL;\r
30fdf114
LG
497 >>\r
498 L:FormSet\r
499 Uuid "=" guidDefinition[Guid] ","\r
500 Title "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
501 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" ","\r
502 {\r
503 ClassGuid "=" guidDefinition[ClassGuid1] << ++ClassGuidNum; >>\r
504 {\r
15be099a
ED
505 "\|" guidDefinition[ClassGuid2] << ++ClassGuidNum; >>\r
506 {\r
507 "\|" guidDefinition[ClassGuid3] << ++ClassGuidNum; >>\r
508 }\r
30fdf114
LG
509 }\r
510 ","\r
511 }\r
512 <<\r
4234283c
LG
513 if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) {\r
514 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!");\r
515 }\r
30fdf114
LG
516 switch (ClassGuidNum) {\r
517 case 0:\r
4234283c
LG
518 if (mOverrideClassGuid != NULL) {\r
519 ClassGuidNum = 2;\r
520 } else {\r
521 ClassGuidNum = 1;\r
522 }\r
523 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
30fdf114 524 FSObj->SetClassGuid(&DefaultClassGuid);\r
4234283c
LG
525 if (mOverrideClassGuid != NULL) {\r
526 FSObj->SetClassGuid(mOverrideClassGuid);\r
0d2711a6 527 }\r
30fdf114
LG
528 break;\r
529 case 1:\r
4234283c
LG
530 if (mOverrideClassGuid != NULL) {\r
531 ClassGuidNum ++;\r
0d2711a6 532 }\r
52302d4d 533 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
30fdf114 534 FSObj->SetClassGuid(&ClassGuid1);\r
4234283c
LG
535 if (mOverrideClassGuid != NULL) {\r
536 FSObj->SetClassGuid(mOverrideClassGuid);\r
0d2711a6 537 }\r
30fdf114
LG
538 break;\r
539 case 2:\r
4234283c
LG
540 if (mOverrideClassGuid != NULL) {\r
541 ClassGuidNum ++;\r
0d2711a6 542 }\r
52302d4d 543 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
30fdf114
LG
544 FSObj->SetClassGuid(&ClassGuid1);\r
545 FSObj->SetClassGuid(&ClassGuid2);\r
4234283c
LG
546 if (mOverrideClassGuid != NULL) {\r
547 FSObj->SetClassGuid(mOverrideClassGuid);\r
0d2711a6 548 }\r
30fdf114 549 break;\r
52302d4d
LG
550 case 3:\r
551 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));\r
30fdf114
LG
552 FSObj->SetClassGuid(&ClassGuid1);\r
553 FSObj->SetClassGuid(&ClassGuid2);\r
554 FSObj->SetClassGuid(&ClassGuid3);\r
555 break;\r
52302d4d
LG
556 default:\r
557 break;\r
30fdf114
LG
558 }\r
559\r
560 SET_LINE_INFO (*FSObj, L);\r
561 FSObj->SetGuid (&Guid);\r
562 //\r
563 // for framework vfr to store formset guid used by varstore and efivarstore\r
564 //\r
565 if (mCompatibleMode) {\r
566 memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));\r
567 }\r
e4ac870f
LG
568 FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine()));\r
569 FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
570 >>\r
571 {\r
572 FC:Class "=" classDefinition[C] "," << {CIfrClass CObj;SET_LINE_INFO (CObj, FC); CObj.SetClass(C);} >>\r
573 }\r
574 {\r
575 FSC:Subclass "=" subclassDefinition[SC] "," << {CIfrSubClass SCObj; SET_LINE_INFO (SCObj, FSC); SCObj.SetSubClass(SC);} >>\r
576 }\r
577 <<\r
578 _DeclareStandardDefaultStorage (GET_LINENO (L));\r
579 >>\r
580 vfrFormSetList\r
581 E:EndFormSet <<\r
582 if (mCompatibleMode) {\r
583 //\r
584 // declare all undefined varstore and efivarstore\r
585 //\r
586 _DeclareDefaultFrameworkVarStore (GET_LINENO(E));\r
587 }\r
4afd3d04
LG
588 \r
589 //\r
590 // Declare undefined Question so that they can be used in expression.\r
591 //\r
592 if (gCFormPkg.HavePendingUnassigned()) {\r
593 mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
594 gCVfrVarDataTypeDB,\r
595 mCVfrDataStorage,\r
596 mCVfrQuestionDB,\r
597 &mFormsetGuid,\r
598 E->getLine(),\r
599 &InsertOpcodeAddr\r
600 );\r
601 gNeedAdjustOpcode = TRUE;\r
602 }\r
603\r
604 CRT_END_OP (E);\r
605\r
606 //\r
607 // Adjust the pending question position.\r
608 // Move the position from current to before the end of the last form in the form set.\r
609 //\r
610 if (gNeedAdjustOpcode) {\r
611 gCFormPkg.AdjustDynamicInsertOpcode (\r
612 mLastFormEndAddr,\r
613 InsertOpcodeAddr\r
614 );\r
615 }\r
616\r
617 if (FSObj != NULL) {\r
618 delete FSObj;\r
619 }\r
30fdf114
LG
620 >>\r
621 ";"\r
622 ;\r
623\r
624vfrFormSetList :\r
625 (\r
626 vfrFormDefinition |\r
52302d4d 627 vfrFormMapDefinition |\r
30fdf114
LG
628 vfrStatementImage |\r
629 vfrStatementVarStoreLinear |\r
630 vfrStatementVarStoreEfi |\r
631 vfrStatementVarStoreNameValue |\r
632 vfrStatementDefaultStore |\r
a709adfa 633 vfrStatementDisableIfFormSet |\r
da92f276
LG
634 vfrStatementSuppressIfFormSet |\r
635 vfrStatementExtension\r
30fdf114
LG
636 )*\r
637 ;\r
638\r
da92f276
LG
639vfrStatementExtension:\r
640 << \r
641 EFI_GUID Guid;\r
642 CIfrGuid *GuidObj = NULL;\r
643 CHAR8 *TypeName = NULL;\r
644 UINT32 TypeSize = 0;\r
645 UINT8 *DataBuff = NULL;\r
646 UINT32 Size = 0;\r
647 UINT8 Idx = 0;\r
648 UINT32 LineNum;\r
649 BOOLEAN IsStruct = FALSE;\r
650 UINT32 ArrayNum = 0;\r
651 >>\r
652 L:GuidOp\r
653 Uuid "=" guidDefinition[Guid]\r
654 {"," DataType "=" \r
655 (\r
e4ac870f 656 U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText(), AN1->getLine());>>}\r
da92f276 657 << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
e4ac870f 658 | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>}\r
da92f276 659 << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
e4ac870f 660 | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>}\r
da92f276 661 << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
e4ac870f 662 | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>}\r
da92f276 663 << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
e4ac870f 664 | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>}\r
da92f276 665 << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
e4ac870f 666 | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>}\r
da92f276 667 << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
e4ac870f 668 | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>}\r
da92f276 669 << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
e4ac870f 670 | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>}\r
da92f276 671 << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
e4ac870f 672 | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>}\r
4234283c 673 << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> \r
e4ac870f 674 | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>}\r
da92f276
LG
675 << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
676 )\r
677 <<\r
678 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
679 if (ArrayNum > 0) {\r
680 Size = TypeSize*ArrayNum;\r
681 } else {\r
682 Size = TypeSize;\r
683 }\r
684 if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
685 DataBuff = (UINT8 *)malloc(Size);\r
686 for (Idx = 0; Idx < Size; Idx++) {\r
687 DataBuff[Idx] = 0;\r
688 }\r
689 >>\r
690 vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
691 }\r
692 <<\r
693 {\r
694 GuidObj = new CIfrGuid(Size);\r
695 if (GuidObj != NULL) {\r
696 GuidObj->SetLineNo(L->getLine());\r
697 GuidObj->SetGuid (&Guid);\r
698 }\r
699 }\r
700 if (TypeName != NULL) {\r
701 GuidObj->SetData(DataBuff, Size);\r
702 }\r
703 >>\r
704 {","\r
705 (\r
706 vfrStatementExtension\r
707 )*\r
708 E:EndGuidOp << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
709 }\r
710 <<\r
711 if (GuidObj != NULL) delete GuidObj;\r
712 if (DataBuff != NULL) free(DataBuff);\r
713 >>\r
714 ";"\r
715;\r
716\r
717vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
718 <<\r
719 CHAR8 *TFName = NULL;\r
720 UINT32 ArrayIdx = 0;\r
721 UINT16 FieldOffset;\r
722 UINT8 FieldType;\r
723 UINT32 FieldSize;\r
724 UINT64 Data_U64 = 0;\r
725 UINT32 Data_U32 = 0;\r
726 UINT16 Data_U16 = 0;\r
727 UINT8 Data_U8 = 0;\r
728 BOOLEAN Data_BL = 0;\r
729 EFI_STRING_ID Data_SID = 0;\r
730 BOOLEAN IsArray = FALSE;\r
731 UINT8 *ByteOffset = NULL;\r
732 >>\r
733(\r
734 ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
735 <<\r
736 ArrayIdx = 0;\r
737 if (IsArray == TRUE) {\r
e4ac870f 738 ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine());\r
da92f276
LG
739 if (ArrayIdx >= ArrayNum) return;\r
740 IsArray = FALSE;\r
741 }\r
742 ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
743 if (IsStruct == TRUE) {\r
744 _STRCAT(&TFName, TypeName);\r
745 }\r
746 >>\r
747 ("." FN:StringIdentifier\r
748 <<\r
749 if (IsStruct == TRUE) {\r
750 _STRCAT(&TFName, ".");\r
751 _STRCAT(&TFName, FN->getText());\r
752 }\r
753 >>\r
754 {\r
755 OpenBracket IDX2:Number CloseBracket\r
756 <<\r
757 if (IsStruct == TRUE) {\r
758 _STRCAT(&TFName, "[");\r
759 _STRCAT(&TFName, IDX2->getText());\r
760 _STRCAT(&TFName, "]");\r
761 }\r
762 >>\r
763 }\r
764 )*\r
765 "=" RD:Number\r
766 <<\r
767 if (IsStruct == FALSE) {\r
768 if (strcmp ("UINT64", TypeName) == 0) {\r
e4ac870f 769 Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
da92f276
LG
770 memcpy (ByteOffset, &Data_U64, TypeSize);\r
771 }else if (strcmp ("UINT32", TypeName) == 0) {\r
e4ac870f 772 Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
da92f276
LG
773 memcpy (ByteOffset, &Data_U32, TypeSize); \r
774 }else if (strcmp ("UINT16", TypeName) == 0) {\r
e4ac870f 775 Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
da92f276
LG
776 memcpy (ByteOffset, &Data_U16, TypeSize); \r
777 }else if (strcmp ("UINT8", TypeName) == 0) {\r
e4ac870f 778 Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
779 memcpy (ByteOffset, &Data_U8, TypeSize); \r
780 }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
e4ac870f 781 Data_BL = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
782 memcpy (ByteOffset, &Data_BL, TypeSize); \r
783 }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
e4ac870f 784 Data_SID = _STOSID(RD->getText(), RD->getLine());\r
da92f276
LG
785 memcpy (ByteOffset, &Data_SID, TypeSize); \r
786 }\r
787 } else {\r
788 gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
789 switch (FieldType) {\r
790 case EFI_IFR_TYPE_NUM_SIZE_8:\r
e4ac870f 791 Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
792 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
793 break;\r
794 case EFI_IFR_TYPE_NUM_SIZE_16:\r
e4ac870f 795 Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
da92f276
LG
796 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
797 break;\r
798 case EFI_IFR_TYPE_NUM_SIZE_32:\r
e4ac870f 799 Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
da92f276
LG
800 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
801 break;\r
802 case EFI_IFR_TYPE_NUM_SIZE_64:\r
e4ac870f 803 Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
da92f276
LG
804 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
805 break;\r
806 case EFI_IFR_TYPE_BOOLEAN:\r
e4ac870f 807 Data_BL = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
808 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
809 break;\r
810 case EFI_IFR_TYPE_STRING:\r
e4ac870f 811 Data_SID = _STOSID(RD->getText(), RD->getLine());\r
da92f276
LG
812 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
813 break;\r
814 default:\r
815 break;\r
816 }\r
817 }\r
818 if (TFName != NULL) { delete TFName; TFName = NULL; }\r
819 >>\r
820 )*\r
821)\r
822;\r
823\r
824\r
30fdf114
LG
825vfrStatementDefaultStore :\r
826 << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
827 D:DefaultStore N:StringIdentifier ","\r
828 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"\r
829 {\r
e4ac870f 830 "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >>\r
30fdf114
LG
831 }\r
832 <<\r
833 if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
834 CIfrDefaultStore DSObj;\r
e4ac870f 835 _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
30fdf114 836 DSObj.SetLineNo(D->getLine());\r
e4ac870f 837 DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));\r
30fdf114
LG
838 DSObj.SetDefaultId (DefaultId);\r
839 } else {\r
e4ac870f 840 _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
30fdf114
LG
841 }\r
842 >>\r
843 ";"\r
844 ;\r
845\r
846vfrStatementVarStoreLinear :\r
847 <<\r
848 EFI_GUID Guid;\r
849 CIfrVarStore VSObj;\r
850 CHAR8 *TypeName;\r
851 CHAR8 *StoreName;\r
852 UINT32 LineNum;\r
853 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
854 UINT32 Size;\r
855 >>\r
856 V:Varstore << VSObj.SetLineNo(V->getLine()); >>\r
857 (\r
858 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
52302d4d
LG
859 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
860 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
861 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
862 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
863 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
864 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
865 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
4234283c 866 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>\r
30fdf114
LG
867 )\r
868 { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
869 if (mCompatibleMode) {\r
e4ac870f 870 VarStoreId = _STOU16(FID->getText(), FID->getLine());\r
30fdf114
LG
871 }\r
872 >>\r
873 }\r
874 {\r
875 VarId "=" ID:Number "," <<\r
876 _PCATCH(\r
e4ac870f 877 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
30fdf114
LG
878 (INTN)TRUE,\r
879 ID,\r
880 "varid 0 is not allowed."\r
881 );\r
882 >>\r
883 }\r
884 Name "=" SN:StringIdentifier ","\r
885 Uuid "=" guidDefinition[Guid]\r
886 <<\r
887 if (mCompatibleMode) {\r
888 StoreName = TypeName;\r
889 } else {\r
890 StoreName = SN->getText();\r
891 }\r
892 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
893 StoreName,\r
894 &Guid,\r
895 &gCVfrVarDataTypeDB,\r
896 TypeName,\r
897 VarStoreId\r
898 ), LineNum);\r
30fdf114 899 VSObj.SetGuid (&Guid);\r
4afd3d04 900 _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
30fdf114
LG
901 VSObj.SetVarStoreId (VarStoreId);\r
902 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
52302d4d 903 VSObj.SetSize ((UINT16) Size);\r
df1780f8 904 VSObj.SetName (SN->getText());\r
30fdf114
LG
905 >>\r
906 ";"\r
907 ;\r
908\r
909vfrStatementVarStoreEfi :\r
910 <<\r
4234283c 911 BOOLEAN IsUEFI23EfiVarstore = TRUE;\r
30fdf114
LG
912 EFI_GUID Guid;\r
913 CIfrVarStoreEfi VSEObj;\r
4234283c 914 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114 915 UINT32 Attr = 0;\r
4234283c
LG
916 UINT32 Size;\r
917 CHAR8 *TypeName;\r
918 UINT32 LineNum;\r
919 CHAR8 *StoreName = NULL;\r
5c7956a2 920 BOOLEAN CustomizedName = FALSE;\r
30fdf114
LG
921 >>\r
922 E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r
4234283c 923 (\r
5c7956a2 924 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>\r
4234283c
LG
925 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
926 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
927 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
928 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
929 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
930 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
931 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
932 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> \r
933 )\r
934 {\r
935 VarId "=" ID:Number "," <<\r
936 _PCATCH(\r
e4ac870f 937 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
4234283c
LG
938 (INTN)TRUE,\r
939 ID,\r
940 "varid 0 is not allowed."\r
941 );\r
942 >>\r
943 }\r
30fdf114
LG
944 Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","\r
945 << VSEObj.SetAttributes (Attr); >>\r
4234283c
LG
946\r
947 (\r
948 Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >>\r
949 |\r
950 Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," \r
951 VarSize "=" N:Number "," << \r
952 IsUEFI23EfiVarstore = FALSE;\r
e4ac870f 953 StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText(), VN->getLine()));\r
4234283c
LG
954 if (StoreName == NULL) {\r
955 _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");\r
956 }\r
5c7956a2
ED
957 if (!CustomizedName) {\r
958 _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!");\r
959 return;\r
960 }\r
e4ac870f 961 Size = _STOU32(N->getText(), N->getLine());\r
4234283c
LG
962 switch (Size) {\r
963 case 1:\r
964 TypeName = (CHAR8 *) "UINT8";\r
965 break;\r
966 case 2:\r
967 TypeName = (CHAR8 *) "UINT16";\r
968 break;\r
969 case 4:\r
970 TypeName = (CHAR8 *) "UINT32";\r
971 break;\r
972 case 8:\r
973 TypeName = (CHAR8 *) "UINT64";\r
974 break; \r
975 default:\r
976 _PCATCH (VFR_RETURN_UNSUPPORTED, N);\r
977 break;\r
978 }\r
979 >>\r
980 )\r
981\r
982 Uuid "=" guidDefinition[Guid] << \r
983 if (IsUEFI23EfiVarstore) {\r
984 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
985 StoreName,\r
986 &Guid,\r
987 &gCVfrVarDataTypeDB,\r
988 TypeName,\r
989 VarStoreId\r
990 ), LineNum); \r
4afd3d04 991 _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
4234283c
LG
992 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
993 } else {\r
994 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
871f6733 995 TN->getText(),\r
4234283c
LG
996 &Guid,\r
997 &gCVfrVarDataTypeDB,\r
998 TypeName,\r
999 VarStoreId\r
1000 ), LineNum); \r
871f6733 1001 _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
4234283c
LG
1002 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
1003 }\r
1004 VSEObj.SetGuid (&Guid); \r
30fdf114 1005 VSEObj.SetVarStoreId (VarStoreId);\r
4234283c
LG
1006 \r
1007 VSEObj.SetSize ((UINT16) Size);\r
1008 VSEObj.SetName (StoreName);\r
1009 if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
1010 delete StoreName; \r
1011 }\r
30fdf114
LG
1012 >>\r
1013 ";"\r
1014 ;\r
1015\r
1016vfrVarStoreEfiAttr [UINT32 & Attr] :\r
e4ac870f 1017 N:Number << $Attr |= _STOU32(N->getText(), N->getLine()); >>\r
30fdf114
LG
1018 ;\r
1019\r
1020vfrStatementVarStoreNameValue :\r
1021 <<\r
1022 EFI_GUID Guid;\r
1023 CIfrVarStoreNameValue VSNVObj;\r
e8a47801
LG
1024 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
1025 BOOLEAN Created = FALSE;\r
30fdf114
LG
1026 >>\r
1027 L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >>\r
e8a47801
LG
1028 SN:StringIdentifier ","\r
1029 {\r
1030 VarId "=" ID:Number "," <<\r
1031 _PCATCH(\r
e4ac870f 1032 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
e8a47801
LG
1033 (INTN)TRUE,\r
1034 ID,\r
1035 "varid 0 is not allowed."\r
1036 );\r
1037 >>\r
1038 }\r
30fdf114 1039 (\r
e8a47801
LG
1040 Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << \r
1041 if (!Created) {\r
1042 _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
1043 Created = TRUE;\r
1044 }\r
e4ac870f 1045 _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN); \r
e8a47801 1046 >>\r
30fdf114
LG
1047 )+\r
1048 Uuid "=" guidDefinition[Guid] << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
1049 <<\r
1050 VSNVObj.SetGuid (&Guid);\r
4afd3d04 1051 _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
30fdf114
LG
1052 VSNVObj.SetVarStoreId (VarStoreId);\r
1053 >>\r
1054 ";"\r
1055 ;\r
1056\r
1057//\r
1058// keep classDeinition and validClassNames for compatibility but not generate\r
1059// any IFR object\r
1060//\r
1061classDefinition[UINT16 & Class] :\r
1062 << $Class = 0; >>\r
1063 validClassNames[$Class] ( "\|" validClassNames[$Class] )*\r
1064 ;\r
1065\r
1066validClassNames[UINT16 & Class] :\r
1067 ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >>\r
1068 | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >>\r
1069 | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >>\r
1070 | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >>\r
1071 | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >>\r
1072 | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>\r
1073 | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >>\r
e4ac870f 1074 | N:Number << $Class |= _STOU16(N->getText(), N->getLine()); >>\r
30fdf114
LG
1075 ;\r
1076\r
1077subclassDefinition[UINT16 & SubClass] :\r
1078 << $SubClass = 0; >>\r
1079 SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>\r
1080 | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>\r
1081 | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>\r
1082 | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>\r
e4ac870f 1083 | N:Number << $SubClass |= _STOU16(N->getText(), N->getLine()); >>\r
30fdf114
LG
1084 ;\r
1085\r
1086vfrStatementDisableIfFormSet :\r
1087 <<\r
1088 CIfrDisableIf DIObj;\r
1089 mConstantOnlyInExpression = TRUE;\r
1090 >>\r
1091 D:DisableIf << DIObj.SetLineNo(D->getLine()); >>\r
1092 vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r
1093 vfrFormSetList\r
1094 E:EndIf << CRT_END_OP (E); >>\r
1095 ";"\r
1096 ;\r
1097\r
a709adfa
LG
1098vfrStatementSuppressIfFormSet :\r
1099 << CIfrSuppressIf SIObj;>>\r
1100 L:SuppressIf <<\r
1101 if (mCompatibleMode) {\r
1102 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
1103 }\r
1104 SIObj.SetLineNo(L->getLine()); \r
1105 >>\r
1106 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
1107 vfrStatementExpression[0] ";"\r
1108 vfrFormSetList\r
1109 E: EndIf \r
1110 ";" << CRT_END_OP (E); >>\r
1111 ;\r
1112\r
30fdf114
LG
1113//*****************************************************************************\r
1114//\r
1115// the syntax of question header and statement header\r
1116//\r
1117vfrStatementHeader[CIfrStatementHeader *SHObj] :\r
e4ac870f
LG
1118 Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText(), S1->getLine())); >>\r
1119 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >>\r
30fdf114
LG
1120 ;\r
1121\r
1122vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
1123 <<\r
1124 EFI_VARSTORE_INFO Info;\r
4afd3d04
LG
1125 Info.mVarType = EFI_IFR_TYPE_OTHER;\r
1126 Info.mVarTotalSize = 0;\r
1127 Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
1128 Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
1129 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1130 CHAR8 *QName = NULL;\r
1131 CHAR8 *VarIdStr = NULL;\r
4afd3d04 1132 mUsedDefaultCount = 0;\r
30fdf114
LG
1133 >>\r
1134 {\r
1135 Name "=" QN:StringIdentifier "," <<\r
1136 QName = QN->getText();\r
1137 _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
1138 >>\r
1139 }\r
1140 { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
1141 {\r
1142 QuestionId "=" ID:Number "," <<\r
e4ac870f 1143 QId = _STOQID(ID->getText(), ID->getLine());\r
30fdf114
LG
1144 _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
1145 >>\r
1146 }\r
1147 <<\r
1148 switch (QType) {\r
1149 case QUESTION_NORMAL:\r
1150 mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
1151 break;\r
1152 case QUESTION_DATE:\r
52302d4d
LG
1153 mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
1154 break;\r
30fdf114 1155 case QUESTION_TIME:\r
52302d4d
LG
1156 mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
1157 break;\r
4234283c
LG
1158 case QUESTION_REF:\r
1159 //\r
1160 // VarIdStr != NULL stand for question with storagae.\r
1161 //\r
1162 if (VarIdStr != NULL) {\r
1163 mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
1164 } else {\r
1165 mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
1166 }\r
1167 break;\r
30fdf114
LG
1168 default:\r
1169 _PCATCH(VFR_RETURN_FATAL_ERROR);\r
1170 }\r
1171 $QHObj.SetQuestionId (QId);\r
4234283c
LG
1172 if (VarIdStr != NULL) {\r
1173 $QHObj.SetVarStoreInfo (&Info);\r
1174 }\r
30fdf114
LG
1175 >>\r
1176 vfrStatementHeader[&$QHObj]\r
4234283c
LG
1177 << \r
1178 if (VarIdStr != NULL) {\r
1179 delete VarIdStr; \r
4234283c 1180 }\r
4afd3d04 1181 _SAVE_CURRQEST_VARINFO (Info);\r
30fdf114 1182 >>\r
30fdf114
LG
1183 ;\r
1184\r
1185questionheaderFlagsField[UINT8 & Flags] :\r
1186 ReadOnlyFlag << $Flags |= 0x01; >>\r
1187 | InteractiveFlag << $Flags |= 0x04; >>\r
1188 | ResetRequiredFlag << $Flags |= 0x10; >>\r
05154781
ED
1189 | O:OptionOnlyFlag << \r
1190 if (mCompatibleMode) {\r
1191 $Flags |= 0x80;\r
1192 } else {\r
1193 gCVfrErrorHandle.HandleWarning (\r
1194 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1195 O->getLine(),\r
1196 O->getText()\r
1197 );\r
1198 }\r
1199 >>\r
1200 | N:NVAccessFlag << \r
1201 if (!mCompatibleMode) {\r
1202 gCVfrErrorHandle.HandleWarning (\r
1203 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1204 N->getLine(),\r
1205 N->getText()\r
1206 );\r
1207 }\r
1208 >>\r
1209 | L:LateCheckFlag << \r
1210 if (!mCompatibleMode) {\r
1211 gCVfrErrorHandle.HandleWarning (\r
1212 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1213 L->getLine(),\r
1214 L->getText()\r
1215 );\r
1216 }\r
1217 >>\r
30fdf114
LG
1218 ;\r
1219\r
52302d4d 1220vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :\r
30fdf114
LG
1221 <<\r
1222 UINT32 Idx;\r
1223 UINT32 LineNo;\r
1224 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
1225 CHAR8 *VarIdStr = NULL;\r
1226 CHAR8 *VarStr = NULL;\r
1227 CHAR8 *SName = NULL;\r
1228 CHAR8 *TName = NULL;\r
1229 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
1230 EFI_IFR_TYPE_VALUE Dummy = gZeroEfiIfrTypeValue;\r
4afd3d04 1231 EFI_GUID *VarGuid = NULL;\r
30fdf114
LG
1232 >>\r
1233 (\r
1234 SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
1235 OpenBracket I1:Number CloseBracket <<\r
e4ac870f 1236 Idx = _STOU32(I1->getText(), I1->getLine());\r
30fdf114
LG
1237 _STRCAT(&VarIdStr, "[");\r
1238 _STRCAT(&VarIdStr, I1->getText());\r
1239 _STRCAT(&VarIdStr, "]");\r
1240 >>\r
1241 <<\r
4afd3d04 1242 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
30fdf114
LG
1243 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
1244 mCVfrDataStorage.DeclareBufferVarStore (\r
1245 SName,\r
1246 &mFormsetGuid,\r
1247 &gCVfrVarDataTypeDB,\r
1248 SName,\r
1249 EFI_VARSTORE_ID_INVALID,\r
1250 FALSE\r
1251 );\r
4afd3d04 1252 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
30fdf114 1253 }\r
52302d4d
LG
1254 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1255 _PCATCH(VfrReturnCode, SN1);\r
52302d4d
LG
1256 _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
1257 }\r
4234283c
LG
1258\r
1259 QuestVarIdStr = VarIdStr;\r
30fdf114
LG
1260 >>\r
1261 )\r
1262 |\r
1263 (\r
1264 SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
1265 <<\r
4afd3d04 1266 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
30fdf114
LG
1267 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
1268 mCVfrDataStorage.DeclareBufferVarStore (\r
1269 SName,\r
1270 &mFormsetGuid,\r
1271 &gCVfrVarDataTypeDB,\r
1272 SName,\r
1273 EFI_VARSTORE_ID_INVALID,\r
1274 FALSE\r
1275 );\r
4afd3d04 1276 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
30fdf114 1277 }\r
52302d4d
LG
1278 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1279 _PCATCH(VfrReturnCode, SN2);\r
4afd3d04 1280 VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
52302d4d 1281 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
4afd3d04 1282 _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
52302d4d
LG
1283 _STRCAT(&VarStr, TName);\r
1284 }\r
30fdf114
LG
1285 }\r
1286 >>\r
1287\r
1288 (\r
1289 "." <<\r
52302d4d
LG
1290 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1291 _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
1292 }\r
30fdf114
LG
1293 _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
1294 >>\r
1295 SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
1296 {\r
1297 OpenBracket I2:Number CloseBracket <<\r
e4ac870f 1298 Idx = _STOU32(I2->getText(), I2->getLine());\r
30fdf114
LG
1299 if (mCompatibleMode) Idx --;\r
1300 if (Idx > 0) {\r
1301 //\r
1302 // Idx == 0, [0] can be ignored.\r
1303 // Array[0] is same to Array for unify the varid name to cover [0]\r
1304 //\r
1305 _STRCAT(&VarIdStr, "[");\r
1306 _STRCAT(&VarIdStr, I2->getText());\r
1307 _STRCAT(&VarIdStr, "]");\r
1308 }\r
1309 _STRCAT(&VarStr, "[");\r
1310 _STRCAT(&VarStr, I2->getText());\r
1311 _STRCAT(&VarStr, "]");\r
1312 >>\r
1313 }\r
1314 )* <<\r
1315 switch (VarStoreType) {\r
1316 case EFI_VFR_VARSTORE_EFI:\r
1317 _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
1318 break;\r
1319 case EFI_VFR_VARSTORE_BUFFER:\r
1320 _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
4afd3d04 1321 VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
30fdf114
LG
1322 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
1323 SName,\r
4afd3d04 1324 VarGuid,\r
30fdf114
LG
1325 NULL),\r
1326 SN2->getLine());\r
1327 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (\r
1328 'a',\r
1329 SName,\r
4afd3d04 1330 VarGuid,\r
30fdf114
LG
1331 NULL,\r
1332 $Info.mVarType,\r
1333 $Info.mInfo.mVarOffset,\r
1334 $Info.mVarTotalSize,\r
1335 Dummy),\r
1336 SN2->getLine());\r
1337 break;\r
1338 case EFI_VFR_VARSTORE_NAME:\r
1339 default: break;\r
1340 }\r
1341\r
1342 QuestVarIdStr = VarIdStr;\r
1343 if (VarStr != NULL) {delete VarStr;}\r
1344 >>\r
1345 )\r
1346 ;\r
1347\r
1348vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] :\r
1349 <<\r
1350 UINT32 Idx;\r
1351 VarIdStr = NULL; LineNo = 0;\r
1352 >>\r
1353 (\r
1354 SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>\r
1355 OpenBracket I1:Number CloseBracket <<\r
1356 _STRCAT(&VarIdStr, "[");\r
1357 _STRCAT(&VarIdStr, I1->getText());\r
1358 _STRCAT(&VarIdStr, "]");\r
1359 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask);\r
1360 if (mConstantOnlyInExpression) {\r
1361 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r
1362 }\r
1363 >>\r
1364 )\r
1365 |\r
1366 (\r
1367 SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>\r
1368 (\r
1369 "." << \r
1370 _STRCAT (&VarIdStr, ".");\r
1371 if (mConstantOnlyInExpression) {\r
1372 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r
1373 }\r
1374 >>\r
1375 SF:StringIdentifier << _STRCAT (&VarIdStr, SF->getText()); >>\r
1376 {\r
1377 OpenBracket I2:Number CloseBracket <<\r
e4ac870f 1378 Idx = _STOU32(I2->getText(), I2->getLine());\r
30fdf114
LG
1379 if (mCompatibleMode) Idx --;\r
1380 if (Idx > 0) {\r
1381 //\r
1382 // Idx == 0, [0] can be ignored.\r
1383 // Array[0] is same to Array\r
1384 //\r
1385 _STRCAT(&VarIdStr, "[");\r
1386 _STRCAT(&VarIdStr, I2->getText());\r
1387 _STRCAT(&VarIdStr, "]");\r
1388 }\r
1389 >>\r
1390 }\r
1391 )*\r
1392 << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
1393 )\r
1394 ;\r
1395\r
1396vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
4234283c
LG
1397 <<\r
1398 EFI_GUID Guid;\r
1399 >>\r
30fdf114
LG
1400 N1:Number <<\r
1401 switch ($Type) {\r
1402 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
e4ac870f 1403 $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
30fdf114
LG
1404 break;\r
1405 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
e4ac870f 1406 $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
30fdf114
LG
1407 break;\r
1408 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
e4ac870f 1409 $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
30fdf114
LG
1410 break;\r
1411 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
e4ac870f 1412 $Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
30fdf114
LG
1413 break;\r
1414 case EFI_IFR_TYPE_BOOLEAN :\r
e4ac870f 1415 $Value.b = _STOU8(N1->getText(), N1->getLine());\r
30fdf114
LG
1416 break;\r
1417 case EFI_IFR_TYPE_STRING :\r
e4ac870f 1418 $Value.string = _STOU16(N1->getText(), N1->getLine());\r
30fdf114
LG
1419 break;\r
1420 case EFI_IFR_TYPE_TIME :\r
1421 case EFI_IFR_TYPE_DATE :\r
4234283c 1422 case EFI_IFR_TYPE_REF :\r
30fdf114
LG
1423 default :\r
1424 break;\r
1425 }\r
1426 >>\r
1427 | B1:True << $Value.b = TRUE; >>\r
1428 | B2:False << $Value.b = FALSE; >>\r
e4ac870f
LG
1429 | O1:One << $Value.u8 = _STOU8(O1->getText(), O1->getLine()); >>\r
1430 | O2:Ones << $Value.u64 = _STOU64(O2->getText(), O2->getLine()); >>\r
1431 | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >>\r
1432 | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >>\r
1433 | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >>\r
4234283c 1434 | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
e4ac870f
LG
1435 << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
1436 | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
30fdf114
LG
1437 ;\r
1438\r
1439//*****************************************************************************\r
1440//\r
1441// the syntax of form definition\r
1442//\r
1443vfrFormDefinition :\r
1444 << CIfrForm FObj; >>\r
1445 F:Form << FObj.SetLineNo(F->getLine()); >>\r
e4ac870f
LG
1446 FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
1447 Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >>\r
30fdf114
LG
1448 (\r
1449 vfrStatementImage |\r
1450 vfrStatementLocked |\r
1451 vfrStatementRules |\r
1452 vfrStatementDefault |\r
1453 vfrStatementStat |\r
1454 vfrStatementQuestions |\r
1455 vfrStatementConditional |\r
1456 vfrStatementLabel |\r
1457 vfrStatementBanner |\r
1458 // Just for framework vfr compatibility\r
da92f276 1459 vfrStatementInvalid |\r
4234283c
LG
1460 vfrStatementExtension |\r
1461 vfrStatementModal\r
30fdf114
LG
1462 )*\r
1463 E:EndForm <<\r
1464 if (mCompatibleMode) {\r
1465 //\r
1466 // Add Label for Framework Vfr\r
1467 //\r
1468 CIfrLabel LObj1;\r
1469 LObj1.SetLineNo(E->getLine());\r
1470 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
1471 CIfrLabel LObj2;\r
1472 LObj2.SetLineNo(E->getLine());\r
1473 LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0\r
1474 CIfrLabel LObj3;\r
1475 LObj3.SetLineNo(E->getLine());\r
1476 LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
30fdf114 1477 }\r
b36d134f 1478\r
4afd3d04 1479 {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
30fdf114
LG
1480 >>\r
1481 ";"\r
1482 ;\r
1483\r
52302d4d
LG
1484vfrFormMapDefinition :\r
1485 << \r
1486 CIfrFormMap *FMapObj = NULL;\r
1487 UINT32 FormMapMethodNumber = 0;\r
1488 EFI_GUID Guid;\r
1489 >>\r
1490 F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
e4ac870f 1491 FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
52302d4d
LG
1492 (\r
1493 MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
e4ac870f 1494 MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >>\r
52302d4d
LG
1495 )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
1496 (\r
1497 vfrStatementImage |\r
1498 vfrStatementLocked |\r
1499 vfrStatementRules |\r
1500 vfrStatementDefault |\r
1501 vfrStatementStat |\r
1502 vfrStatementQuestions |\r
1503 vfrStatementConditional |\r
1504 vfrStatementLabel |\r
da92f276 1505 vfrStatementBanner |\r
4234283c
LG
1506 vfrStatementExtension |\r
1507 vfrStatementModal\r
52302d4d
LG
1508 )*\r
1509 E:EndForm << CRT_END_OP (E); >>\r
1510 ";"\r
1511 ;\r
1512\r
30fdf114
LG
1513vfrStatementRules :\r
1514 << CIfrRule RObj; >>\r
1515 R:Rule << RObj.SetLineNo(R->getLine()); >>\r
1516 S1:StringIdentifier "," <<\r
1517 mCVfrRulesDB.RegisterRule (S1->getText());\r
1518 RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));\r
1519 >>\r
1520 vfrStatementExpression[0]\r
1521 E:EndRule << CRT_END_OP (E); >>\r
1522 ";"\r
1523 ;\r
1524\r
1525vfrStatementDefault :\r
1526 <<\r
1527 BOOLEAN IsExp = FALSE;\r
fd171542 1528 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04
LG
1529 CIfrDefault *DObj = NULL;\r
1530 CIfrDefault2 *DObj2 = NULL;\r
30fdf114
LG
1531 EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
1532 CHAR8 *VarStoreName = NULL;\r
1533 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04
LG
1534 UINT32 Size = 0;\r
1535 EFI_GUID *VarGuid = NULL;\r
30fdf114 1536 >>\r
4afd3d04 1537 D:Default \r
30fdf114
LG
1538 (\r
1539 (\r
4afd3d04
LG
1540 "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] "," \r
1541 << \r
a709adfa
LG
1542 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
1543 //check default value is valid for Numeric Opcode\r
1544 if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
1545 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
fd171542 1546 }\r
1547 }\r
4afd3d04
LG
1548 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1549 _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
1550 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
1551 } else {\r
1552 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
1553 }\r
1554 Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
1555 DObj = new CIfrDefault ((UINT8)Size);\r
1556 DObj->SetLineNo(D->getLine());\r
1557 DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
1558 DObj->SetValue(Val);\r
fd171542 1559 >>\r
4afd3d04
LG
1560 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
1561 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
30fdf114
LG
1562 )\r
1563 {\r
4afd3d04
LG
1564 DefaultStore "=" SN:StringIdentifier "," << \r
1565 _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
1566 if (DObj != NULL) {\r
1567 DObj->SetDefaultId (DefaultId); \r
1568 } \r
1569\r
1570 if (DObj2 != NULL) {\r
1571 DObj2->SetDefaultId (DefaultId); \r
1572 }\r
1573 >>\r
30fdf114
LG
1574 }\r
1575 <<\r
4afd3d04
LG
1576 CheckDuplicateDefaultValue (DefaultId, D);\r
1577 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
30fdf114 1578 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
4afd3d04
LG
1579 VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1580 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
30fdf114
LG
1581 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
1582 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1583 DefaultId,\r
1584 _GET_CURRQEST_VARTINFO(),\r
1585 VarStoreName,\r
4afd3d04 1586 VarGuid,\r
30fdf114 1587 _GET_CURRQEST_DATATYPE (),\r
4afd3d04
LG
1588 Val),\r
1589 D->getLine()\r
1590 );\r
1591 }\r
30fdf114 1592 }\r
4afd3d04
LG
1593 if (DObj != NULL) {delete DObj;} \r
1594 if (DObj2 != NULL) {delete DObj2;} \r
30fdf114
LG
1595 >>\r
1596 )\r
1597 ;\r
1598\r
1599vfrStatementStat :\r
1600 vfrStatementSubTitle |\r
1601 vfrStatementStaticText |\r
1602 vfrStatementCrossReference\r
1603 ;\r
1604\r
1605vfrStatementQuestions :\r
1606 vfrStatementBooleanType |\r
1607 vfrStatementDate |\r
1608 vfrStatementNumericType |\r
1609 vfrStatementStringType |\r
1610 vfrStatementOrderedList |\r
1611 vfrStatementTime\r
1612 ;\r
1613\r
1614vfrStatementConditional :\r
1615 vfrStatementDisableIfStat |\r
1616 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif\r
1617 vfrStatementGrayOutIfStat |\r
1618 vfrStatementInconsistentIfStat //to be compatible for framework\r
1619 ;\r
1620\r
1621vfrStatementConditionalNew :\r
1622 vfrStatementDisableIfStat |\r
1623 vfrStatementSuppressIfStatNew |\r
1624 vfrStatementGrayOutIfStatNew |\r
1625 vfrStatementInconsistentIfStat //to be compatible for framework\r
1626 ;\r
1627\r
1628vfrStatementSuppressIfStat :\r
1629 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
1630 | vfrStatementSuppressIfStatNew\r
1631 ;\r
1632\r
1633vfrStatementGrayOutIfStat :\r
1634 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
1635 | vfrStatementGrayOutIfStatNew\r
1636 ;\r
1637\r
1638vfrStatementInvalid :\r
1639 (\r
1640 vfrStatementInvalidHidden |\r
1641 vfrStatementInvalidInventory |\r
1642 vfrStatementInvalidSaveRestoreDefaults\r
1643 )\r
1644 << _CRT_OP (TRUE); >>\r
1645 ;\r
1646\r
1647flagsField :\r
05154781
ED
1648 Number \r
1649 | InteractiveFlag \r
1650 | ManufacturingFlag \r
1651 | DefaultFlag \r
1652 | ResetRequiredFlag \r
1653 | N:NVAccessFlag << \r
1654 if (!mCompatibleMode) {\r
1655 gCVfrErrorHandle.HandleWarning (\r
1656 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1657 N->getLine(),\r
1658 N->getText()\r
1659 );\r
1660 }\r
1661 >>\r
1662 | L:LateCheckFlag << \r
1663 if (!mCompatibleMode) {\r
1664 gCVfrErrorHandle.HandleWarning (\r
1665 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1666 L->getLine(),\r
1667 L->getText()\r
1668 );\r
1669 }\r
1670 >> \r
30fdf114
LG
1671 ;\r
1672\r
1673vfrStatementValue :\r
1674 << CIfrValue VObj; >>\r
1675 V:Value << VObj.SetLineNo(V->getLine()); >>\r
fd171542 1676 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
30fdf114
LG
1677 ;\r
1678\r
52302d4d
LG
1679vfrStatementRead :\r
1680 << CIfrRead RObj; >>\r
1681 R:Read << RObj.SetLineNo(R->getLine()); >>\r
1682 vfrStatementExpression[0] ";" \r
1683 ;\r
1684\r
1685vfrStatementWrite :\r
1686 << CIfrWrite WObj; >>\r
1687 W:Write << WObj.SetLineNo(W->getLine()); >>\r
1688 vfrStatementExpression[0] ";" \r
1689 ;\r
1690\r
30fdf114
LG
1691vfrStatementSubTitle :\r
1692 << CIfrSubtitle SObj; >>\r
1693 L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r
e4ac870f 1694 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
1695 {\r
1696 "," FLAGS "=" vfrSubtitleFlags[SObj]\r
1697 }\r
e8a47801
LG
1698 (\r
1699 {vfrStatementStatTagList "," }\r
1700 E:";" << CRT_END_OP (E); >>\r
1701 |\r
1702 { "," vfrStatementStatTagList}\r
1703 { "," (vfrStatementStat | vfrStatementQuestions)*}\r
15be099a 1704 D: EndSubtitle ";" << CRT_END_OP (D); >>\r
e8a47801 1705 )\r
30fdf114
LG
1706 ;\r
1707\r
1708vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
1709 << UINT8 LFlags = 0; >>\r
1710 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r
1711 << _PCATCH(SObj.SetFlags (LFlags)); >>\r
1712 ;\r
1713\r
1714subtitleFlagsField [UINT8 & Flags] :\r
e4ac870f 1715 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
1716 | "HORIZONTAL" << $Flags |= 0x01; >>\r
1717 ;\r
1718\r
1719vfrStatementStaticText :\r
1720 <<\r
1721 UINT8 Flags = 0;\r
1722 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1723 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;\r
1724 >>\r
1725 T:Text\r
1726 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
1727 Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
1728 {\r
e4ac870f 1729 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>\r
30fdf114
LG
1730 }\r
1731 {\r
1732 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
1733 "," Key "=" KN:Number\r
1734 }\r
1735 <<\r
1736 if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
1d218f83
ED
1737 if (TxtTwo != EFI_STRING_ID_INVALID) {\r
1738 gCVfrErrorHandle.HandleWarning (\r
1739 VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
1740 S3->getLine(),\r
1741 S3->getText()\r
1742 );\r
1743 }\r
30fdf114
LG
1744 CIfrAction AObj;\r
1745 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
1746 AObj.SetLineNo (F->getLine());\r
1747 AObj.SetQuestionId (QId);\r
e4ac870f
LG
1748 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
1749 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
30fdf114
LG
1750 _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
1751 AssignQuestionKey (AObj, KN);\r
1752 CRT_END_OP (KN);\r
1753 } else {\r
1754 CIfrText TObj;\r
1755 TObj.SetLineNo (T->getLine());\r
e4ac870f
LG
1756 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
1757 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
1758 TObj.SetTextTwo (TxtTwo);\r
1759 }\r
1760 >>\r
1761 { "," vfrStatementStatTagList }\r
1762 ";"\r
1763 ;\r
1764\r
1765staticTextFlagsField[UINT8 & HFlags] :\r
e4ac870f 1766 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1767 | questionheaderFlagsField[HFlags]\r
1768 ;\r
1769\r
1770vfrStatementCrossReference :\r
1771 vfrStatementGoto |\r
1772 vfrStatementResetButton\r
1773 ;\r
1774\r
1775vfrStatementGoto :\r
1776 <<\r
4234283c 1777 UINT8 RefType = 5;\r
52302d4d
LG
1778 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
1779 EFI_GUID FSId = {0,};\r
30fdf114
LG
1780 EFI_FORM_ID FId;\r
1781 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1782 UINT32 BitMask;\r
1783 CIfrQuestionHeader *QHObj = NULL;\r
0d2711a6 1784 CIfrOpHeader *OHObj = NULL;\r
30fdf114
LG
1785 CIfrRef *R1Obj = NULL;\r
1786 CIfrRef2 *R2Obj = NULL;\r
1787 CIfrRef3 *R3Obj = NULL;\r
1788 CIfrRef4 *R4Obj = NULL;\r
4234283c 1789 CIfrRef5 *R5Obj = NULL;\r
30fdf114
LG
1790 >>\r
1791 G:Goto\r
4234283c 1792 {\r
30fdf114
LG
1793 (\r
1794 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
1795 FormSetGuid "=" guidDefinition[FSId] ","\r
1796 FormId "=" F1:Number ","\r
1797 Question "=" QN1:Number ","\r
1798 <<\r
1799 RefType = 4;\r
e4ac870f
LG
1800 DevPath = _STOSID(P->getText(), P->getLine());\r
1801 FId = _STOFID(F1->getText(), F1->getLine());\r
1802 QId = _STOQID(QN1->getText(), QN1->getLine());\r
30fdf114
LG
1803 >>\r
1804 )\r
1805 |\r
1806 (\r
1807 FormSetGuid "=" guidDefinition[FSId] ","\r
1808 FormId "=" F2:Number ","\r
1809 Question "=" QN2:Number ","\r
1810 <<\r
1811 RefType = 3;\r
e4ac870f
LG
1812 FId = _STOFID(F2->getText(), F2->getLine());\r
1813 QId = _STOQID(QN2->getText(), QN2->getLine());\r
30fdf114
LG
1814 >>\r
1815 )\r
1816 |\r
1817 (\r
e4ac870f 1818 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
30fdf114
LG
1819 Question "="\r
1820 (\r
0d2711a6
LG
1821 QN3:StringIdentifier "," << \r
1822 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
1823 if (QId == EFI_QUESTION_ID_INVALID) {\r
1824 _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
1825 }\r
1826 >>\r
e4ac870f 1827 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>\r
30fdf114
LG
1828 )\r
1829 )\r
1830 |\r
1831 (\r
1832 F4:Number "," <<\r
1833 RefType = 1;\r
e4ac870f 1834 FId = _STOFID(F4->getText(), F4->getLine());\r
30fdf114
LG
1835 >>\r
1836 )\r
4234283c 1837 }\r
30fdf114
LG
1838 <<\r
1839 switch (RefType) {\r
4234283c
LG
1840 case 5:\r
1841 {\r
1842 R5Obj = new CIfrRef5;\r
1843 QHObj = R5Obj;\r
0d2711a6 1844 OHObj = R5Obj;\r
4234283c
LG
1845 R5Obj->SetLineNo(G->getLine());\r
1846 break;\r
1847 }\r
30fdf114
LG
1848 case 4:\r
1849 {\r
1850 R4Obj = new CIfrRef4;\r
1851 QHObj = R4Obj;\r
0d2711a6 1852 OHObj = R4Obj;\r
30fdf114
LG
1853 R4Obj->SetLineNo(G->getLine());\r
1854 R4Obj->SetDevicePath (DevPath);\r
1855 R4Obj->SetFormSetId (FSId);\r
1856 R4Obj->SetFormId (FId);\r
1857 R4Obj->SetQuestionId (QId);\r
1858 break;\r
1859 }\r
1860 case 3:\r
1861 {\r
1862 R3Obj = new CIfrRef3;\r
1863 QHObj = R3Obj;\r
0d2711a6 1864 OHObj = R3Obj;\r
30fdf114
LG
1865 R3Obj->SetLineNo(G->getLine());\r
1866 R3Obj->SetFormSetId (FSId);\r
1867 R3Obj->SetFormId (FId);\r
1868 R3Obj->SetQuestionId (QId);\r
1869 break;\r
1870 }\r
1871 case 2:\r
1872 {\r
1873 R2Obj = new CIfrRef2;\r
1874 QHObj = R2Obj;\r
0d2711a6 1875 OHObj = R2Obj;\r
30fdf114
LG
1876 R2Obj->SetLineNo(G->getLine());\r
1877 R2Obj->SetFormId (FId);\r
0d2711a6 1878 R2Obj->SetQuestionId (QId);\r
30fdf114
LG
1879 break;\r
1880 }\r
1881 case 1:\r
1882 {\r
1883 R1Obj = new CIfrRef;\r
1884 QHObj = R1Obj;\r
0d2711a6 1885 OHObj = R1Obj;\r
30fdf114
LG
1886 R1Obj->SetLineNo(G->getLine());\r
1887 R1Obj->SetFormId (FId);\r
1888 break;\r
1889 }\r
1890 default: break;\r
1891 }\r
1892 >>\r
4afd3d04
LG
1893 vfrQuestionHeader[*QHObj, QUESTION_REF] <<\r
1894 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1895 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
1896 }\r
1897 >>\r
30fdf114
LG
1898 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
1899 {\r
1900 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
1901 }\r
0d2711a6
LG
1902 {\r
1903 E:"," \r
1904 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
1905 }\r
4234283c 1906 ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} if (R5Obj != NULL) {delete R5Obj;}>>\r
30fdf114
LG
1907 ;\r
1908\r
1909vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
1910 << UINT8 HFlags = 0; >>\r
1911 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
1912 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
1913 ;\r
1914\r
1915gotoFlagsField[UINT8 & HFlags] :\r
e4ac870f 1916 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1917 | questionheaderFlagsField[HFlags]\r
1918 ;\r
1919\r
1920getStringId :\r
1921 "STRING_TOKEN" "\("\r
1922 IdVal:Number\r
1923 "\)"\r
1924 ;\r
1925\r
1926vfrStatementResetButton :\r
1927 <<\r
1928 CIfrResetButton RBObj;\r
1929 UINT16 DefaultId;\r
1930 >>\r
1931 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
1932 DefaultStore\r
1933 "=" N:StringIdentifier "," <<\r
1934 _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
1935 RBObj.SetDefaultId (DefaultId);\r
1936 >>\r
1937 vfrStatementHeader[&RBObj] ","\r
1938 { vfrStatementStatTagList "," }\r
1939 E:EndResetButton << CRT_END_OP (E); >>\r
1940 ";"\r
1941 ;\r
1942\r
1943vfrStatementBooleanType :\r
1944 vfrStatementCheckBox |\r
1945 vfrStatementAction\r
1946 ;\r
1947\r
1948//*****************************************************\r
1949// Syntax of checkbox\r
1950//\r
1951// Example:\r
1952// checkbox\r
1953// varid = MySTestData.mField1,\r
1954// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
1955// help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
1956// flags = CHECKBOX_DEFAULT | CALLBACK,\r
1957// default value = TRUE, defaultstore = MyDefaultStore,\r
1958// endcheckbox;\r
1959//\r
1960vfrStatementCheckBox :\r
1961 <<\r
1962 CIfrCheckBox CBObj;\r
1963 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
1964 CHAR8 *VarStoreName = NULL;\r
1965 UINT32 DataTypeSize;\r
4afd3d04 1966 EFI_GUID *VarStoreGuid = NULL;\r
30fdf114
LG
1967 >>\r
1968 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
1969 vfrQuestionHeader[CBObj] "," << //check data type\r
4afd3d04
LG
1970 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1971 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
1972 }\r
1973 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
1974 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
1975 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
1976 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
1977 } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
1978 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
1979 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
1980 }\r
30fdf114
LG
1981 }\r
1982 >>\r
1983 {\r
1984 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
1985 <<\r
4afd3d04
LG
1986 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
1987 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
1988 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1989 Val.b = TRUE;\r
1990 if (CBObj.GetFlags () & 0x01) {\r
1991 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
1992 _PCATCH(\r
1993 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1994 EFI_HII_DEFAULT_CLASS_STANDARD,\r
1995 _GET_CURRQEST_VARTINFO(),\r
1996 VarStoreName,\r
1997 VarStoreGuid,\r
1998 _GET_CURRQEST_DATATYPE (),\r
1999 Val\r
2000 ),\r
2001 VFR_RETURN_SUCCESS,\r
2002 L,\r
2003 "No standard default storage found"\r
2004 );\r
2005 }\r
2006 if (CBObj.GetFlags () & 0x02) {\r
2007 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
2008 _PCATCH(\r
2009 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2010 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
2011 _GET_CURRQEST_VARTINFO(),\r
2012 VarStoreName,\r
2013 VarStoreGuid,\r
2014 _GET_CURRQEST_DATATYPE (),\r
2015 Val\r
2016 ),\r
2017 VFR_RETURN_SUCCESS,\r
2018 L,\r
2019 "No manufacturing default storage found"\r
2020 );\r
2021 }\r
30fdf114
LG
2022 }\r
2023 >>\r
2024 }\r
2025 {\r
2026 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
2027 }\r
2028 vfrStatementQuestionOptionList\r
2029 E:EndCheckBox << CRT_END_OP (E); >>\r
2030 ";"\r
2031 ;\r
2032\r
2033vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
2034 <<\r
2035 UINT8 LFlags = 0;\r
2036 UINT8 HFlags = 0;\r
2037 >>\r
2038 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
2039 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2040 ;\r
2041\r
2042checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
2043 N:Number <<\r
2044 if (mCompatibleMode) {\r
2045 //\r
2046 // set question flag\r
2047 //\r
e4ac870f 2048 $LFlags |= _STOU8(N->getText(), N->getLine());\r
30fdf114 2049 } else {\r
e4ac870f 2050 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
30fdf114
LG
2051 }\r
2052 >>\r
2053 | D:"DEFAULT" <<\r
2054 if (mCompatibleMode) {\r
2055 //\r
2056 // set question Default flag\r
2057 //\r
2058 $LFlags |= 0x01;\r
2059 } else {\r
2060 _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
2061 }\r
2062 >>\r
2063 | M:"MANUFACTURING" <<\r
2064 if (mCompatibleMode) {\r
2065 //\r
2066 // set question MFG flag\r
2067 //\r
2068 $LFlags |= 0x02;\r
2069 } else {\r
2070 _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
2071 }\r
2072 >>\r
2073 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
2074 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r
2075 | questionheaderFlagsField[HFlags]\r
2076 ;\r
2077\r
2078//*****************************************************\r
2079// Syntax of action\r
2080//\r
2081// Example:\r
2082// action\r
2083// prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r
2084// help = STRING_TOKEN(STR_ACTION_HELP),\r
2085// flags = CALLBACK,\r
2086// config = STRING_TOKEN(STR_ACTION_CONFIG),\r
2087// endaction;\r
2088//\r
2089vfrStatementAction :\r
2090 << CIfrAction AObj; >>\r
2091 L:Action << AObj.SetLineNo(L->getLine()); >>\r
4234283c 2092 vfrQuestionHeader[AObj] ","\r
30fdf114 2093 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
e4ac870f 2094 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2095 vfrStatementQuestionTagList\r
2096 E:EndAction << CRT_END_OP (E); >>\r
2097 ";"\r
2098 ;\r
2099\r
2100vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
2101 << UINT8 HFlags = 0; >>\r
2102 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
2103 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
2104 ;\r
2105\r
2106actionFlagsField[UINT8 & HFlags] :\r
e4ac870f 2107 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2108 | questionheaderFlagsField[HFlags]\r
2109 ;\r
2110\r
2111vfrStatementDate :\r
2112 <<\r
2113 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2114 CHAR8 *VarIdStr[3] = {NULL, };\r
2115 CIfrDate DObj;\r
2116 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2117 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
30fdf114
LG
2118 >>\r
2119 L:Date << DObj.SetLineNo(L->getLine()); >>\r
2120 (\r
2121 (\r
4afd3d04
LG
2122 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<\r
2123 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2124 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
2125 }\r
2126 >>\r
30fdf114
LG
2127 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
2128 vfrStatementQuestionOptionList\r
2129 )\r
2130 |\r
2131 (\r
2132 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
2133 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
2134 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
2135 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
2136 minMaxDateStepDefault[Val.date, 0]\r
2137\r
2138 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
2139 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
2140 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2141 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2142 minMaxDateStepDefault[Val.date, 1]\r
2143\r
2144 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
2145 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
2146 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
2147 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
2148 minMaxDateStepDefault[Val.date, 2]\r
2bcc713e 2149 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
30fdf114
LG
2150 <<\r
2151 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2152 DObj.SetQuestionId (QId);\r
2153 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
e4ac870f
LG
2154 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
2155 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\r
30fdf114
LG
2156 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2157 >>\r
4afd3d04 2158 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2159 )\r
2160 ( vfrStatementInconsistentIf )*\r
2161 )\r
2162 E:EndDate << CRT_END_OP (E); >>\r
2163 ";"\r
2164 ;\r
2165\r
2166minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
fd171542 2167 Minimum "=" MinN:Number ","\r
2168 Maximum "=" MaxN:Number ","\r
30fdf114
LG
2169 { "step" "=" Number "," }\r
2170 {\r
2171 "default" "=" N:Number "," <<\r
2172 switch (KeyValue) {\r
fd171542 2173 case 0: \r
e4ac870f
LG
2174 D.Year = _STOU16(N->getText(), N->getLine());\r
2175 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
fd171542 2176 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
2177 }\r
2178 break;\r
2179 case 1: \r
e4ac870f 2180 D.Month = _STOU8(N->getText(), N->getLine()); \r
fd171542 2181 if (D.Month < 1 || D.Month > 12) {\r
2182 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
2183 }\r
2184 break;\r
2185 case 2: \r
e4ac870f 2186 D.Day = _STOU8(N->getText(), N->getLine()); \r
fd171542 2187 if (D.Day < 1 || D.Day > 31) {\r
2188 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
2189 }\r
2190 break;\r
30fdf114
LG
2191 }\r
2192 >>\r
2193 }\r
2194 ;\r
2195\r
2196vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
2197 << UINT8 LFlags = 0; >>\r
2198 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
2199 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2200 ;\r
2201\r
2202dateFlagsField [UINT8 & Flags] :\r
e4ac870f 2203 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2204 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r
2205 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r
2206 | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r
2207 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2208 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2209 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2210 ;\r
2211\r
2212vfrStatementNumericType :\r
2213 vfrStatementNumeric |\r
2214 vfrStatementOneOf\r
2215 ;\r
2216\r
2217vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
2218 <<\r
2219 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
2220 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
2221 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
2222 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
2223 >>\r
2224 Minimum "=" I:Number ","\r
2225 <<\r
a709adfa 2226 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2227 case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
2228 case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
2229 case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
2230 case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText(), I->getLine()); break;\r
30fdf114
LG
2231 }\r
2232 >>\r
2233 Maximum "=" A:Number ","\r
2234 <<\r
a709adfa 2235 switch (_GET_CURRQEST_DATATYPE()) {\r
fd171542 2236 case EFI_IFR_TYPE_NUM_SIZE_64 : \r
e4ac870f 2237 MaxU8 = _STOU64(A->getText(), A->getLine()); \r
fd171542 2238 if (MaxU8 < MinU8) {\r
2239 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2240 }\r
2241 break;\r
2242 case EFI_IFR_TYPE_NUM_SIZE_32 : \r
e4ac870f 2243 MaxU4 = _STOU32(A->getText(), A->getLine()); \r
fd171542 2244 if (MaxU4 < MinU4) {\r
2245 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2246 }\r
2247 break;\r
2248 case EFI_IFR_TYPE_NUM_SIZE_16 : \r
e4ac870f 2249 MaxU2 = _STOU16(A->getText(), A->getLine()); \r
fd171542 2250 if (MaxU2 < MinU2) {\r
2251 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2252 }\r
2253 break;\r
2254 case EFI_IFR_TYPE_NUM_SIZE_8 : \r
e4ac870f 2255 MaxU1 = _STOU8(A->getText(), A->getLine()); \r
fd171542 2256 if (MaxU1 < MinU1) {\r
2257 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2258 }\r
2259 break;\r
30fdf114
LG
2260 }\r
2261 >>\r
2262 {\r
2263 STEP "=" S:Number ","\r
2264 <<\r
a709adfa 2265 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2266 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
2267 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
2268 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
2269 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
30fdf114
LG
2270 }\r
2271 >>\r
2272 }\r
2273 <<\r
a709adfa 2274 switch (_GET_CURRQEST_DATATYPE()) {\r
30fdf114
LG
2275 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
2276 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
2277 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
2278 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
2279 }\r
2280 >>\r
2281 ;\r
2282\r
2283vfrStatementNumeric :\r
2284 <<\r
2285 CIfrNumeric NObj;\r
4afd3d04
LG
2286 UINT32 DataTypeSize;\r
2287 BOOLEAN IsSupported = TRUE;\r
2288 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2289 >>\r
2290 L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
2291 vfrQuestionHeader[NObj] "," << // check data type\r
4afd3d04
LG
2292 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2293 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
2294 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2295 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
2296 }\r
2297 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2298 }\r
30fdf114
LG
2299 >>\r
2300 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
2301 {\r
2302 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
2303 }\r
4afd3d04 2304 vfrSetMinMaxStep[NObj] <<\r
b36d134f 2305 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2306 //\r
2307 // Base on the type to know the actual used size,shrink the buffer \r
2308 // size allocate before.\r
2309 //\r
2310 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2311 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2312 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2313 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
2314 default: \r
2315 IsSupported = FALSE;\r
b36d134f
LG
2316 break;\r
2317 }\r
4afd3d04 2318 NObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2319 if (!IsSupported) {\r
2320 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2321 }\r
4afd3d04
LG
2322 >>\r
2323 vfrStatementQuestionOptionList\r
2324 E:EndNumeric << \r
b36d134f
LG
2325 CRT_END_OP (E); \r
2326 >>\r
30fdf114
LG
2327 ";"\r
2328 ;\r
2329\r
2330vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
2331 <<\r
a709adfa 2332 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2333 UINT8 HFlags = 0;\r
a709adfa 2334 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2335 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2336 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2337 >>\r
e4ac870f 2338 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
a709adfa
LG
2339 <<\r
2340 //check data type flag\r
4afd3d04
LG
2341 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2342 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2343 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2344 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2345 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2346 }\r
2347 } else {\r
2348 // update data type for name/value store\r
2349 UINT32 DataTypeSize;\r
2350 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2351 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2352 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2353 }\r
4afd3d04 2354 } else if (IsSetType){\r
a709adfa 2355 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa 2356 }\r
e4ac870f 2357 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
a709adfa 2358 >>\r
30fdf114
LG
2359 ;\r
2360\r
e4ac870f
LG
2361numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
2362 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
4afd3d04
LG
2363 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
2364 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
2365 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
2366 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
e4ac870f
LG
2367 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
2368 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
2369 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
30fdf114
LG
2370 | questionheaderFlagsField[HFlags]\r
2371 ;\r
2372\r
2373vfrStatementOneOf :\r
2374 <<\r
2375 CIfrOneOf OObj;\r
2376 UINT32 DataTypeSize;\r
4afd3d04
LG
2377 BOOLEAN IsSupported = TRUE;\r
2378 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2379 >>\r
2380 L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
2381 vfrQuestionHeader[OObj] "," << //check data type\r
4afd3d04
LG
2382 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2383 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
2384 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2385 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
2386 }\r
2387 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2388 }\r
30fdf114
LG
2389 >>\r
2390 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
2391 {\r
2392 vfrSetMinMaxStep[OObj]\r
2393 }\r
4afd3d04 2394 <<\r
b36d134f 2395 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2396 //\r
2397 // Base on the type to know the actual used size,shrink the buffer \r
2398 // size allocate before.\r
2399 //\r
2400 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2401 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2402 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2403 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
b36d134f 2404 default:\r
4afd3d04 2405 IsSupported = FALSE;\r
b36d134f
LG
2406 break;\r
2407 }\r
4afd3d04 2408 OObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2409 if (!IsSupported) {\r
2410 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2411 }\r
4afd3d04
LG
2412 >>\r
2413 vfrStatementQuestionOptionList\r
2414 E:EndOneOf <<\r
b36d134f
LG
2415 CRT_END_OP (E); \r
2416 >>\r
30fdf114
LG
2417 ";"\r
2418 ;\r
2419\r
2420vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
2421 <<\r
a709adfa 2422 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2423 UINT8 HFlags = 0;\r
a709adfa 2424 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2425 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2426 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2427 >>\r
e4ac870f 2428 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
a709adfa
LG
2429 <<\r
2430 //check data type flag\r
4afd3d04
LG
2431 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2432 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2433 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2434 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2435 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2436 }\r
2437 } else {\r
2438 // update data type for Name/Value store\r
2439 UINT32 DataTypeSize;\r
2440 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2441 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2442 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2443 }\r
4afd3d04 2444 } else if (IsSetType){\r
a709adfa 2445 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa
LG
2446 }\r
2447 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
2448 >>\r
30fdf114
LG
2449 ;\r
2450\r
2451vfrStatementStringType :\r
2452 vfrStatementString |\r
2453 vfrStatementPassword\r
2454 ;\r
2455\r
2456vfrStatementString :\r
2457 <<\r
2458 CIfrString SObj;\r
40d841f6
LG
2459 UINT32 VarArraySize;\r
2460 UINT8 StringMinSize;\r
2461 UINT8 StringMaxSize;\r
30fdf114
LG
2462 >>\r
2463 L:String << SObj.SetLineNo(L->getLine()); >>\r
2464 vfrQuestionHeader[SObj] ","\r
2465 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
2466 {\r
2467 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
2468 }\r
40d841f6
LG
2469 MinSize "=" MIN:Number "," << \r
2470 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2471 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());\r
2472 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {\r
40d841f6
LG
2473 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
2474 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
2475 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
2476 }\r
2477 SObj.SetMinSize (StringMinSize);\r
2478 >>\r
2479 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2480 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());\r
2481 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {\r
40d841f6
LG
2482 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
2483 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
2484 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
2485 } else if (StringMaxSize < StringMinSize) {\r
2486 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
2487 }\r
2488 SObj.SetMaxSize (StringMaxSize);\r
2489 >>\r
30fdf114
LG
2490 vfrStatementQuestionOptionList\r
2491 E:EndString << CRT_END_OP (E); >>\r
2492 ";"\r
2493 ;\r
2494\r
2495vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
2496 <<\r
2497 UINT8 LFlags = 0;\r
2498 UINT8 HFlags = 0;\r
2499 >>\r
2500 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
2501 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2502 ;\r
2503\r
2504stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2505 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2506 | "MULTI_LINE" << $LFlags = 0x01; >>\r
2507 | questionheaderFlagsField[HFlags]\r
2508 ;\r
2509\r
2510vfrStatementPassword :\r
2511 <<\r
2512 CIfrPassword PObj;\r
40d841f6
LG
2513 UINT32 VarArraySize;\r
2514 UINT16 PasswordMinSize;\r
2515 UINT16 PasswordMaxSize;\r
30fdf114
LG
2516 >>\r
2517 L:Password << PObj.SetLineNo(L->getLine()); >>\r
2518 vfrQuestionHeader[PObj] ","\r
2519 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
2520 {\r
2521 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
2522 }\r
40d841f6
LG
2523 MinSize "=" MIN:Number "," << \r
2524 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2525 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());\r
2526 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {\r
40d841f6
LG
2527 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
2528 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
2529 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
2530 }\r
2531 PObj.SetMinSize (PasswordMinSize);\r
2532 >>\r
2533 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2534 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());\r
2535 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {\r
40d841f6
LG
2536 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
2537 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
2538 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
2539 } else if (PasswordMaxSize < PasswordMinSize) {\r
2540 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
2541 }\r
2542 PObj.SetMaxSize (PasswordMaxSize);\r
2543 >>\r
30fdf114
LG
2544 { Encoding "=" Number "," }\r
2545 vfrStatementQuestionOptionList\r
2546 E:EndPassword << CRT_END_OP (E); >>\r
2547 ";"\r
2548 ;\r
2549\r
2550vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
2551 << UINT8 HFlags = 0; >>\r
2552 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
2553 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
2554 ;\r
2555\r
2556passwordFlagsField [UINT8 & HFlags] :\r
e4ac870f 2557 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2558 | questionheaderFlagsField[HFlags]\r
2559 ;\r
2560\r
2561vfrStatementOrderedList :\r
2562 <<\r
2563 CIfrOrderedList OLObj;\r
40d841f6 2564 UINT32 VarArraySize;\r
30fdf114
LG
2565 >>\r
2566 L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
2567 vfrQuestionHeader[OLObj] ","\r
40d841f6
LG
2568 << \r
2569 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
2570 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
2571 >>\r
30fdf114 2572 {\r
40d841f6 2573 MaxContainers "=" M:Number "," << \r
e4ac870f 2574 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\r
40d841f6 2575 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
e4ac870f 2576 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {\r
40d841f6
LG
2577 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
2578 }\r
e4ac870f 2579 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));\r
40d841f6 2580 >>\r
30fdf114 2581 }\r
3a8e175b 2582 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
30fdf114
LG
2583 vfrStatementQuestionOptionList\r
2584 E:EndList << CRT_END_OP (E); >>\r
2585 ";"\r
2586 ;\r
2587\r
2588vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
2589 <<\r
2590 UINT8 HFlags = 0;\r
2591 UINT8 LFlags = 0;\r
2592 >>\r
2593 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
2594 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2595 ;\r
2596\r
2597orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2598 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2599 | "UNIQUE" << $LFlags |= 0x01; >>\r
2600 | "NOEMPTY" << $LFlags |= 0x02; >>\r
2601 | questionheaderFlagsField[HFlags]\r
2602 ;\r
2603\r
2604vfrStatementTime :\r
2605 <<\r
2606 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2607 CHAR8 *VarIdStr[3] = {NULL, };\r
2608 CIfrTime TObj;\r
2609 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2610 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
30fdf114
LG
2611 >>\r
2612 L:Time << TObj.SetLineNo(L->getLine()); >>\r
2613 (\r
2614 (\r
4afd3d04
LG
2615 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<\r
2616 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2617 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
2618 }\r
2619 >>\r
30fdf114 2620 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
40d841f6 2621 vfrStatementQuestionOptionList\r
30fdf114
LG
2622 )\r
2623 |\r
2624 (\r
2625 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
2626 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
2627 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
2628 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
2629 minMaxTimeStepDefault[Val.time, 0]\r
2630\r
2631 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
2632 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
2633 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2634 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2635 minMaxTimeStepDefault[Val.time, 1]\r
2636\r
2637 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
2638 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
2639 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
2640 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
2641 minMaxTimeStepDefault[Val.time, 2]\r
2bcc713e 2642 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
30fdf114
LG
2643 <<\r
2644 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2645 TObj.SetQuestionId (QId);\r
2646 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
e4ac870f
LG
2647 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
2648 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\r
30fdf114
LG
2649 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2650 >>\r
4afd3d04 2651 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2652 )\r
2653 ( vfrStatementInconsistentIf )*\r
2654 )\r
2655 E:EndTime << CRT_END_OP (E); >>\r
2656 ";"\r
2657 ;\r
2658\r
2659minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
2660 Minimum "=" Number ","\r
2661 Maximum "=" Number ","\r
2662 { "step" "=" Number "," }\r
2663 {\r
2664 "default" "=" N:Number "," <<\r
2665 switch (KeyValue) {\r
fd171542 2666 case 0: \r
e4ac870f 2667 T.Hour = _STOU8(N->getText(), N->getLine()); \r
fd171542 2668 if (T.Hour > 23) {\r
2669 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
2670 }\r
2671 break;\r
2672 case 1: \r
e4ac870f 2673 T.Minute = _STOU8(N->getText(), N->getLine()); \r
fd171542 2674 if (T.Minute > 59) {\r
2675 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
2676 }\r
2677 break;\r
2678 case 2: \r
e4ac870f 2679 T.Second = _STOU8(N->getText(), N->getLine());\r
fd171542 2680 if (T.Second > 59) {\r
2681 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
2682 }\r
2683 break;\r
30fdf114
LG
2684 }\r
2685 >>\r
2686 }\r
2687 ;\r
2688\r
2689vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
2690 << UINT8 LFlags = 0; >>\r
2691 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
2692 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2693 ;\r
2694\r
2695timeFlagsField [UINT8 & Flags] :\r
e4ac870f 2696 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2697 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r
2698 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r
2699 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r
2700 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2701 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2702 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2703 ;\r
2704\r
2705vfrStatementQuestionTag :\r
2706 vfrStatementStatTag "," |\r
2707 vfrStatementInconsistentIf |\r
2708 vfrStatementNoSubmitIf |\r
2709 vfrStatementDisableIfQuest |\r
2710 vfrStatementRefresh |\r
da92f276 2711 vfrStatementVarstoreDevice |\r
4234283c 2712 vfrStatementExtension |\r
ea0f6464
LG
2713 vfrStatementRefreshEvent |\r
2714 vfrStatementWarningIf\r
30fdf114
LG
2715 ;\r
2716\r
2717vfrStatementQuestionTagList :\r
2718 ( vfrStatementQuestionTag )*\r
2719 ;\r
2720\r
2721vfrStatementQuestionOptionTag :\r
2722 vfrStatementSuppressIfQuest |\r
2723 vfrStatementGrayOutIfQuest |\r
2724 vfrStatementValue |\r
2725 vfrStatementDefault |\r
52302d4d
LG
2726 vfrStatementRead |\r
2727 vfrStatementWrite |\r
30fdf114
LG
2728 vfrStatementOptions\r
2729 ;\r
2730\r
2731vfrStatementQuestionOptionList :\r
2732 (\r
2733 vfrStatementQuestionTag |\r
2734 vfrStatementQuestionOptionTag\r
2735 )*\r
2736 ;\r
2737\r
2738vfrStatementStatList :\r
2739 vfrStatementStat |\r
2740 vfrStatementQuestions |\r
2741 vfrStatementConditionalNew |\r
2742 vfrStatementLabel |\r
da92f276 2743 vfrStatementExtension |\r
30fdf114
LG
2744 // Just for framework vfr compatibility\r
2745 vfrStatementInvalid\r
2746 ;\r
2747\r
2748vfrStatementStatListOld :\r
2749 vfrStatementStat |\r
2750 vfrStatementQuestions |\r
2751 vfrStatementLabel |\r
2752 // Just for framework vfr compatibility\r
2753 vfrStatementInvalid\r
2754 ;\r
2755\r
2756vfrStatementDisableIfStat :\r
2757 << \r
2758 CIfrDisableIf DIObj; \r
30fdf114
LG
2759 >>\r
2760 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 2761 vfrStatementExpression[0] ";" \r
30fdf114
LG
2762 ( vfrStatementStatList )*\r
2763 E:EndIf << CRT_END_OP (E); >>\r
2764 ";"\r
2765 ;\r
2766\r
2767vfrStatementInconsistentIfStat :\r
2768 << CIfrInconsistentIf IIObj; >>\r
2769 L:InconsistentIf <<\r
2770 if (!mCompatibleMode) {\r
2771 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
2772 }\r
2773 IIObj.SetLineNo(L->getLine());\r
2774 >>\r
e4ac870f 2775 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2776 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2777 vfrStatementExpression[0]\r
2778 E:EndIf << CRT_END_OP (E); >>\r
2779 ";"\r
2780 ;\r
2781\r
2782//\r
2783// Compatible for framework vfr file\r
2784//\r
2785vfrStatementgrayoutIfSuppressIf:\r
2786 << CIfrSuppressIf SIObj; >>\r
2787 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2788 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2789 vfrStatementExpression[0]\r
2790 ";"\r
2791 ;\r
2792\r
2793vfrStatementsuppressIfGrayOutIf:\r
2794 << CIfrGrayOutIf GOIObj; >>\r
2795 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2796 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2797 vfrStatementExpression[0]\r
2798 ";"\r
2799 ;\r
2800\r
2801vfrStatementSuppressIfStatNew :\r
2802 << CIfrSuppressIf SIObj;>>\r
2803 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2804 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2805 vfrStatementExpression[0]\r
2806 ";"\r
2807 ( vfrStatementStatList )*\r
2808 E: EndIf ";" << CRT_END_OP (E); >>\r
2809 ;\r
2810\r
2811vfrStatementGrayOutIfStatNew :\r
2812 << CIfrGrayOutIf GOIObj;>>\r
2813 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2814 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2815 vfrStatementExpression[0]\r
2816 ";"\r
2817 ( vfrStatementStatList )*\r
2818 E: EndIf ";" << CRT_END_OP (E); >>\r
2819 ;\r
2820\r
2821vfrStatementSuppressIfStatOld :\r
2822 <<\r
2823 CIfrSuppressIf SIObj;\r
2824 BOOLEAN GrayOutExist = FALSE;\r
2825 >>\r
2826 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2827 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2828 vfrStatementExpression[0]\r
2829 ";"\r
2830 {\r
2831 vfrStatementsuppressIfGrayOutIf\r
2832 << GrayOutExist = TRUE; >>\r
2833 }\r
2834 ( vfrStatementStatListOld )*\r
2835 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
2836 ;\r
2837\r
2838vfrStatementGrayOutIfStatOld :\r
2839 <<\r
2840 CIfrGrayOutIf GOIObj;\r
2841 BOOLEAN SuppressExist = FALSE;\r
2842 >>\r
2843 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2844 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2845 vfrStatementExpression[0]\r
2846 ";"\r
2847 {\r
2848 vfrStatementgrayoutIfSuppressIf\r
2849 << SuppressExist = TRUE; >>\r
2850 }\r
2851 ( vfrStatementStatListOld )*\r
2852 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
2853 ;\r
2854\r
2855vfrImageTag :\r
2856 << CIfrImage IObj; >>\r
e4ac870f 2857 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
30fdf114
LG
2858 ;\r
2859\r
2860vfrLockedTag :\r
2861 << CIfrLocked LObj; >>\r
2862 L:Locked << LObj.SetLineNo(L->getLine()); >>\r
2863 ;\r
2864\r
4234283c
LG
2865vfrModalTag :\r
2866 << CIfrModal MObj; >>\r
2867 L:Modal << MObj.SetLineNo(L->getLine()); >>\r
2868 ;\r
2869\r
30fdf114
LG
2870vfrStatementStatTag :\r
2871 vfrImageTag |\r
2872 vfrLockedTag\r
2873 ;\r
2874\r
2875vfrStatementStatTagList :\r
2876 vfrStatementStatTag ( "," vfrStatementStatTag )*\r
2877 ;\r
2878\r
2879vfrStatementImage :\r
2880 vfrImageTag\r
2881 ";"\r
2882 ;\r
2883\r
4234283c
LG
2884vfrStatementModal :\r
2885 vfrModalTag\r
2886 ";"\r
2887 ;\r
2888\r
30fdf114
LG
2889vfrStatementLocked :\r
2890 vfrLockedTag\r
2891 ";"\r
2892 ;\r
2893\r
2894vfrStatementInconsistentIf :\r
2895 << CIfrInconsistentIf IIObj; >>\r
2896 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2897 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2898 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2899 vfrStatementExpression[0]\r
2900 E:EndIf << CRT_END_OP (E); >>\r
2901 ;\r
2902\r
2903vfrStatementNoSubmitIf :\r
2904 << CIfrNoSubmitIf NSIObj; >>\r
2905 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2906 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2907 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2908 vfrStatementExpression[0]\r
2909 E:EndIf << CRT_END_OP (E); >>\r
2910 ;\r
2911\r
ea0f6464
LG
2912vfrStatementWarningIf :\r
2913 << CIfrWarningIf WIObj; >>\r
2914 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>\r
e4ac870f
LG
2915 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
2916 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
ea0f6464
LG
2917 vfrStatementExpression[0]\r
2918 E:EndIf << CRT_END_OP (E); >>\r
2919 ;\r
2920\r
30fdf114
LG
2921vfrStatementDisableIfQuest :\r
2922 << \r
2923 CIfrDisableIf DIObj; \r
30fdf114
LG
2924 >>\r
2925 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 2926 vfrStatementExpression[0] ";"\r
30fdf114
LG
2927 vfrStatementQuestionOptionList\r
2928 E:EndIf << CRT_END_OP (E); >>\r
2929 ;\r
2930\r
2931vfrStatementRefresh :\r
2932 << CIfrRefresh RObj; >>\r
2933 L:Refresh << RObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2934 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\r
30fdf114
LG
2935 ;\r
2936\r
4234283c
LG
2937vfrStatementRefreshEvent :\r
2938 <<\r
2939 CIfrRefreshId RiObj;\r
2940 EFI_GUID Guid;\r
2941 >>\r
2942 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
2943 "=" guidDefinition[Guid] "," << RiObj.SetRefreshEventGroutId (&Guid); >>\r
2944 ;\r
2945\r
30fdf114
LG
2946vfrStatementVarstoreDevice :\r
2947 << CIfrVarStoreDevice VDObj; >>\r
2948 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2949 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2950 ;\r
2951\r
2952vfrStatementSuppressIfQuest :\r
2953 << CIfrSuppressIf SIObj; >>\r
2954 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2955 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2956 vfrStatementExpression[0] ";"\r
2957 vfrStatementQuestionOptionList\r
2958 E:EndIf << CRT_END_OP (E); >>\r
2959 ;\r
2960\r
2961vfrStatementGrayOutIfQuest :\r
2962 << CIfrGrayOutIf GOIObj; >>\r
2963 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2964 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2965 vfrStatementExpression[0] ";"\r
2966 vfrStatementQuestionOptionList\r
2967 E:EndIf << CRT_END_OP (E); >>\r
2968 ;\r
2969\r
2970vfrStatementOptions :\r
2971 vfrStatementOneOfOption\r
2972 ;\r
2973\r
2974vfrStatementOneOfOption :\r
2975 <<\r
4afd3d04 2976 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
30fdf114 2977 CHAR8 *VarStoreName = NULL;\r
4afd3d04
LG
2978 UINT32 Size = 0;\r
2979 BOOLEAN TypeError = FALSE;\r
2980 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
2981 EFI_GUID *VarStoreGuid = NULL;\r
2982 \r
2983 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2984 TypeError = TRUE;\r
2985 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
2986 } else {\r
2987 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
2988 }\r
2989\r
2990 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
2991 CIfrOneOfOption OOOObj ((UINT8)Size);\r
30fdf114 2992 >>\r
4afd3d04
LG
2993 L:Option << \r
2994 OOOObj.SetLineNo(L->getLine());\r
2995 if (TypeError) {\r
2996 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
2997 }\r
2998 if (ReturnCode != VFR_RETURN_SUCCESS) {\r
2999 _PCATCH (ReturnCode, L->getLine());\r
3000 }\r
3001 >>\r
e4ac870f 3002 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
a709adfa
LG
3003 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," \r
3004 << \r
3005 if (gCurrentMinMaxData != NULL) {\r
3006 //set min/max value for oneof opcode\r
3007 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
3008 switch (_GET_CURRQEST_DATATYPE()) {\r
3009 case EFI_IFR_TYPE_NUM_SIZE_64:\r
3010 gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
3011 break;\r
3012 case EFI_IFR_TYPE_NUM_SIZE_32:\r
3013 gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
3014 break;\r
3015 case EFI_IFR_TYPE_NUM_SIZE_16:\r
3016 gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
3017 break;\r
3018 case EFI_IFR_TYPE_NUM_SIZE_8:\r
3019 gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
3020 break;\r
3021 default:\r
3022 break;\r
3023 }\r
3024 }\r
3025 OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
3026 OOOObj.SetValue (Val); \r
3027 >>\r
30fdf114
LG
3028 F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
3029 <<\r
4afd3d04
LG
3030 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
3031 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
3032 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
3033 if (OOOObj.GetFlags () & 0x10) {\r
3034 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
3035 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3036 EFI_HII_DEFAULT_CLASS_STANDARD,\r
3037 _GET_CURRQEST_VARTINFO(),\r
3038 VarStoreName,\r
3039 VarStoreGuid,\r
3040 _GET_CURRQEST_DATATYPE (),\r
3041 Val\r
3042 ), L->getLine());\r
3043 }\r
3044 if (OOOObj.GetFlags () & 0x20) {\r
3045 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
3046 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3047 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
3048 _GET_CURRQEST_VARTINFO(),\r
3049 VarStoreName,\r
3050 VarStoreGuid,\r
3051 _GET_CURRQEST_DATATYPE (),\r
3052 Val\r
3053 ), L->getLine());\r
3054 }\r
30fdf114
LG
3055 }\r
3056 >>\r
3057 {\r
3058 "," Key "=" KN:Number <<\r
3059 if (!mCompatibleMode) {\r
3060 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
3061 }\r
3062 //\r
3063 // Guid Option Key\r
3064 //\r
3065 CIfrOptionKey IfrOptionKey (\r
3066 gCurrentQuestion->QUESTION_ID(),\r
3067 Val,\r
e4ac870f 3068 _STOQID(KN->getText(), KN->getLine())\r
30fdf114
LG
3069 );\r
3070 SET_LINE_INFO (IfrOptionKey, KN);\r
3071 >>\r
3072 }\r
3073 (\r
3074 T:"," vfrImageTag << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
3075 )*\r
3076 ";"\r
3077 ;\r
3078\r
3079vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
3080 <<\r
3081 UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
3082 UINT8 HFlags = 0;\r
3083 >>\r
3084 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
3085 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
3086 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
3087 ;\r
3088\r
3089oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 3090 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3091 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r
3092 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
3093 | InteractiveFlag << $HFlags |= 0x04; >>\r
30fdf114 3094 | ResetRequiredFlag << $HFlags |= 0x10; >>\r
30fdf114
LG
3095 | ManufacturingFlag << $LFlags |= 0x20; >>\r
3096 | DefaultFlag << $LFlags |= 0x10; >>\r
05154781
ED
3097 | A:NVAccessFlag << \r
3098 if (mCompatibleMode) {\r
3099 $HFlags |= 0x08;\r
3100 } else {\r
3101 gCVfrErrorHandle.HandleWarning (\r
3102 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3103 A->getLine(),\r
3104 A->getText()\r
3105 );\r
3106 }\r
3107 >>\r
3108 | L:LateCheckFlag << \r
3109 if (mCompatibleMode) {\r
3110 $HFlags |= 0x20;\r
3111 } else {\r
3112 gCVfrErrorHandle.HandleWarning (\r
3113 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3114 L->getLine(),\r
3115 L->getText()\r
3116 );\r
3117 }\r
3118 >>\r
30fdf114
LG
3119 ;\r
3120\r
3121vfrStatementLabel :\r
3122 L:Label\r
3123 N:Number <<\r
3124 if (mCompatibleMode) {\r
3125 //\r
3126 // Add end Label for Framework Vfr\r
3127 //\r
3128 CIfrLabel LObj1;\r
3129 LObj1.SetLineNo(L->getLine());\r
3130 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
3131 }\r
3132\r
3133 {\r
3134 CIfrLabel LObj2;\r
3135 LObj2.SetLineNo(L->getLine());\r
e4ac870f 3136 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
30fdf114
LG
3137 }\r
3138 >>\r
3139 ";"\r
3140 ;\r
3141\r
3142vfrStatementBanner :\r
3143 << CIfrBanner BObj; >>\r
3144 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r
e4ac870f 3145 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3146 (\r
3147 (\r
e4ac870f 3148 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
30fdf114
LG
3149 Align\r
3150 (\r
3151 Left << BObj.SetAlign (0); >>\r
3152 | Center << BObj.SetAlign (1); >>\r
3153 | Right << BObj.SetAlign (2); >>\r
3154 ) ";"\r
3155 )\r
3156 |\r
3157 (\r
e4ac870f 3158 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
30fdf114
LG
3159 )\r
3160 )\r
3161 ;\r
3162\r
3163//******************************************************************************\r
3164//\r
3165// keep some syntax for compatibility but not generate any IFR object\r
3166//\r
3167vfrStatementInvalidHidden :\r
3168 L:Hidden <<\r
3169 if (!mCompatibleMode) {\r
3170 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3171 }\r
3172 >>\r
3173 Value "=" Number ","\r
3174 Key "=" Number ";"\r
3175 ;\r
3176\r
3177vfrStatementInvalidInconsistentIf :\r
3178 InconsistentIf\r
3179 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
3180 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3181 vfrStatementExpression[0]\r
3182 EndIf\r
3183 ";"\r
3184 ;\r
3185\r
3186vfrStatementInvalidInventory :\r
3187 L:Inventory <<\r
3188 if (!mCompatibleMode) {\r
3189 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3190 }\r
3191 >>\r
3192 Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3193 Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3194 {\r
3195 Text "=" "STRING_TOKEN" "\(" Number "\)"\r
3196 }\r
3197 ";"\r
3198 ;\r
3199\r
3200vfrStatementInvalidSaveRestoreDefaults :\r
3201 (\r
3202 L:Save <<\r
3203 if (!mCompatibleMode) {\r
3204 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3205 }\r
3206 >>\r
3207 |\r
3208 K:Restore <<\r
3209 if (!mCompatibleMode) {\r
3210 _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
3211 }\r
3212 >>\r
3213 )\r
3214 Defaults ","\r
3215 FormId "=" Number ","\r
3216 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3217 Help "=" "STRING_TOKEN" "\(" Number "\)"\r
3218 { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
3219 { "," Key "=" Number }\r
3220 ";"\r
3221 ;\r
3222\r
3223//******************************************************************************\r
3224//\r
3225// The syntax of expression\r
3226//\r
3227#token Dup("dup") "dup"\r
3228#token VarEqVal("vareqval") "vareqval"\r
3229#token Var("var") "var"\r
3230#token IdEqVal("ideqval") "ideqval"\r
3231#token IdEqId("ideqid") "ideqid"\r
3232#token IdEqValList("ideqvallist") "ideqvallist"\r
3233#token QuestionRef("questionref") "questionref"\r
3234#token RuleRef("ruleref") "ruleref"\r
3235#token StringRef("stringref") "stringref"\r
3236#token PushThis("pushthis") "pushthis"\r
a709adfa 3237#token Security("security") "security"\r
52302d4d 3238#token Get("get") "get"\r
30fdf114
LG
3239#token True("TRUE") "TRUE"\r
3240#token False("FALSE") "FALSE"\r
3241#token One("ONE") "ONE"\r
3242#token Ones("ONES") "ONES"\r
3243#token Zero("ZERO") "ZERO"\r
3244#token Undefined("UNDEFINED") "UNDEFINED"\r
3245#token Version("VERSION") "VERSION"\r
3246#token Length("length") "length"\r
3247#token AND("AND") "AND"\r
3248#token OR("OR") "OR"\r
3249#token NOT("NOT") "NOT"\r
52302d4d 3250#token Set("set") "set"\r
30fdf114
LG
3251#token BitWiseNot("~") "\~"\r
3252#token BoolVal("boolval") "boolval"\r
3253#token StringVal("stringval") "stringval"\r
3254#token UnIntVal("unintval") "unintval"\r
3255#token ToUpper("toupper") "toupper"\r
3256#token ToLower("tolower") "tolower"\r
3257#token Match("match") "match"\r
3258#token Catenate("catenate") "catenate"\r
3259#token QuestionRefVal("questionrefval") "questionrefval"\r
3260#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3261#token Map("map") "map"\r
4234283c 3262#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3263\r
3264//\r
3265// Root expression extension function called by other function.\r
3266//\r
3267vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3268 << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>\r
30fdf114
LG
3269 andTerm[$RootLevel, $ExpOpCount]\r
3270 (\r
3271 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3272 )*\r
3273 <<\r
3274 //\r
3275 // Extend OpCode Scope only for the root expression.\r
3276 //\r
3277 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3278 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3279 CIfrEnd EObj;\r
52302d4d
LG
3280 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3281 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3282 }\r
3283 }\r
3284 }\r
52302d4d
LG
3285 \r
3286 if ($RootLevel == 0) {\r
3287 mCIfrOpHdrIndex --;\r
3288 }\r
30fdf114
LG
3289 >>\r
3290 ;\r
3291\r
3292//\r
3293// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3294// This funciton is only called by sub expression.\r
3295//\r
3296vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3297 andTerm[$RootLevel, $ExpOpCount]\r
3298 (\r
3299 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3300 )*\r
3301 ;\r
3302\r
3303andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3304 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3305 (\r
3306 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3307 )*\r
3308 ;\r
3309\r
3310bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3311 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3312 (\r
3313 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3314 )*\r
3315 ;\r
3316\r
3317bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3318 equalTerm[$RootLevel, $ExpOpCount]\r
3319 (\r
3320 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3321 )*\r
3322 ;\r
3323\r
3324equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3325 compareTerm[$RootLevel, $ExpOpCount]\r
3326 (\r
3327 (\r
3328 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3329 )\r
3330 |\r
3331 (\r
3332 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3333 )\r
3334 )*\r
3335 ;\r
3336\r
3337compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3338 shiftTerm[$RootLevel, $ExpOpCount]\r
3339 (\r
3340 (\r
3341 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3342 )\r
3343 |\r
3344 (\r
3345 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3346 )\r
3347 |\r
3348 (\r
3349 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3350 )\r
3351 |\r
3352 (\r
3353 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3354 )\r
3355 )*\r
3356 ;\r
3357\r
3358shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3359 addMinusTerm[$RootLevel, $ExpOpCount]\r
3360 (\r
3361 (\r
3362 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3363 )\r
3364 |\r
3365 (\r
3366 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3367 )\r
3368 )*\r
3369 ;\r
3370\r
3371addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3372 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3373 (\r
3374 (\r
3375 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3376 )\r
3377 |\r
3378 (\r
3379 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3380 )\r
3381 )*\r
3382 ;\r
3383\r
3384multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3385 castTerm[$RootLevel, $ExpOpCount]\r
3386 (\r
3387 (\r
3388 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3389 )\r
3390 |\r
3391 (\r
3392 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3393 )\r
3394 |\r
3395 (\r
3396 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3397 )\r
3398 )*\r
3399 ;\r
3400\r
3401castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3402 << UINT8 CastType = 0xFF; >>\r
3403 (\r
3404 L:"\("\r
3405 (\r
3406 Boolean << CastType = 0; >>\r
3407 | Uint64 << CastType = 1; >>\r
3408 | Uint32 << CastType = 1; >>\r
3409 | Uint16 << CastType = 1; >>\r
3410 | Uint8 << CastType = 1; >>\r
3411 )\r
3412 "\)"\r
3413 )*\r
3414 atomTerm[$RootLevel, $ExpOpCount]\r
3415 <<\r
3416 switch (CastType) {\r
3417 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3418 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3419 }\r
3420 >>\r
3421 ;\r
3422\r
3423atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3424 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3425 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
3426 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3427 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3428 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3429 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3430 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3431 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3432 | (\r
3433 L:NOT\r
3434 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3435 )\r
3436 ;\r
3437\r
3438vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3439 L:Catenate\r
3440 "\("\r
3441 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3442 ","\r
3443 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3444 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3445 ;\r
3446\r
3447vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3448 L:Match\r
3449 "\("\r
3450 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3451 ","\r
3452 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3453 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3454 ;\r
3455\r
3456vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3457 "\("\r
3458 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3459 "\)"\r
3460 ;\r
3461\r
3462vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3463 dupExp[$RootLevel, $ExpOpCount]\r
3464 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3465 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3466 | ideqidExp[$RootLevel, $ExpOpCount]\r
3467 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3468 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3469 | rulerefExp[$RootLevel, $ExpOpCount]\r
3470 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3471 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3472 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3473 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3474 ;\r
3475\r
3476dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3477 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3478 ;\r
3479\r
3480vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3481 <<\r
3482 EFI_QUESTION_ID QId;\r
3483 UINT32 Mask;\r
3484 UINT16 ConstVal;\r
3485 CHAR8 *VarIdStr;\r
3486 UINT32 LineNo;\r
30fdf114 3487 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3488 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3489 >>\r
3490 L:VarEqVal <<\r
3491 if (!mCompatibleMode) {\r
3492 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3493 }\r
3494 >>\r
3495 VK:Var\r
3496 OpenParen\r
3497 VN:Number <<\r
3498 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
4afd3d04 3499 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114
LG
3500 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
3501 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
3502 VarIdStr,\r
3503 &mFormsetGuid,\r
e4ac870f 3504 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3505 0x2, //default type is UINT16\r
3506 FALSE\r
3507 ), VN);\r
3508 } else {\r
3509 _PCATCH (VfrReturnCode, VN);\r
3510 }\r
3511 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3512 LineNo = GET_LINENO(VN);\r
3513 >>\r
3514 CloseParen\r
3515 (\r
3516 (\r
3517 "=="\r
e4ac870f 3518 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3519 <<\r
3520 if (Mask == 0) {\r
3521 CIfrEqIdVal EIVObj (L->getLine());\r
3522 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3523 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3524 EIVObj.SetValue (ConstVal);\r
3525 $ExpOpCount++;\r
3526 } else {\r
3527 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3528 }\r
3529 >>\r
3530 )\r
3531 |\r
3532 (\r
3533 "<="\r
e4ac870f 3534 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3535 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3536 )\r
3537 |\r
3538 (\r
3539 "<"\r
e4ac870f 3540 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3541 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3542 )\r
3543 |\r
3544 (\r
3545 ">="\r
e4ac870f 3546 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3547 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3548 )\r
3549 |\r
3550 (\r
3551 ">"\r
e4ac870f 3552 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3553 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3554 )\r
3555 )\r
3556 ;\r
3557\r
3558ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3559 <<\r
3560 EFI_QUESTION_ID QId;\r
3561 UINT32 Mask;\r
3562 UINT16 ConstVal;\r
3563 CHAR8 *VarIdStr;\r
3564 UINT32 LineNo;\r
3565 >>\r
3566 L:IdEqVal\r
3567 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3568 (\r
3569 (\r
3570 "=="\r
e4ac870f 3571 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3572 <<\r
3573 if (Mask == 0) {\r
3574 CIfrEqIdVal EIVObj (L->getLine());\r
3575 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3576 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3577 EIVObj.SetValue (ConstVal);\r
3578 $ExpOpCount++;\r
3579 } else {\r
3580 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3581 }\r
3582 >>\r
3583 )\r
3584 |\r
3585 (\r
3586 "<="\r
e4ac870f 3587 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3588 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3589 )\r
3590 |\r
3591 (\r
3592 "<"\r
e4ac870f 3593 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3594 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3595 )\r
3596 |\r
3597 (\r
3598 ">="\r
e4ac870f 3599 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3600 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3601 )\r
3602 |\r
3603 (\r
3604 ">"\r
e4ac870f 3605 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3606 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3607 )\r
3608 )\r
3609 ;\r
3610\r
3611ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3612 <<\r
3613 EFI_QUESTION_ID QId[2];\r
3614 UINT32 Mask[2];\r
3615 CHAR8 *VarIdStr[2];\r
3616 UINT32 LineNo[2];\r
3617 >>\r
3618 L:IdEqId\r
3619 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
3620 (\r
3621 (\r
3622 "=="\r
3623 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3624 <<\r
3625 if (Mask[0] & Mask[1]) {\r
3626 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
3627 } else {\r
3628 CIfrEqIdId EIIObj(L->getLine());\r
3629 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
3630 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
3631 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
3632 $ExpOpCount++;\r
3633 }\r
3634 >>\r
3635 )\r
3636 |\r
3637 (\r
3638 "<="\r
3639 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3640 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
3641 )\r
3642 |\r
3643 (\r
3644 "<"\r
3645 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3646 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
3647 )\r
3648 |\r
3649 (\r
3650 ">="\r
3651 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3652 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
3653 )\r
3654 |\r
3655 (\r
3656 ">"\r
3657 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3658 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
3659 )\r
3660 )\r
3661 ;\r
3662\r
3663ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3664 <<\r
3665 UINT16 ListLen = 0;\r
3666 EFI_QUESTION_ID QId;\r
3667 UINT32 Mask;\r
3668 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3669 CHAR8 *VarIdStr;\r
3670 UINT32 LineNo;\r
3671 >>\r
3672 L:IdEqValList\r
3673 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3674 "=="\r
3675 (\r
e4ac870f 3676 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
3677 )+\r
3678 <<\r
3679 if (Mask != 0) {\r
3680 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
3681 } else {\r
3682 UINT16 Index;\r
3683 CIfrEqIdList EILObj(L->getLine());\r
3684 if (QId != EFI_QUESTION_ID_INVALID) {\r
3685 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3686 }\r
3687 EILObj.SetListLength (ListLen);\r
3688 for (Index = 0; Index < ListLen; Index++) {\r
3689 EILObj.SetValueList (Index, ValueList[Index]);\r
3690 }\r
3691 \r
3692 EILObj.UpdateIfrBuffer();\r
3693 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
3694 \r
3695 if (QId == EFI_QUESTION_ID_INVALID) {\r
3696 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3697 }\r
3698 $ExpOpCount++;\r
3699 }\r
3700 >>\r
3701 ;\r
3702\r
2bcc713e 3703questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 3704 <<\r
30fdf114
LG
3705 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3706 UINT32 BitMask;\r
3707 CHAR8 *QName = NULL;\r
3708 UINT32 LineNo = 0;\r
3709 >>\r
3710 L:QuestionRef\r
2bcc713e
LG
3711 "\("\r
3712 (\r
30fdf114
LG
3713 QN:StringIdentifier <<\r
3714 QName = QN->getText();\r
2bcc713e 3715 LineNo = QN->getLine();\r
30fdf114
LG
3716 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
3717 >>\r
e4ac870f 3718 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 3719 )\r
2bcc713e 3720 "\)"\r
30fdf114 3721 <<\r
2bcc713e 3722 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
3723 ;\r
3724\r
3725rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3726 L:RuleRef\r
3727 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
3728 ;\r
3729\r
3730//******************************************************\r
3731// PARSE:\r
3732// stringref (STR_FORM_SET_TITLE)\r
3733//\r
3734stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
3735 <<\r
3736 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
3737 >>\r
30fdf114 3738 L:StringRef\r
52302d4d
LG
3739 "\("\r
3740 ( \r
3741 "STRING_TOKEN"\r
3742 "\(" \r
e4ac870f 3743 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 3744 "\)"\r
e4ac870f 3745 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
3746 )\r
3747 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
3748 ;\r
3749\r
3750pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3751 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3752 ;\r
3753\r
a709adfa
LG
3754securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3755 <<\r
3756 EFI_GUID Guid;\r
3757 >>\r
3758 L:Security\r
3759 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
3760 ;\r
3761\r
52302d4d
LG
3762numericVarStoreType [UINT8 & VarType] :\r
3763 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
3764 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
3765 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
3766 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
3767 ;\r
3768\r
3769getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3770 <<\r
3771 EFI_VARSTORE_INFO Info;\r
3772 CHAR8 *VarIdStr = NULL;\r
3773 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3774 UINT32 Mask = 0;\r
3775 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3776 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3777 UINT32 VarSize = 0;\r
3778 Info.mVarStoreId = 0;\r
3779 >>\r
3780 L:Get\r
3781 "\(" \r
3782 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3783 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
3784 "\)" << \r
3785 {\r
3786 if (Info.mVarStoreId == 0) {\r
3787 // support Date/Time question\r
3788 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3789 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3790 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3791 }\r
3792 if (QType == QUESTION_DATE) {\r
3793 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3794 } else if (QType == QUESTION_TIME) {\r
3795 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3796 }\r
3797 switch (Mask) {\r
3798 case DATE_YEAR_BITMASK:\r
3799 Info.mInfo.mVarOffset = 0;\r
3800 break;\r
3801 case DATE_DAY_BITMASK:\r
3802 Info.mInfo.mVarOffset = 3;\r
3803 break;\r
3804 case TIME_HOUR_BITMASK:\r
3805 Info.mInfo.mVarOffset = 0;\r
3806 break;\r
3807 case TIME_MINUTE_BITMASK:\r
3808 Info.mInfo.mVarOffset = 1;\r
3809 break;\r
3810 case TIME_SECOND_BITMASK:\r
3811 Info.mInfo.mVarOffset = 2;\r
3812 break;\r
3813 default:\r
3814 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3815 break;\r
3816 }\r
3817 } else {\r
3818 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3819 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3820 }\r
3821 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3822 Info.mVarType = VarType;\r
3823 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3824 Info.mVarTotalSize = VarSize;\r
3825 }\r
3826 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3827 if (VarSize != Info.mVarTotalSize) {\r
3828 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
3829 }\r
3830 }\r
3831 CIfrGet GObj(L->getLine()); \r
3832 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
3833 GObj.SetVarInfo (&Info); \r
3834 delete VarIdStr; \r
3835 $ExpOpCount++;\r
3836 }\r
3837 >>\r
3838 ;\r
3839\r
30fdf114
LG
3840vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3841 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
3842 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
3843 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
3844 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
3845 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
3846 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
3847 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 3848 | V:Number << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText(), V->getLine())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >>\r
30fdf114
LG
3849 ;\r
3850\r
3851vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3852 lengthExp[$RootLevel, $ExpOpCount]\r
3853 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3854 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3855 | stringref2Exp[$RootLevel, $ExpOpCount]\r
3856 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 3857 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3858 | unintExp[$RootLevel, $ExpOpCount]\r
3859 | toupperExp[$RootLevel, $ExpOpCount]\r
3860 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 3861 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3862 ;\r
3863\r
3864lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3865 L:Length\r
3866 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3867 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
3868 ;\r
3869\r
3870bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3871 L:BitWiseNot\r
3872 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3873 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
3874 ;\r
3875\r
2bcc713e
LG
3876question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3877 <<\r
3878 UINT8 Type = 0x1;\r
3879 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
3880 EFI_GUID Guid = {0,};\r
3881 >>\r
30fdf114 3882 L:QuestionRefVal\r
2bcc713e
LG
3883 "\("\r
3884 {\r
e4ac870f 3885 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
3886 }\r
3887 {\r
3888 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
3889 }\r
3890 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
3891 "\)"\r
3892 <<\r
3893 switch (Type) {\r
3894 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
3895 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
3896 case 0x3: {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
3897 }\r
3898 $ExpOpCount++;\r
3899 >>\r
30fdf114
LG
3900 ;\r
3901\r
3902stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3903 L:StringRefVal\r
3904 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3905 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
3906 ;\r
3907\r
3908toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3909 L:BoolVal\r
3910 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3911 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
3912 ;\r
3913\r
3914tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3915 << UINT8 Fmt = 0; >>\r
3916 L:StringVal\r
3917 {\r
e4ac870f 3918 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
3919 }\r
3920 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3921 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
3922 ;\r
3923\r
3924unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3925 L:UnIntVal\r
3926 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3927 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
3928 ;\r
3929\r
3930toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3931 L:ToUpper\r
3932 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3933 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
3934 ;\r
3935\r
3936tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3937 L:ToLower\r
3938 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3939 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
3940 ;\r
3941\r
52302d4d
LG
3942setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3943 <<\r
3944 EFI_VARSTORE_INFO Info;\r
3945 CHAR8 *VarIdStr = NULL;\r
3946 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3947 UINT32 Mask = 0;\r
3948 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3949 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3950 UINT32 VarSize = 0;\r
3951 Info.mVarStoreId = 0;\r
3952 >>\r
3953 L:Set\r
3954 "\("\r
3955 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3956 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
3957 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
3958 "\)"\r
3959 << \r
3960 {\r
3961 if (Info.mVarStoreId == 0) {\r
3962 // support Date/Time question\r
3963 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3964 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3965 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3966 }\r
3967 if (QType == QUESTION_DATE) {\r
3968 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3969 } else if (QType == QUESTION_TIME) {\r
3970 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3971 }\r
3972 switch (Mask) {\r
3973 case DATE_YEAR_BITMASK:\r
3974 Info.mInfo.mVarOffset = 0;\r
3975 break;\r
3976 case DATE_DAY_BITMASK:\r
3977 Info.mInfo.mVarOffset = 3;\r
3978 break;\r
3979 case TIME_HOUR_BITMASK:\r
3980 Info.mInfo.mVarOffset = 0;\r
3981 break;\r
3982 case TIME_MINUTE_BITMASK:\r
3983 Info.mInfo.mVarOffset = 1;\r
3984 break;\r
3985 case TIME_SECOND_BITMASK:\r
3986 Info.mInfo.mVarOffset = 2;\r
3987 break;\r
3988 default:\r
3989 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3990 break;\r
3991 }\r
3992 } else {\r
3993 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3994 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3995 }\r
3996 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3997 Info.mVarType = VarType;\r
3998 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3999 Info.mVarTotalSize = VarSize;\r
4000 }\r
4001 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4002 if (VarSize != Info.mVarTotalSize) {\r
4003 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4004 }\r
4005 }\r
4006 CIfrSet TSObj(L->getLine()); \r
4007 TSObj.SetVarInfo (&Info); \r
4008 delete VarIdStr; \r
4009 $ExpOpCount++;\r
4010 }\r
4011 >>\r
4012 ;\r
4013\r
30fdf114
LG
4014vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4015 conditionalExp[$RootLevel, $ExpOpCount]\r
4016 | findExp[$RootLevel, $ExpOpCount]\r
4017 | midExp[$RootLevel, $ExpOpCount]\r
4018 | tokenExp[$RootLevel, $ExpOpCount]\r
4019 | spanExp[$RootLevel, $ExpOpCount]\r
4020 ;\r
4021\r
4022#token Cond("cond") "cond"\r
4023#token Find("find") "find"\r
4024#token Mid("mid") "mid"\r
4025#token Tok("token") "token"\r
4026#token Span("span") "span"\r
4027\r
4028conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4029 L:Cond "\("\r
4030 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4031 "?"\r
4032 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4033 ":"\r
4034 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4035 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
4036 ;\r
4037\r
4038findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4039 << UINT8 Format; >>\r
4040 L:Find "\("\r
4041 findFormat[Format] ( "\|" findFormat[Format] )*\r
4042 ","\r
4043 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4044 ","\r
4045 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4046 ","\r
4047 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4048 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
4049 ;\r
4050\r
4051findFormat [UINT8 & Format] :\r
4052 "SENSITIVE" << $Format = 0x00; >>\r
4053 | "INSENSITIVE" << $Format = 0x01; >>\r
4054 ;\r
4055\r
4056midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4057 L:Mid "\("\r
4058 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4059 ","\r
4060 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4061 ","\r
4062 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4063 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
4064 ;\r
4065\r
4066tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4067 L:Tok "\("\r
4068 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4069 ","\r
4070 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4071 ","\r
4072 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4073 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4074 ;\r
4075\r
4076spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4077 << UINT8 Flags = 0; >>\r
4078 S:Span "\("\r
4079 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4080 ","\r
4081 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4082 ","\r
4083 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4084 ","\r
4085 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4086 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4087 ;\r
4088\r
52302d4d
LG
4089vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4090 L:Map \r
4091 "\(" \r
4092 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4093 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4094 (\r
4095 vfrStatementExpression[0]\r
4096 ","\r
4097 vfrStatementExpression[0]\r
4098 ";"\r
4099 ) *\r
4100 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4101 ;\r
4102\r
30fdf114 4103spanFlags [UINT8 & Flags] :\r
e4ac870f 4104 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4105 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4106 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4107 ;\r
4108\r
4109#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4110#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4111\r
4112//******************************************************************************\r
4113//\r
4114// Parser class definition.\r
4115//\r
4116class EfiVfrParser {\r
4117<<\r
4118private:\r
4119 UINT8 mParserStatus;\r
4120 BOOLEAN mConstantOnlyInExpression;\r
4121\r
4122 CVfrDefaultStore mCVfrDefaultStore;\r
4123 CVfrDataStorage mCVfrDataStorage;\r
4124 CVfrQuestionDB mCVfrQuestionDB;\r
4125 CVfrRulesDB mCVfrRulesDB;\r
4126\r
52302d4d
LG
4127 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
4128 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
4129 UINT8 mCIfrOpHdrIndex;\r
30fdf114
LG
4130 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
4131 VOID _CLEAR_SAVED_OPHDR (VOID);\r
4132 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
4133\r
4134\r
4135 EFI_VARSTORE_INFO mCurrQestVarInfo;\r
4234283c 4136 EFI_GUID *mOverrideClassGuid;\r
4afd3d04
LG
4137 CHAR8* mLastFormEndAddr;\r
4138\r
4139//\r
4140// Whether the question already has default value.\r
4141//\r
4142 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
4143 UINT16 mUsedDefaultCount;\r
30fdf114
LG
4144\r
4145//\r
4146// For framework vfr compatibility\r
4147//\r
4148 BOOLEAN mCompatibleMode;\r
4149 EFI_GUID mFormsetGuid;\r
4150\r
4151 VOID _CRT_OP (IN BOOLEAN);\r
4152\r
4153 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
4154 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
4155\r
4156 UINT8 _GET_CURRQEST_DATATYPE ();\r
4157 UINT32 _GET_CURRQEST_VARSIZE ();\r
b303ea72 4158 UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
4afd3d04 4159 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
30fdf114
LG
4160\r
4161public:\r
52302d4d 4162 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
30fdf114
LG
4163 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
4164 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
4165 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
52302d4d 4166 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
30fdf114
LG
4167\r
4168 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
4169\r
4170 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
4171 CHAR8* _U32TOS (IN UINT32);\r
e4ac870f
LG
4172 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);\r
4173 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);\r
4174 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);\r
4175 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);\r
4176 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4177 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4178 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
4179\r
4180 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);\r
4181 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);\r
4182 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);\r
30fdf114 4183\r
52302d4d 4184 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
30fdf114 4185\r
30fdf114
LG
4186 VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
4187 VOID _DeclareStandardDefaultStorage (IN UINT32);\r
4188 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
4189\r
4190 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
4191\r
4192 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r
4193 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
4194 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
4195 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
4234283c 4196 VOID SetOverrideClassGuid (IN EFI_GUID *);\r
30fdf114
LG
4197//\r
4198// For framework vfr compatibility\r
4199//\r
4200 VOID SetCompatibleMode (IN BOOLEAN);\r
4201>>\r
4202}\r
4203\r
4204<<\r
4205VOID\r
4206EfiVfrParser::_SAVE_OPHDR_COND (\r
4207 IN CIfrOpHeader &OpHdr,\r
4208 IN BOOLEAN Cond,\r
4209 IN UINT32 LineNo\r
4210 )\r
4211{\r
4212 if (Cond == TRUE) {\r
52302d4d 4213 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
30fdf114
LG
4214 return ;\r
4215 }\r
52302d4d
LG
4216 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
4217 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
30fdf114
LG
4218 }\r
4219}\r
4220\r
4221VOID\r
4222EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
4223 VOID\r
4224 )\r
4225{\r
52302d4d
LG
4226 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
4227 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
30fdf114
LG
4228}\r
4229\r
4230BOOLEAN\r
4231EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
4232 VOID\r
4233 )\r
4234{\r
52302d4d
LG
4235 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
4236 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
30fdf114
LG
4237 return TRUE;\r
4238 }\r
52302d4d 4239\r
30fdf114
LG
4240 //\r
4241 // IfrOpHdr is not set, FALSE is return.\r
4242 //\r
4243 return FALSE;\r
4244}\r
4245\r
4246VOID\r
4247EfiVfrParser::_CRT_OP (\r
4248 IN BOOLEAN Crt\r
4249 )\r
4250{\r
4251 gCreateOp = Crt;\r
4252}\r
4253\r
4254VOID\r
4255EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
4256 IN EFI_VARSTORE_INFO &Info\r
4257 )\r
4258{\r
4259 mCurrQestVarInfo = Info;\r
4260}\r
4261\r
4262EFI_VARSTORE_INFO &\r
4263EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
4264 VOID\r
4265 )\r
4266{\r
4267 return mCurrQestVarInfo;\r
4268}\r
4269\r
b303ea72
LG
4270UINT32\r
4271EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
4272 VOID\r
4273 )\r
4274{\r
4275 UINT8 Size = 1;\r
4276\r
4277 switch (mCurrQestVarInfo.mVarType) {\r
4278 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4279 Size = 1;\r
4280 break;\r
4281\r
4282 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4283 Size = 2;\r
4284 break;\r
4285\r
4286 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4287 Size = 4;\r
4288 break;\r
4289\r
4290 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4291 Size = 8;\r
4292 break;\r
4293\r
4294 default:\r
4295 break;\r
4296 }\r
4297\r
4298 return (mCurrQestVarInfo.mVarTotalSize / Size);\r
4299}\r
4300\r
30fdf114
LG
4301UINT8\r
4302EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
4303 VOID\r
4304 )\r
4305{\r
4306 return mCurrQestVarInfo.mVarType;\r
4307}\r
4308\r
4309UINT32\r
4310EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
4311 VOID\r
4312 )\r
4313{\r
4314 return mCurrQestVarInfo.mVarTotalSize;\r
4315}\r
4316\r
4317VOID\r
4318EfiVfrParser::_PCATCH (\r
4319 IN INTN ReturnCode,\r
4320 IN INTN ExpectCode,\r
4321 IN ANTLRTokenPtr Tok,\r
52302d4d 4322 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4323 )\r
4324{\r
4325 if (ReturnCode != ExpectCode) {\r
4326 mParserStatus++;\r
4327 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r
4328 }\r
4329}\r
4330\r
4331VOID\r
4332EfiVfrParser::_PCATCH (\r
4333 IN EFI_VFR_RETURN_CODE ReturnCode\r
4334 )\r
4335{\r
52302d4d 4336 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
30fdf114
LG
4337}\r
4338\r
4339VOID\r
4340EfiVfrParser::_PCATCH (\r
4341 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4342 IN ANTLRTokenPtr Tok\r
4343 )\r
4344{\r
52302d4d 4345 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
30fdf114
LG
4346}\r
4347\r
4348VOID\r
4349EfiVfrParser::_PCATCH (\r
4350 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4351 IN UINT32 LineNum\r
4352 )\r
4353{\r
52302d4d 4354 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
30fdf114
LG
4355}\r
4356\r
4357VOID\r
4358EfiVfrParser::_PCATCH (\r
4359 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4360 IN UINT32 LineNum,\r
52302d4d 4361 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4362 )\r
4363{\r
52302d4d 4364 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
30fdf114
LG
4365}\r
4366\r
4367VOID\r
4368EfiVfrParser::syn (\r
4369 ANTLRAbstractToken *Tok,\r
4370 ANTLRChar *Egroup,\r
4371 SetWordType *Eset,\r
4372 ANTLRTokenType ETok,\r
4373 INT32 Huh\r
4374 )\r
4375{\r
4376 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
4377\r
4378 mParserStatus += 1;\r
4379}\r
4380\r
4381CHAR8 *\r
4382EfiVfrParser::TrimHex (\r
4383 IN CHAR8 *Str,\r
4384 OUT BOOLEAN *IsHex\r
4385 )\r
4386{\r
4387 *IsHex = FALSE;\r
4388\r
4389 while (*Str && *Str == ' ') {\r
4390 Str++;\r
4391 }\r
4392 while (*Str && *Str == '0') {\r
4393 Str++;\r
4394 }\r
4395 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
4396 Str++;\r
4397 *IsHex = TRUE;\r
4398 }\r
4399\r
4400 return Str;\r
4401}\r
4402\r
4403CHAR8 *\r
4404EfiVfrParser::_U32TOS (\r
4405 IN UINT32 Value\r
4406 )\r
4407{\r
4408 CHAR8 *Str;\r
4409 Str = new CHAR8[20];\r
4410 sprintf (Str, "%d", Value);\r
4411 return Str;\r
4412}\r
4413\r
4414UINT8\r
4415EfiVfrParser::_STOU8 (\r
e4ac870f
LG
4416 IN CHAR8 *Str,\r
4417 IN UINT32 LineNum\r
30fdf114
LG
4418 )\r
4419{\r
4420 BOOLEAN IsHex;\r
4421 UINT8 Value;\r
4422 CHAR8 c;\r
4423\r
e4ac870f
LG
4424 UINT8 PreviousValue;\r
4425 CHAR8 *OrigString = Str;\r
4426 CHAR8 ErrorMsg[100];\r
4427\r
30fdf114
LG
4428 Str = TrimHex (Str, &IsHex);\r
4429 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4430 PreviousValue = Value;\r
30fdf114
LG
4431 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4432\r
4433 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4434 Value += (c - 'a' + 10);\r
4435 }\r
4436 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4437 Value += (c - 'A' + 10);\r
4438 }\r
4439 if (c >= '0' && c <= '9') {\r
4440 Value += (c - '0');\r
4441 }\r
e4ac870f
LG
4442 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4443 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
4444 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4445 }\r
30fdf114
LG
4446 }\r
4447\r
4448 return Value;\r
4449}\r
4450\r
4451UINT16\r
4452EfiVfrParser::_STOU16 (\r
e4ac870f
LG
4453 IN CHAR8 *Str,\r
4454 IN UINT32 LineNum\r
30fdf114
LG
4455 )\r
4456{\r
4457 BOOLEAN IsHex;\r
4458 UINT16 Value;\r
4459 CHAR8 c;\r
4460\r
e4ac870f
LG
4461 UINT16 PreviousValue;\r
4462 CHAR8 *OrigString = Str;\r
4463 CHAR8 ErrorMsg[100];\r
4464\r
30fdf114
LG
4465 Str = TrimHex (Str, &IsHex);\r
4466 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4467 PreviousValue = Value;\r
30fdf114
LG
4468 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4469\r
4470 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4471 Value += (c - 'a' + 10);\r
4472 }\r
4473 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4474 Value += (c - 'A' + 10);\r
4475 }\r
4476 if (c >= '0' && c <= '9') {\r
4477 Value += (c - '0');\r
4478 }\r
e4ac870f
LG
4479 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4480 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
4481 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4482 }\r
30fdf114
LG
4483 }\r
4484\r
4485 return Value;\r
4486}\r
4487\r
4488UINT32\r
4489EfiVfrParser::_STOU32 (\r
e4ac870f
LG
4490 IN CHAR8 *Str,\r
4491 IN UINT32 LineNum\r
30fdf114
LG
4492 )\r
4493{\r
4494 BOOLEAN IsHex;\r
4495 UINT32 Value;\r
4496 CHAR8 c;\r
4497\r
e4ac870f
LG
4498 UINT32 PreviousValue;\r
4499 CHAR8 *OrigString = Str;\r
4500 CHAR8 ErrorMsg[100];\r
4501\r
30fdf114
LG
4502 Str = TrimHex (Str, &IsHex);\r
4503 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4504 PreviousValue = Value;\r
30fdf114
LG
4505 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4506\r
4507 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4508 Value += (c - 'a' + 10);\r
4509 }\r
4510 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4511 Value += (c - 'A' + 10);\r
4512 }\r
4513 if (c >= '0' && c <= '9') {\r
4514 Value += (c - '0');\r
4515 }\r
e4ac870f
LG
4516 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
4517 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
4518 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4519 }\r
30fdf114
LG
4520 }\r
4521\r
4522 return Value;\r
4523}\r
4524\r
4525UINT64\r
4526EfiVfrParser::_STOU64 (\r
e4ac870f
LG
4527 IN CHAR8 *Str,\r
4528 IN UINT32 LineNum\r
30fdf114
LG
4529 )\r
4530{\r
4531 BOOLEAN IsHex;\r
4532 UINT64 Value;\r
4533 CHAR8 c;\r
e4ac870f
LG
4534 UINT64 PreviousValue;\r
4535 CHAR8 *OrigString = Str;\r
4536 CHAR8 ErrorMsg[100];\r
30fdf114
LG
4537\r
4538 Str = TrimHex (Str, &IsHex);\r
4539 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4540 PreviousValue = Value;\r
30fdf114
LG
4541 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4542\r
4543 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4544 Value += (c - 'a' + 10);\r
4545 }\r
4546 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4547 Value += (c - 'A' + 10);\r
4548 }\r
4549 if (c >= '0' && c <= '9') {\r
4550 Value += (c - '0');\r
4551 }\r
e4ac870f
LG
4552 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
4553 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
4554 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4555 }\r
30fdf114
LG
4556 }\r
4557\r
4558 return Value;\r
4559}\r
4560\r
4561EFI_HII_DATE\r
4562EfiVfrParser::_STOD (\r
4563 IN CHAR8 *Year,\r
4564 IN CHAR8 *Month,\r
e4ac870f
LG
4565 IN CHAR8 *Day,\r
4566 IN UINT32 LineNum\r
30fdf114
LG
4567 )\r
4568{\r
4569 EFI_HII_DATE Date;\r
4570\r
e4ac870f
LG
4571 Date.Year = _STOU16 (Year, LineNum);\r
4572 Date.Month = _STOU8 (Month, LineNum);\r
4573 Date.Day = _STOU8 (Day, LineNum);\r
30fdf114
LG
4574\r
4575 return Date;\r
4576}\r
4577\r
4578EFI_HII_TIME\r
4579EfiVfrParser::_STOT (\r
4580 IN CHAR8 *Hour,\r
4581 IN CHAR8 *Minute,\r
e4ac870f
LG
4582 IN CHAR8 *Second,\r
4583 IN UINT32 LineNum\r
30fdf114
LG
4584 )\r
4585{\r
4586 EFI_HII_TIME Time;\r
4587\r
e4ac870f
LG
4588 Time.Hour = _STOU8 (Hour, LineNum);\r
4589 Time.Minute = _STOU8 (Minute, LineNum);\r
4590 Time.Second = _STOU8 (Second, LineNum);\r
30fdf114
LG
4591\r
4592 return Time;\r
4593}\r
4594\r
4595EFI_STRING_ID\r
4596EfiVfrParser::_STOSID (\r
e4ac870f
LG
4597 IN CHAR8 *Str,\r
4598 IN UINT32 LineNum\r
30fdf114
LG
4599 )\r
4600{\r
e4ac870f 4601 return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4602}\r
4603\r
4604EFI_FORM_ID\r
4605EfiVfrParser::_STOFID (\r
e4ac870f
LG
4606 IN CHAR8 *Str,\r
4607 IN UINT32 LineNum\r
30fdf114
LG
4608 )\r
4609{\r
e4ac870f 4610 return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4611}\r
4612\r
4613EFI_QUESTION_ID\r
4614EfiVfrParser::_STOQID (\r
e4ac870f
LG
4615 IN CHAR8 *Str,\r
4616 IN UINT32 LineNum\r
30fdf114
LG
4617 )\r
4618{\r
e4ac870f 4619 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4620}\r
4621\r
4622VOID\r
4623EfiVfrParser::_STRCAT (\r
4624 IN OUT CHAR8 **Dest,\r
52302d4d 4625 IN CONST CHAR8 *Src\r
30fdf114
LG
4626 )\r
4627{\r
4628 CHAR8 *NewStr;\r
4629 UINT32 Len;\r
4630\r
4631 if ((Dest == NULL) || (Src == NULL)) {\r
4632 return;\r
4633 }\r
4634\r
4635 Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
4636 Len += strlen (Src);\r
4637 if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r
4638 return;\r
4639 }\r
4640 NewStr[0] = '\0';\r
4641 if (*Dest != NULL) {\r
4642 strcpy (NewStr, *Dest);\r
4643 delete *Dest;\r
4644 }\r
4645 strcat (NewStr, Src);\r
4646\r
4647 *Dest = NewStr;\r
4648}\r
4649\r
4234283c
LG
4650EFI_HII_REF\r
4651EfiVfrParser::_STOR (\r
4652 IN CHAR8 *QuestionId,\r
4653 IN CHAR8 *FormId,\r
4654 IN EFI_GUID *FormSetGuid,\r
e4ac870f
LG
4655 IN CHAR8 *DevicePath,\r
4656 IN UINT32 LineNum\r
4234283c
LG
4657 )\r
4658{\r
4659 EFI_HII_REF Ref;\r
4660 UINT32 Index;\r
4661\r
4662 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
e4ac870f
LG
4663 Ref.QuestionId = _STOQID (QuestionId, LineNum);\r
4664 Ref.FormId = _STOFID (FormId, LineNum);\r
4665 Ref.DevicePath = _STOSID (DevicePath, LineNum);\r
4234283c
LG
4666\r
4667 return Ref;\r
4668}\r
4669\r
30fdf114
LG
4670//\r
4671// framework vfr to default declare varstore for each structure\r
4672//\r
4673VOID\r
4674EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
4675 IN UINT32 LineNo\r
4676 )\r
4677{\r
4678 SVfrVarStorageNode *pNode;\r
4679 UINT32 TypeSize;\r
4680 BOOLEAN FirstNode;\r
52302d4d 4681 CONST CHAR8 VarName[] = "Setup";\r
30fdf114
LG
4682\r
4683 FirstNode = TRUE;\r
4684 pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
4685 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
4686 //\r
4687 // Create the default Buffer Var Store when no VarStore is defined.\r
4688 // its name should be "Setup"\r
4689 //\r
4690 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
4691 CIfrVarStore VSObj;\r
4692 VSObj.SetLineNo (LineNo);\r
4693 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
52302d4d 4694 VSObj.SetSize ((UINT16) TypeSize);\r
30fdf114 4695 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
52302d4d 4696 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4697 VSObj.SetGuid (&mFormsetGuid);\r
4698#ifdef VFREXP_DEBUG\r
4699 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
4700#endif\r
4701 } else {\r
4702 for (; pNode != NULL; pNode = pNode->mNext) {\r
4703 //\r
4704 // create the default varstore opcode for not declared varstore\r
4705 // the first varstore name should be "Setup"\r
4706 //\r
4707 if (!pNode->mAssignedFlag) {\r
4708 CIfrVarStore VSObj;\r
4709 VSObj.SetLineNo (LineNo);\r
4710 VSObj.SetVarStoreId (pNode->mVarStoreId);\r
52302d4d 4711 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
30fdf114 4712 if (FirstNode) {\r
52302d4d 4713 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4714 FirstNode = FALSE;\r
4715 } else {\r
4716 VSObj.SetName (pNode->mVarStoreName);\r
4717 }\r
4718 VSObj.SetGuid (&pNode->mGuid);\r
4719#ifdef VFREXP_DEBUG\r
4720 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4721#endif\r
4722 }\r
4723 }\r
4724 }\r
4725\r
4726 pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
4727 for (; pNode != NULL; pNode = pNode->mNext) {\r
4728 //\r
4729 // create the default efi varstore opcode for not exist varstore\r
4730 //\r
4731 if (!pNode->mAssignedFlag) {\r
4732 CIfrVarStoreEfi VSEObj;\r
4733 VSEObj.SetLineNo (LineNo);\r
4734 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
4735 VSEObj.SetGuid (&pNode->mGuid);\r
4736 VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
4234283c
LG
4737 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
4738 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
4739 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
30fdf114
LG
4740#ifdef VFREXP_DEBUG\r
4741 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4742#endif\r
4743 }\r
4744 }\r
4745\r
4746}\r
4747\r
4748VOID\r
4749EfiVfrParser::_DeclareDefaultLinearVarStore (\r
4750 IN UINT32 LineNo\r
4751 )\r
4752{\r
4753 UINT32 Index;\r
4754 CHAR8 **TypeNameList;\r
4755 UINT32 ListSize;\r
52302d4d
LG
4756 CONST CHAR8 DateName[] = "Date";\r
4757 CONST CHAR8 TimeName[] = "Time";\r
4758 CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
4759 CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
30fdf114
LG
4760\r
4761 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
4762\r
4763 for (Index = 0; Index < ListSize; Index++) {\r
4764 UINT32 Size;\r
4765 EFI_VARSTORE_ID VarStoreId;\r
4766 CIfrVarStore VSObj;\r
4767\r
4768 VSObj.SetLineNo (LineNo);\r
4769 mCVfrDataStorage.DeclareBufferVarStore (\r
4770 TypeNameList[Index],\r
4771 &mFormsetGuid,\r
4772 &gCVfrVarDataTypeDB,\r
4773 TypeNameList[Index],\r
4774 EFI_VARSTORE_ID_INVALID\r
4775 );\r
4afd3d04 4776 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
30fdf114
LG
4777 VSObj.SetVarStoreId (VarStoreId);\r
4778 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
52302d4d 4779 VSObj.SetSize ((UINT16) Size);\r
30fdf114
LG
4780 VSObj.SetName (TypeNameList[Index]);\r
4781 VSObj.SetGuid (&mFormsetGuid);\r
4782 }\r
4783\r
4784//\r
4785// not required to declare Date and Time VarStore,\r
4786// because code to support old format Data and Time\r
4787//\r
52302d4d 4788 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
30fdf114
LG
4789 UINT32 Size;\r
4790 EFI_VARSTORE_ID VarStoreId;\r
4791 CIfrVarStore VSObj;\r
4792\r
4793 VSObj.SetLineNo (LineNo);\r
4794 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4795 (CHAR8 *) DateName,\r
30fdf114
LG
4796 &mFormsetGuid,\r
4797 &gCVfrVarDataTypeDB,\r
52302d4d 4798 (CHAR8 *) DateType,\r
30fdf114
LG
4799 EFI_VARSTORE_ID_INVALID\r
4800 );\r
4afd3d04 4801 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4802 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4803 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
4804 VSObj.SetSize ((UINT16) Size);\r
4805 VSObj.SetName ((CHAR8 *) DateName);\r
30fdf114
LG
4806 VSObj.SetGuid (&mFormsetGuid);\r
4807 }\r
4808\r
52302d4d 4809 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
30fdf114
LG
4810 UINT32 Size;\r
4811 EFI_VARSTORE_ID VarStoreId;\r
4812 CIfrVarStore VSObj;\r
4813\r
4814 VSObj.SetLineNo (LineNo);\r
4815 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4816 (CHAR8 *) TimeName,\r
30fdf114
LG
4817 &mFormsetGuid,\r
4818 &gCVfrVarDataTypeDB,\r
52302d4d 4819 (CHAR8 *) TimeType,\r
30fdf114
LG
4820 EFI_VARSTORE_ID_INVALID\r
4821 );\r
4afd3d04 4822 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4823 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4824 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
4825 VSObj.SetSize ((UINT16) Size);\r
4826 VSObj.SetName ((CHAR8 *) TimeName);\r
30fdf114
LG
4827 VSObj.SetGuid (&mFormsetGuid);\r
4828 }\r
4829}\r
4830\r
4831VOID\r
4832EfiVfrParser::_DeclareStandardDefaultStorage (\r
4833 IN UINT32 LineNo\r
4834 )\r
4835{\r
4836 //\r
4837 // Default Store is declared.\r
4838 //\r
4839 CIfrDefaultStore DSObj;\r
4840\r
52302d4d 4841 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
30fdf114
LG
4842 DSObj.SetLineNo (LineNo);\r
4843 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
4844 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
4845\r
4846 //\r
4847 // Default MANUFACTURING Store is declared.\r
4848 //\r
4849 CIfrDefaultStore DSObjMF;\r
4850\r
52302d4d 4851 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
30fdf114
LG
4852 DSObjMF.SetLineNo (LineNo);\r
4853 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
4854 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
4855}\r
4856\r
4857VOID\r
4858EfiVfrParser::AssignQuestionKey (\r
4859 IN CIfrQuestionHeader &QHObj,\r
4860 IN ANTLRTokenPtr KeyTok\r
4861 )\r
4862{\r
4863 UINT16 KeyValue;\r
4864\r
4865 if (KeyTok == NULL) {\r
4866 return;\r
4867 }\r
4868\r
e4ac870f 4869 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
30fdf114
LG
4870\r
4871 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
4872 /*\r
4873 * if the question is not CALLBACK ignore the key.\r
4874 */\r
4875 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
4876 QHObj.SetQuestionId (KeyValue);\r
4877 }\r
4878}\r
4879\r
4880VOID\r
4881EfiVfrParser::ConvertIdExpr (\r
4882 IN UINT32 &ExpOpCount,\r
4883 IN UINT32 LineNo,\r
4884 IN EFI_QUESTION_ID QId,\r
4885 IN CHAR8 *VarIdStr,\r
4886 IN UINT32 BitMask\r
4887 )\r
4888{\r
4889 CIfrQuestionRef1 QR1Obj(LineNo);\r
4890 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
4891 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
4892\r
4893 if (BitMask != 0) {\r
4894 CIfrUint32 U32Obj(LineNo);\r
4895 U32Obj.SetValue (BitMask);\r
4896\r
4897 CIfrBitWiseAnd BWAObj(LineNo);\r
4898\r
4899 CIfrUint8 U8Obj(LineNo);\r
4900 switch (BitMask) {\r
4901 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r
4902 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
4903 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r
4904 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r
4905 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
4906 }\r
4907\r
4908 CIfrShiftRight SRObj(LineNo);\r
4909 }\r
4910\r
4911 ExpOpCount += 4;\r
4912}\r
4913\r
4914VOID\r
4915EfiVfrParser::IdEqValDoSpecial (\r
4916 IN UINT32 &ExpOpCount,\r
4917 IN UINT32 LineNo,\r
4918 IN EFI_QUESTION_ID QId,\r
4919 IN CHAR8 *VarIdStr,\r
4920 IN UINT32 BitMask,\r
4921 IN UINT16 ConstVal,\r
4922 IN EFI_COMPARE_TYPE CompareType\r
4923 )\r
4924{\r
4925 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
4926\r
4927 if (ConstVal > 0xFF) {\r
4928 CIfrUint16 U16Obj(LineNo);\r
4929 U16Obj.SetValue (ConstVal);\r
4930 } else {\r
4931 CIfrUint8 U8Obj(LineNo);\r
4932 U8Obj.SetValue ((UINT8)ConstVal);\r
4933 }\r
4934\r
4935 switch (CompareType) {\r
4936 case EQUAL :\r
4937 {\r
4938 CIfrEqual EObj(LineNo);\r
4939 break;\r
4940 }\r
4941 case LESS_EQUAL :\r
4942 {\r
4943 CIfrLessEqual LEObj(LineNo);\r
4944 break;\r
4945 }\r
4946 case LESS_THAN :\r
4947 {\r
4948 CIfrLessThan LTObj(LineNo);\r
4949 break;\r
4950 }\r
4951 case GREATER_EQUAL :\r
4952 {\r
4953 CIfrGreaterEqual GEObj(LineNo);\r
4954 break;\r
4955 }\r
4956 case GREATER_THAN :\r
4957 {\r
4958 CIfrGreaterThan GTObj(LineNo);\r
4959 break;\r
4960 }\r
4961 }\r
4962\r
4963 ExpOpCount += 2;\r
4964}\r
4965\r
4966VOID\r
4967EfiVfrParser::IdEqIdDoSpecial (\r
4968 IN UINT32 &ExpOpCount,\r
4969 IN UINT32 LineNo,\r
4970 IN EFI_QUESTION_ID QId1,\r
4971 IN CHAR8 *VarId1Str,\r
4972 IN UINT32 BitMask1,\r
4973 IN EFI_QUESTION_ID QId2,\r
4974 IN CHAR8 *VarId2Str,\r
4975 IN UINT32 BitMask2,\r
4976 IN EFI_COMPARE_TYPE CompareType\r
4977 )\r
4978{\r
4979 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
4980 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
4981\r
4982 switch (CompareType) {\r
4983 case EQUAL :\r
4984 {\r
4985 CIfrEqual EObj(LineNo);\r
4986 break;\r
4987 }\r
4988 case LESS_EQUAL :\r
4989 {\r
4990 CIfrLessEqual LEObj(LineNo);\r
4991 break;\r
4992 }\r
4993 case LESS_THAN :\r
4994 {\r
4995 CIfrLessThan LTObj(LineNo);\r
4996 break;\r
4997 }\r
4998 case GREATER_EQUAL :\r
4999 {\r
5000 CIfrGreaterEqual GEObj(LineNo);\r
5001 break;\r
5002 }\r
5003 case GREATER_THAN :\r
5004 {\r
5005 CIfrGreaterThan GTObj(LineNo);\r
5006 break;\r
5007 }\r
5008 }\r
5009\r
5010 ExpOpCount++;\r
5011}\r
5012\r
5013VOID\r
5014EfiVfrParser::IdEqListDoSpecial (\r
5015 IN UINT32 &ExpOpCount,\r
5016 IN UINT32 LineNo,\r
5017 IN EFI_QUESTION_ID QId,\r
5018 IN CHAR8 *VarIdStr,\r
5019 IN UINT32 BitMask,\r
5020 IN UINT16 ListLen,\r
5021 IN UINT16 *ValueList\r
5022 )\r
5023{\r
5024 UINT16 Index;\r
5025\r
5026 if (ListLen == 0) {\r
5027 return;\r
5028 }\r
5029\r
5030 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
5031 for (Index = 1; Index < ListLen; Index++) {\r
5032 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
5033 CIfrOr OObj (LineNo);\r
5034 ExpOpCount++;\r
5035 }\r
5036}\r
5037\r
4234283c
LG
5038VOID \r
5039EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
5040{\r
5041 mOverrideClassGuid = OverrideClassGuid;\r
5042}\r
5043\r
30fdf114
LG
5044//\r
5045// For framework vfr compatibility\r
5046//\r
5047VOID\r
5048EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
5049{\r
5050 mCompatibleMode = Mode;\r
5051 mCVfrQuestionDB.SetCompatibleMode (Mode);\r
5052}\r
4afd3d04
LG
5053\r
5054VOID\r
5055EfiVfrParser::CheckDuplicateDefaultValue (\r
5056 IN EFI_DEFAULT_ID DefaultId,\r
5057 IN ANTLRTokenPtr Tok\r
5058 )\r
5059{\r
5060 UINT16 Index;\r
5061\r
5062 for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
5063 if (mUsedDefaultArray[Index] == DefaultId) {\r
5064 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
5065 }\r
5066 }\r
5067\r
5068 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
5069 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
5070 }\r
5071\r
5072 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
5073}\r
30fdf114 5074>>\r