]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
MdeModulePkg: update comments for question.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
CommitLineData
97fa0ee9
YL
1/*++ @file\r
2Vfr Syntax\r
3\r
ddaf640f 4Copyright (c) 2004 - 2015, 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
ddaf640f
ED
1396vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
1397 << \r
4234283c 1398 EFI_GUID Guid;\r
ddaf640f
ED
1399 UINT8 *Type8 = (UINT8 *) &Value;\r
1400 UINT16 *Type16 = (UINT16 *) &Value;\r
1401 UINT32 *Type32 = (UINT32 *) &Value;\r
1402 UINT64 *Type64 = (UINT64 *) &Value;\r
1403 UINT16 Index = 0;\r
1404 ListType = FALSE;\r
4234283c 1405 >>\r
30fdf114
LG
1406 N1:Number <<\r
1407 switch ($Type) {\r
1408 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
e4ac870f 1409 $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
30fdf114
LG
1410 break;\r
1411 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
e4ac870f 1412 $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
30fdf114
LG
1413 break;\r
1414 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
e4ac870f 1415 $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
30fdf114
LG
1416 break;\r
1417 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
e4ac870f 1418 $Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
30fdf114
LG
1419 break;\r
1420 case EFI_IFR_TYPE_BOOLEAN :\r
e4ac870f 1421 $Value.b = _STOU8(N1->getText(), N1->getLine());\r
30fdf114
LG
1422 break;\r
1423 case EFI_IFR_TYPE_STRING :\r
e4ac870f 1424 $Value.string = _STOU16(N1->getText(), N1->getLine());\r
30fdf114
LG
1425 break;\r
1426 case EFI_IFR_TYPE_TIME :\r
1427 case EFI_IFR_TYPE_DATE :\r
4234283c 1428 case EFI_IFR_TYPE_REF :\r
30fdf114
LG
1429 default :\r
1430 break;\r
1431 }\r
1432 >>\r
1433 | B1:True << $Value.b = TRUE; >>\r
1434 | B2:False << $Value.b = FALSE; >>\r
e4ac870f
LG
1435 | O1:One << $Value.u8 = _STOU8(O1->getText(), O1->getLine()); >>\r
1436 | O2:Ones << $Value.u64 = _STOU64(O2->getText(), O2->getLine()); >>\r
1437 | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >>\r
1438 | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >>\r
1439 | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >>\r
4234283c 1440 | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
e4ac870f
LG
1441 << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
1442 | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
ddaf640f
ED
1443 | "\{" << ListType = TRUE; >>\r
1444 L1:Number << \r
1445 switch (Type) {\r
1446 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1447 Type8[Index] = _STOU8(L1->getText(), L1->getLine());\r
1448 break;\r
1449 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1450 Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
1451 break;\r
1452 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1453 Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
1454 break;\r
1455 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1456 Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
1457 break;\r
1458 default:\r
1459 break;\r
1460 }\r
1461 Index++;\r
1462 >>\r
1463 (\r
1464 "," \r
1465 L2:Number << \r
1466 switch (Type) {\r
1467 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1468 Type8[Index] = _STOU8(L2->getText(), L2->getLine());\r
1469 break;\r
1470 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1471 Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
1472 break;\r
1473 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1474 Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
1475 break;\r
1476 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1477 Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
1478 break;\r
1479 default:\r
1480 break;\r
1481 }\r
1482 Index++;\r
1483 >>\r
1484 )*\r
1485 "\}" \r
30fdf114
LG
1486 ;\r
1487\r
1488//*****************************************************************************\r
1489//\r
1490// the syntax of form definition\r
1491//\r
1492vfrFormDefinition :\r
1493 << CIfrForm FObj; >>\r
1494 F:Form << FObj.SetLineNo(F->getLine()); >>\r
e4ac870f
LG
1495 FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
1496 Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >>\r
30fdf114
LG
1497 (\r
1498 vfrStatementImage |\r
1499 vfrStatementLocked |\r
1500 vfrStatementRules |\r
1501 vfrStatementDefault |\r
1502 vfrStatementStat |\r
1503 vfrStatementQuestions |\r
1504 vfrStatementConditional |\r
1505 vfrStatementLabel |\r
1506 vfrStatementBanner |\r
1507 // Just for framework vfr compatibility\r
da92f276 1508 vfrStatementInvalid |\r
4234283c 1509 vfrStatementExtension |\r
e2a5feb9
ED
1510 vfrStatementModal |\r
1511 vfrStatementRefreshEvent ";"\r
30fdf114
LG
1512 )*\r
1513 E:EndForm <<\r
1514 if (mCompatibleMode) {\r
1515 //\r
1516 // Add Label for Framework Vfr\r
1517 //\r
1518 CIfrLabel LObj1;\r
1519 LObj1.SetLineNo(E->getLine());\r
1520 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
1521 CIfrLabel LObj2;\r
1522 LObj2.SetLineNo(E->getLine());\r
1523 LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0\r
1524 CIfrLabel LObj3;\r
1525 LObj3.SetLineNo(E->getLine());\r
1526 LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
30fdf114 1527 }\r
b36d134f 1528\r
4afd3d04 1529 {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
30fdf114
LG
1530 >>\r
1531 ";"\r
1532 ;\r
1533\r
52302d4d
LG
1534vfrFormMapDefinition :\r
1535 << \r
1536 CIfrFormMap *FMapObj = NULL;\r
1537 UINT32 FormMapMethodNumber = 0;\r
1538 EFI_GUID Guid;\r
1539 >>\r
1540 F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
e4ac870f 1541 FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
52302d4d
LG
1542 (\r
1543 MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
e4ac870f 1544 MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >>\r
52302d4d
LG
1545 )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
1546 (\r
1547 vfrStatementImage |\r
1548 vfrStatementLocked |\r
1549 vfrStatementRules |\r
1550 vfrStatementDefault |\r
1551 vfrStatementStat |\r
1552 vfrStatementQuestions |\r
1553 vfrStatementConditional |\r
1554 vfrStatementLabel |\r
da92f276 1555 vfrStatementBanner |\r
4234283c 1556 vfrStatementExtension |\r
e2a5feb9
ED
1557 vfrStatementModal |\r
1558 vfrStatementRefreshEvent ";"\r
52302d4d
LG
1559 )*\r
1560 E:EndForm << CRT_END_OP (E); >>\r
1561 ";"\r
1562 ;\r
1563\r
30fdf114
LG
1564vfrStatementRules :\r
1565 << CIfrRule RObj; >>\r
1566 R:Rule << RObj.SetLineNo(R->getLine()); >>\r
1567 S1:StringIdentifier "," <<\r
1568 mCVfrRulesDB.RegisterRule (S1->getText());\r
1569 RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));\r
1570 >>\r
1571 vfrStatementExpression[0]\r
1572 E:EndRule << CRT_END_OP (E); >>\r
1573 ";"\r
1574 ;\r
1575\r
1576vfrStatementDefault :\r
1577 <<\r
1578 BOOLEAN IsExp = FALSE;\r
ddaf640f
ED
1579 UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
1580 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
4afd3d04
LG
1581 CIfrDefault *DObj = NULL;\r
1582 CIfrDefault2 *DObj2 = NULL;\r
30fdf114
LG
1583 EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
1584 CHAR8 *VarStoreName = NULL;\r
1585 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04
LG
1586 UINT32 Size = 0;\r
1587 EFI_GUID *VarGuid = NULL;\r
ddaf640f
ED
1588 BOOLEAN ArrayType = FALSE;\r
1589 UINT8 *Type8 = (UINT8 *) ValueList;\r
1590 UINT16 *Type16 = (UINT16 *) ValueList;\r
1591 UINT32 *Type32 = (UINT32 *) ValueList;\r
1592 UINT64 *Type64 = (UINT64 *) ValueList;\r
1593\r
30fdf114 1594 >>\r
4afd3d04 1595 D:Default \r
30fdf114
LG
1596 (\r
1597 (\r
ddaf640f 1598 "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," \r
4afd3d04 1599 << \r
a709adfa
LG
1600 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
1601 //check default value is valid for Numeric Opcode\r
ddaf640f 1602 if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
a709adfa 1603 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
fd171542 1604 }\r
1605 }\r
4afd3d04
LG
1606 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1607 _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
1608 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
ddaf640f
ED
1609 } else if (ArrayType) {\r
1610 switch (_GET_CURRQEST_DATATYPE()) {\r
1611 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1612 while (Type8[Size] != 0) {\r
1613 Size++;\r
1614 }\r
1615 break;\r
1616 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1617 while (Type16[Size] != 0) {\r
1618 Size++;\r
1619 }\r
1620 Size *= sizeof (UINT16);\r
1621 break;\r
1622\r
1623 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1624 while (Type32[Size] != 0) {\r
1625 Size++;\r
1626 }\r
1627 Size *= sizeof (UINT32);\r
1628 break;\r
1629\r
1630 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1631 while (Type64[Size] != 0) {\r
1632 Size++;\r
1633 }\r
1634 Size *= sizeof (UINT64);\r
1635 break;\r
1636\r
1637 default:\r
1638 break;\r
1639 }\r
4afd3d04
LG
1640 } else {\r
1641 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
1642 }\r
1643 Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
1644 DObj = new CIfrDefault ((UINT8)Size);\r
1645 DObj->SetLineNo(D->getLine());\r
ddaf640f
ED
1646 if (ArrayType) {\r
1647 DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
1648 } else {\r
1649 DObj->SetType (_GET_CURRQEST_DATATYPE());\r
1650 }\r
1651 DObj->SetValue(*Val);\r
fd171542 1652 >>\r
4afd3d04
LG
1653 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
1654 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
30fdf114
LG
1655 )\r
1656 {\r
4afd3d04
LG
1657 DefaultStore "=" SN:StringIdentifier "," << \r
1658 _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
1659 if (DObj != NULL) {\r
1660 DObj->SetDefaultId (DefaultId); \r
1661 } \r
1662\r
1663 if (DObj2 != NULL) {\r
1664 DObj2->SetDefaultId (DefaultId); \r
1665 }\r
1666 >>\r
30fdf114
LG
1667 }\r
1668 <<\r
4afd3d04
LG
1669 CheckDuplicateDefaultValue (DefaultId, D);\r
1670 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
30fdf114 1671 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
4afd3d04
LG
1672 VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1673 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
30fdf114
LG
1674 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
1675 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1676 DefaultId,\r
1677 _GET_CURRQEST_VARTINFO(),\r
1678 VarStoreName,\r
4afd3d04 1679 VarGuid,\r
30fdf114 1680 _GET_CURRQEST_DATATYPE (),\r
ddaf640f
ED
1681 *Val),\r
1682 D->getLine()\r
1683 );\r
4afd3d04 1684 }\r
30fdf114 1685 }\r
4afd3d04
LG
1686 if (DObj != NULL) {delete DObj;} \r
1687 if (DObj2 != NULL) {delete DObj2;} \r
30fdf114
LG
1688 >>\r
1689 )\r
1690 ;\r
1691\r
1692vfrStatementStat :\r
1693 vfrStatementSubTitle |\r
1694 vfrStatementStaticText |\r
1695 vfrStatementCrossReference\r
1696 ;\r
1697\r
1698vfrStatementQuestions :\r
1699 vfrStatementBooleanType |\r
1700 vfrStatementDate |\r
1701 vfrStatementNumericType |\r
1702 vfrStatementStringType |\r
1703 vfrStatementOrderedList |\r
1704 vfrStatementTime\r
1705 ;\r
1706\r
1707vfrStatementConditional :\r
1708 vfrStatementDisableIfStat |\r
1709 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif\r
1710 vfrStatementGrayOutIfStat |\r
1711 vfrStatementInconsistentIfStat //to be compatible for framework\r
1712 ;\r
1713\r
1714vfrStatementConditionalNew :\r
1715 vfrStatementDisableIfStat |\r
1716 vfrStatementSuppressIfStatNew |\r
1717 vfrStatementGrayOutIfStatNew |\r
1718 vfrStatementInconsistentIfStat //to be compatible for framework\r
1719 ;\r
1720\r
1721vfrStatementSuppressIfStat :\r
1722 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
1723 | vfrStatementSuppressIfStatNew\r
1724 ;\r
1725\r
1726vfrStatementGrayOutIfStat :\r
1727 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
1728 | vfrStatementGrayOutIfStatNew\r
1729 ;\r
1730\r
1731vfrStatementInvalid :\r
1732 (\r
1733 vfrStatementInvalidHidden |\r
1734 vfrStatementInvalidInventory |\r
1735 vfrStatementInvalidSaveRestoreDefaults\r
1736 )\r
1737 << _CRT_OP (TRUE); >>\r
1738 ;\r
1739\r
1740flagsField :\r
05154781
ED
1741 Number \r
1742 | InteractiveFlag \r
1743 | ManufacturingFlag \r
1744 | DefaultFlag \r
1745 | ResetRequiredFlag \r
1746 | N:NVAccessFlag << \r
1747 if (!mCompatibleMode) {\r
1748 gCVfrErrorHandle.HandleWarning (\r
1749 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1750 N->getLine(),\r
1751 N->getText()\r
1752 );\r
1753 }\r
1754 >>\r
1755 | L:LateCheckFlag << \r
1756 if (!mCompatibleMode) {\r
1757 gCVfrErrorHandle.HandleWarning (\r
1758 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1759 L->getLine(),\r
1760 L->getText()\r
1761 );\r
1762 }\r
1763 >> \r
30fdf114
LG
1764 ;\r
1765\r
1766vfrStatementValue :\r
1767 << CIfrValue VObj; >>\r
1768 V:Value << VObj.SetLineNo(V->getLine()); >>\r
fd171542 1769 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
30fdf114
LG
1770 ;\r
1771\r
52302d4d
LG
1772vfrStatementRead :\r
1773 << CIfrRead RObj; >>\r
1774 R:Read << RObj.SetLineNo(R->getLine()); >>\r
1775 vfrStatementExpression[0] ";" \r
1776 ;\r
1777\r
1778vfrStatementWrite :\r
1779 << CIfrWrite WObj; >>\r
1780 W:Write << WObj.SetLineNo(W->getLine()); >>\r
1781 vfrStatementExpression[0] ";" \r
1782 ;\r
1783\r
30fdf114
LG
1784vfrStatementSubTitle :\r
1785 << CIfrSubtitle SObj; >>\r
1786 L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r
e4ac870f 1787 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
1788 {\r
1789 "," FLAGS "=" vfrSubtitleFlags[SObj]\r
1790 }\r
e8a47801
LG
1791 (\r
1792 {vfrStatementStatTagList "," }\r
1793 E:";" << CRT_END_OP (E); >>\r
1794 |\r
1795 { "," vfrStatementStatTagList}\r
1796 { "," (vfrStatementStat | vfrStatementQuestions)*}\r
15be099a 1797 D: EndSubtitle ";" << CRT_END_OP (D); >>\r
e8a47801 1798 )\r
30fdf114
LG
1799 ;\r
1800\r
1801vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
1802 << UINT8 LFlags = 0; >>\r
1803 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r
1804 << _PCATCH(SObj.SetFlags (LFlags)); >>\r
1805 ;\r
1806\r
1807subtitleFlagsField [UINT8 & Flags] :\r
e4ac870f 1808 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
1809 | "HORIZONTAL" << $Flags |= 0x01; >>\r
1810 ;\r
1811\r
1812vfrStatementStaticText :\r
1813 <<\r
1814 UINT8 Flags = 0;\r
1815 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1816 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;\r
1817 >>\r
1818 T:Text\r
1819 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
1820 Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
1821 {\r
e4ac870f 1822 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>\r
30fdf114
LG
1823 }\r
1824 {\r
1825 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
1826 "," Key "=" KN:Number\r
1827 }\r
1828 <<\r
1829 if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
1d218f83
ED
1830 if (TxtTwo != EFI_STRING_ID_INVALID) {\r
1831 gCVfrErrorHandle.HandleWarning (\r
1832 VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
1833 S3->getLine(),\r
1834 S3->getText()\r
1835 );\r
1836 }\r
30fdf114
LG
1837 CIfrAction AObj;\r
1838 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
1839 AObj.SetLineNo (F->getLine());\r
1840 AObj.SetQuestionId (QId);\r
e4ac870f
LG
1841 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
1842 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
30fdf114
LG
1843 _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
1844 AssignQuestionKey (AObj, KN);\r
1845 CRT_END_OP (KN);\r
1846 } else {\r
1847 CIfrText TObj;\r
1848 TObj.SetLineNo (T->getLine());\r
e4ac870f
LG
1849 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
1850 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
1851 TObj.SetTextTwo (TxtTwo);\r
1852 }\r
1853 >>\r
1854 { "," vfrStatementStatTagList }\r
1855 ";"\r
1856 ;\r
1857\r
1858staticTextFlagsField[UINT8 & HFlags] :\r
e4ac870f 1859 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1860 | questionheaderFlagsField[HFlags]\r
1861 ;\r
1862\r
1863vfrStatementCrossReference :\r
1864 vfrStatementGoto |\r
1865 vfrStatementResetButton\r
1866 ;\r
1867\r
1868vfrStatementGoto :\r
1869 <<\r
4234283c 1870 UINT8 RefType = 5;\r
52302d4d
LG
1871 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
1872 EFI_GUID FSId = {0,};\r
30fdf114
LG
1873 EFI_FORM_ID FId;\r
1874 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1875 UINT32 BitMask;\r
1876 CIfrQuestionHeader *QHObj = NULL;\r
0d2711a6 1877 CIfrOpHeader *OHObj = NULL;\r
30fdf114
LG
1878 CIfrRef *R1Obj = NULL;\r
1879 CIfrRef2 *R2Obj = NULL;\r
1880 CIfrRef3 *R3Obj = NULL;\r
1881 CIfrRef4 *R4Obj = NULL;\r
4234283c 1882 CIfrRef5 *R5Obj = NULL;\r
30fdf114
LG
1883 >>\r
1884 G:Goto\r
4234283c 1885 {\r
30fdf114
LG
1886 (\r
1887 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
1888 FormSetGuid "=" guidDefinition[FSId] ","\r
1889 FormId "=" F1:Number ","\r
1890 Question "=" QN1:Number ","\r
1891 <<\r
1892 RefType = 4;\r
e4ac870f
LG
1893 DevPath = _STOSID(P->getText(), P->getLine());\r
1894 FId = _STOFID(F1->getText(), F1->getLine());\r
1895 QId = _STOQID(QN1->getText(), QN1->getLine());\r
30fdf114
LG
1896 >>\r
1897 )\r
1898 |\r
1899 (\r
1900 FormSetGuid "=" guidDefinition[FSId] ","\r
1901 FormId "=" F2:Number ","\r
1902 Question "=" QN2:Number ","\r
1903 <<\r
1904 RefType = 3;\r
e4ac870f
LG
1905 FId = _STOFID(F2->getText(), F2->getLine());\r
1906 QId = _STOQID(QN2->getText(), QN2->getLine());\r
30fdf114
LG
1907 >>\r
1908 )\r
1909 |\r
1910 (\r
e4ac870f 1911 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
30fdf114
LG
1912 Question "="\r
1913 (\r
0d2711a6
LG
1914 QN3:StringIdentifier "," << \r
1915 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
1916 if (QId == EFI_QUESTION_ID_INVALID) {\r
1917 _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
1918 }\r
1919 >>\r
e4ac870f 1920 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>\r
30fdf114
LG
1921 )\r
1922 )\r
1923 |\r
1924 (\r
1925 F4:Number "," <<\r
1926 RefType = 1;\r
e4ac870f 1927 FId = _STOFID(F4->getText(), F4->getLine());\r
30fdf114
LG
1928 >>\r
1929 )\r
4234283c 1930 }\r
30fdf114
LG
1931 <<\r
1932 switch (RefType) {\r
4234283c
LG
1933 case 5:\r
1934 {\r
1935 R5Obj = new CIfrRef5;\r
1936 QHObj = R5Obj;\r
0d2711a6 1937 OHObj = R5Obj;\r
4234283c
LG
1938 R5Obj->SetLineNo(G->getLine());\r
1939 break;\r
1940 }\r
30fdf114
LG
1941 case 4:\r
1942 {\r
1943 R4Obj = new CIfrRef4;\r
1944 QHObj = R4Obj;\r
0d2711a6 1945 OHObj = R4Obj;\r
30fdf114
LG
1946 R4Obj->SetLineNo(G->getLine());\r
1947 R4Obj->SetDevicePath (DevPath);\r
1948 R4Obj->SetFormSetId (FSId);\r
1949 R4Obj->SetFormId (FId);\r
1950 R4Obj->SetQuestionId (QId);\r
1951 break;\r
1952 }\r
1953 case 3:\r
1954 {\r
1955 R3Obj = new CIfrRef3;\r
1956 QHObj = R3Obj;\r
0d2711a6 1957 OHObj = R3Obj;\r
30fdf114
LG
1958 R3Obj->SetLineNo(G->getLine());\r
1959 R3Obj->SetFormSetId (FSId);\r
1960 R3Obj->SetFormId (FId);\r
1961 R3Obj->SetQuestionId (QId);\r
1962 break;\r
1963 }\r
1964 case 2:\r
1965 {\r
1966 R2Obj = new CIfrRef2;\r
1967 QHObj = R2Obj;\r
0d2711a6 1968 OHObj = R2Obj;\r
30fdf114
LG
1969 R2Obj->SetLineNo(G->getLine());\r
1970 R2Obj->SetFormId (FId);\r
0d2711a6 1971 R2Obj->SetQuestionId (QId);\r
30fdf114
LG
1972 break;\r
1973 }\r
1974 case 1:\r
1975 {\r
1976 R1Obj = new CIfrRef;\r
1977 QHObj = R1Obj;\r
0d2711a6 1978 OHObj = R1Obj;\r
30fdf114
LG
1979 R1Obj->SetLineNo(G->getLine());\r
1980 R1Obj->SetFormId (FId);\r
1981 break;\r
1982 }\r
1983 default: break;\r
1984 }\r
1985 >>\r
4afd3d04
LG
1986 vfrQuestionHeader[*QHObj, QUESTION_REF] <<\r
1987 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1988 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
1989 }\r
1990 >>\r
30fdf114
LG
1991 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
1992 {\r
1993 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
1994 }\r
0d2711a6
LG
1995 {\r
1996 E:"," \r
1997 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
1998 }\r
4234283c 1999 ";" << 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
2000 ;\r
2001\r
2002vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
2003 << UINT8 HFlags = 0; >>\r
2004 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
2005 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
2006 ;\r
2007\r
2008gotoFlagsField[UINT8 & HFlags] :\r
e4ac870f 2009 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2010 | questionheaderFlagsField[HFlags]\r
2011 ;\r
2012\r
2013getStringId :\r
2014 "STRING_TOKEN" "\("\r
2015 IdVal:Number\r
2016 "\)"\r
2017 ;\r
2018\r
2019vfrStatementResetButton :\r
2020 <<\r
2021 CIfrResetButton RBObj;\r
2022 UINT16 DefaultId;\r
2023 >>\r
2024 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
2025 DefaultStore\r
2026 "=" N:StringIdentifier "," <<\r
2027 _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
2028 RBObj.SetDefaultId (DefaultId);\r
2029 >>\r
2030 vfrStatementHeader[&RBObj] ","\r
2031 { vfrStatementStatTagList "," }\r
2032 E:EndResetButton << CRT_END_OP (E); >>\r
2033 ";"\r
2034 ;\r
2035\r
2036vfrStatementBooleanType :\r
2037 vfrStatementCheckBox |\r
2038 vfrStatementAction\r
2039 ;\r
2040\r
2041//*****************************************************\r
2042// Syntax of checkbox\r
2043//\r
2044// Example:\r
2045// checkbox\r
2046// varid = MySTestData.mField1,\r
2047// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
2048// help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
2049// flags = CHECKBOX_DEFAULT | CALLBACK,\r
2050// default value = TRUE, defaultstore = MyDefaultStore,\r
2051// endcheckbox;\r
2052//\r
2053vfrStatementCheckBox :\r
2054 <<\r
2055 CIfrCheckBox CBObj;\r
2056 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
2057 CHAR8 *VarStoreName = NULL;\r
2058 UINT32 DataTypeSize;\r
4afd3d04 2059 EFI_GUID *VarStoreGuid = NULL;\r
30fdf114
LG
2060 >>\r
2061 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
2062 vfrQuestionHeader[CBObj] "," << //check data type\r
4afd3d04
LG
2063 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2064 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
2065 }\r
2066 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2067 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
2068 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2069 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
2070 } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
2071 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
2072 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
2073 }\r
30fdf114
LG
2074 }\r
2075 >>\r
2076 {\r
2077 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
2078 <<\r
4afd3d04
LG
2079 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2080 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
2081 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2082 Val.b = TRUE;\r
2083 if (CBObj.GetFlags () & 0x01) {\r
2084 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
2085 _PCATCH(\r
2086 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2087 EFI_HII_DEFAULT_CLASS_STANDARD,\r
2088 _GET_CURRQEST_VARTINFO(),\r
2089 VarStoreName,\r
2090 VarStoreGuid,\r
2091 _GET_CURRQEST_DATATYPE (),\r
2092 Val\r
2093 ),\r
2094 VFR_RETURN_SUCCESS,\r
2095 L,\r
2096 "No standard default storage found"\r
2097 );\r
2098 }\r
2099 if (CBObj.GetFlags () & 0x02) {\r
2100 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
2101 _PCATCH(\r
2102 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2103 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
2104 _GET_CURRQEST_VARTINFO(),\r
2105 VarStoreName,\r
2106 VarStoreGuid,\r
2107 _GET_CURRQEST_DATATYPE (),\r
2108 Val\r
2109 ),\r
2110 VFR_RETURN_SUCCESS,\r
2111 L,\r
2112 "No manufacturing default storage found"\r
2113 );\r
2114 }\r
30fdf114
LG
2115 }\r
2116 >>\r
2117 }\r
2118 {\r
2119 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
2120 }\r
2121 vfrStatementQuestionOptionList\r
2122 E:EndCheckBox << CRT_END_OP (E); >>\r
2123 ";"\r
2124 ;\r
2125\r
2126vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
2127 <<\r
2128 UINT8 LFlags = 0;\r
2129 UINT8 HFlags = 0;\r
2130 >>\r
2131 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
2132 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2133 ;\r
2134\r
2135checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
2136 N:Number <<\r
2137 if (mCompatibleMode) {\r
2138 //\r
2139 // set question flag\r
2140 //\r
e4ac870f 2141 $LFlags |= _STOU8(N->getText(), N->getLine());\r
30fdf114 2142 } else {\r
e4ac870f 2143 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
30fdf114
LG
2144 }\r
2145 >>\r
2146 | D:"DEFAULT" <<\r
2147 if (mCompatibleMode) {\r
2148 //\r
2149 // set question Default flag\r
2150 //\r
2151 $LFlags |= 0x01;\r
2152 } else {\r
2153 _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
2154 }\r
2155 >>\r
2156 | M:"MANUFACTURING" <<\r
2157 if (mCompatibleMode) {\r
2158 //\r
2159 // set question MFG flag\r
2160 //\r
2161 $LFlags |= 0x02;\r
2162 } else {\r
2163 _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
2164 }\r
2165 >>\r
2166 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
2167 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r
2168 | questionheaderFlagsField[HFlags]\r
2169 ;\r
2170\r
2171//*****************************************************\r
2172// Syntax of action\r
2173//\r
2174// Example:\r
2175// action\r
2176// prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r
2177// help = STRING_TOKEN(STR_ACTION_HELP),\r
2178// flags = CALLBACK,\r
2179// config = STRING_TOKEN(STR_ACTION_CONFIG),\r
2180// endaction;\r
2181//\r
2182vfrStatementAction :\r
2183 << CIfrAction AObj; >>\r
2184 L:Action << AObj.SetLineNo(L->getLine()); >>\r
4234283c 2185 vfrQuestionHeader[AObj] ","\r
30fdf114 2186 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
e4ac870f 2187 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2188 vfrStatementQuestionTagList\r
2189 E:EndAction << CRT_END_OP (E); >>\r
2190 ";"\r
2191 ;\r
2192\r
2193vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
2194 << UINT8 HFlags = 0; >>\r
2195 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
2196 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
2197 ;\r
2198\r
2199actionFlagsField[UINT8 & HFlags] :\r
e4ac870f 2200 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2201 | questionheaderFlagsField[HFlags]\r
2202 ;\r
2203\r
2204vfrStatementDate :\r
2205 <<\r
2206 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2207 CHAR8 *VarIdStr[3] = {NULL, };\r
2208 CIfrDate DObj;\r
2209 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2210 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
30fdf114
LG
2211 >>\r
2212 L:Date << DObj.SetLineNo(L->getLine()); >>\r
2213 (\r
2214 (\r
4afd3d04
LG
2215 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<\r
2216 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2217 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
2218 }\r
2219 >>\r
30fdf114
LG
2220 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
2221 vfrStatementQuestionOptionList\r
2222 )\r
2223 |\r
2224 (\r
2225 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
2226 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
2227 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
2228 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
2229 minMaxDateStepDefault[Val.date, 0]\r
2230\r
2231 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
2232 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
2233 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2234 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2235 minMaxDateStepDefault[Val.date, 1]\r
2236\r
2237 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
2238 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
2239 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
2240 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
2241 minMaxDateStepDefault[Val.date, 2]\r
2bcc713e 2242 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
30fdf114
LG
2243 <<\r
2244 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2245 DObj.SetQuestionId (QId);\r
2246 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
e4ac870f
LG
2247 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
2248 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\r
30fdf114
LG
2249 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2250 >>\r
4afd3d04 2251 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2252 )\r
2253 ( vfrStatementInconsistentIf )*\r
2254 )\r
2255 E:EndDate << CRT_END_OP (E); >>\r
2256 ";"\r
2257 ;\r
2258\r
2259minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
fd171542 2260 Minimum "=" MinN:Number ","\r
2261 Maximum "=" MaxN:Number ","\r
30fdf114
LG
2262 { "step" "=" Number "," }\r
2263 {\r
2264 "default" "=" N:Number "," <<\r
2265 switch (KeyValue) {\r
fd171542 2266 case 0: \r
e4ac870f
LG
2267 D.Year = _STOU16(N->getText(), N->getLine());\r
2268 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
fd171542 2269 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
2270 }\r
2271 break;\r
2272 case 1: \r
e4ac870f 2273 D.Month = _STOU8(N->getText(), N->getLine()); \r
fd171542 2274 if (D.Month < 1 || D.Month > 12) {\r
2275 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
2276 }\r
2277 break;\r
2278 case 2: \r
e4ac870f 2279 D.Day = _STOU8(N->getText(), N->getLine()); \r
fd171542 2280 if (D.Day < 1 || D.Day > 31) {\r
2281 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
2282 }\r
2283 break;\r
30fdf114
LG
2284 }\r
2285 >>\r
2286 }\r
2287 ;\r
2288\r
2289vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
2290 << UINT8 LFlags = 0; >>\r
2291 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
2292 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2293 ;\r
2294\r
2295dateFlagsField [UINT8 & Flags] :\r
e4ac870f 2296 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2297 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r
2298 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r
2299 | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r
2300 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2301 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2302 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2303 ;\r
2304\r
2305vfrStatementNumericType :\r
2306 vfrStatementNumeric |\r
2307 vfrStatementOneOf\r
2308 ;\r
2309\r
2310vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
2311 <<\r
2312 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
2313 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
2314 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
2315 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
2316 >>\r
2317 Minimum "=" I:Number ","\r
2318 <<\r
a709adfa 2319 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2320 case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
2321 case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
2322 case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
2323 case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText(), I->getLine()); break;\r
30fdf114
LG
2324 }\r
2325 >>\r
2326 Maximum "=" A:Number ","\r
2327 <<\r
a709adfa 2328 switch (_GET_CURRQEST_DATATYPE()) {\r
fd171542 2329 case EFI_IFR_TYPE_NUM_SIZE_64 : \r
e4ac870f 2330 MaxU8 = _STOU64(A->getText(), A->getLine()); \r
fd171542 2331 if (MaxU8 < MinU8) {\r
2332 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2333 }\r
2334 break;\r
2335 case EFI_IFR_TYPE_NUM_SIZE_32 : \r
e4ac870f 2336 MaxU4 = _STOU32(A->getText(), A->getLine()); \r
fd171542 2337 if (MaxU4 < MinU4) {\r
2338 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2339 }\r
2340 break;\r
2341 case EFI_IFR_TYPE_NUM_SIZE_16 : \r
e4ac870f 2342 MaxU2 = _STOU16(A->getText(), A->getLine()); \r
fd171542 2343 if (MaxU2 < MinU2) {\r
2344 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2345 }\r
2346 break;\r
2347 case EFI_IFR_TYPE_NUM_SIZE_8 : \r
e4ac870f 2348 MaxU1 = _STOU8(A->getText(), A->getLine()); \r
fd171542 2349 if (MaxU1 < MinU1) {\r
2350 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2351 }\r
2352 break;\r
30fdf114
LG
2353 }\r
2354 >>\r
2355 {\r
2356 STEP "=" S:Number ","\r
2357 <<\r
a709adfa 2358 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2359 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
2360 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
2361 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
2362 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
30fdf114
LG
2363 }\r
2364 >>\r
2365 }\r
2366 <<\r
a709adfa 2367 switch (_GET_CURRQEST_DATATYPE()) {\r
30fdf114
LG
2368 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
2369 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
2370 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
2371 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
2372 }\r
2373 >>\r
2374 ;\r
2375\r
2376vfrStatementNumeric :\r
2377 <<\r
2378 CIfrNumeric NObj;\r
4afd3d04
LG
2379 UINT32 DataTypeSize;\r
2380 BOOLEAN IsSupported = TRUE;\r
2381 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2382 >>\r
2383 L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
2384 vfrQuestionHeader[NObj] "," << // check data type\r
4afd3d04
LG
2385 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2386 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
2387 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2388 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
2389 }\r
2390 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2391 }\r
30fdf114
LG
2392 >>\r
2393 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
2394 {\r
2395 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
2396 }\r
4afd3d04 2397 vfrSetMinMaxStep[NObj] <<\r
b36d134f 2398 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2399 //\r
2400 // Base on the type to know the actual used size,shrink the buffer \r
2401 // size allocate before.\r
2402 //\r
2403 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2404 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2405 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2406 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
2407 default: \r
2408 IsSupported = FALSE;\r
b36d134f
LG
2409 break;\r
2410 }\r
4afd3d04 2411 NObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2412 if (!IsSupported) {\r
2413 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2414 }\r
4afd3d04
LG
2415 >>\r
2416 vfrStatementQuestionOptionList\r
2417 E:EndNumeric << \r
b36d134f
LG
2418 CRT_END_OP (E); \r
2419 >>\r
30fdf114
LG
2420 ";"\r
2421 ;\r
2422\r
2423vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
2424 <<\r
a709adfa 2425 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2426 UINT8 HFlags = 0;\r
a709adfa 2427 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2428 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2429 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2430 >>\r
e4ac870f 2431 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
a709adfa
LG
2432 <<\r
2433 //check data type flag\r
4afd3d04
LG
2434 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2435 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2436 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2437 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2438 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2439 }\r
2440 } else {\r
2441 // update data type for name/value store\r
2442 UINT32 DataTypeSize;\r
2443 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2444 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2445 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2446 }\r
4afd3d04 2447 } else if (IsSetType){\r
a709adfa 2448 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa 2449 }\r
e4ac870f 2450 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
a709adfa 2451 >>\r
30fdf114
LG
2452 ;\r
2453\r
e4ac870f
LG
2454numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
2455 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
4afd3d04
LG
2456 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
2457 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
2458 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
2459 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
e4ac870f
LG
2460 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
2461 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
2462 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
30fdf114
LG
2463 | questionheaderFlagsField[HFlags]\r
2464 ;\r
2465\r
2466vfrStatementOneOf :\r
2467 <<\r
2468 CIfrOneOf OObj;\r
2469 UINT32 DataTypeSize;\r
4afd3d04
LG
2470 BOOLEAN IsSupported = TRUE;\r
2471 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2472 >>\r
2473 L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
2474 vfrQuestionHeader[OObj] "," << //check data type\r
4afd3d04
LG
2475 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2476 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
2477 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2478 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
2479 }\r
2480 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2481 }\r
30fdf114
LG
2482 >>\r
2483 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
2484 {\r
2485 vfrSetMinMaxStep[OObj]\r
2486 }\r
4afd3d04 2487 <<\r
b36d134f 2488 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2489 //\r
2490 // Base on the type to know the actual used size,shrink the buffer \r
2491 // size allocate before.\r
2492 //\r
2493 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2494 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2495 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2496 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
b36d134f 2497 default:\r
4afd3d04 2498 IsSupported = FALSE;\r
b36d134f
LG
2499 break;\r
2500 }\r
4afd3d04 2501 OObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2502 if (!IsSupported) {\r
2503 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2504 }\r
4afd3d04
LG
2505 >>\r
2506 vfrStatementQuestionOptionList\r
2507 E:EndOneOf <<\r
b36d134f
LG
2508 CRT_END_OP (E); \r
2509 >>\r
30fdf114
LG
2510 ";"\r
2511 ;\r
2512\r
2513vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
2514 <<\r
a709adfa 2515 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2516 UINT8 HFlags = 0;\r
a709adfa 2517 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2518 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2519 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2520 >>\r
e4ac870f 2521 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
a709adfa
LG
2522 <<\r
2523 //check data type flag\r
4afd3d04
LG
2524 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2525 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2526 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2527 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2528 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2529 }\r
2530 } else {\r
2531 // update data type for Name/Value store\r
2532 UINT32 DataTypeSize;\r
2533 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2534 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2535 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2536 }\r
4afd3d04 2537 } else if (IsSetType){\r
a709adfa 2538 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa
LG
2539 }\r
2540 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
2541 >>\r
30fdf114
LG
2542 ;\r
2543\r
2544vfrStatementStringType :\r
2545 vfrStatementString |\r
2546 vfrStatementPassword\r
2547 ;\r
2548\r
2549vfrStatementString :\r
2550 <<\r
2551 CIfrString SObj;\r
40d841f6
LG
2552 UINT32 VarArraySize;\r
2553 UINT8 StringMinSize;\r
2554 UINT8 StringMaxSize;\r
30fdf114
LG
2555 >>\r
2556 L:String << SObj.SetLineNo(L->getLine()); >>\r
2557 vfrQuestionHeader[SObj] ","\r
2558 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
2559 {\r
2560 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
2561 }\r
40d841f6
LG
2562 MinSize "=" MIN:Number "," << \r
2563 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2564 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());\r
2565 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {\r
40d841f6
LG
2566 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
2567 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
2568 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
2569 }\r
2570 SObj.SetMinSize (StringMinSize);\r
2571 >>\r
2572 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2573 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());\r
2574 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {\r
40d841f6
LG
2575 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
2576 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
2577 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
2578 } else if (StringMaxSize < StringMinSize) {\r
2579 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
2580 }\r
2581 SObj.SetMaxSize (StringMaxSize);\r
2582 >>\r
30fdf114
LG
2583 vfrStatementQuestionOptionList\r
2584 E:EndString << CRT_END_OP (E); >>\r
2585 ";"\r
2586 ;\r
2587\r
2588vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
2589 <<\r
2590 UINT8 LFlags = 0;\r
2591 UINT8 HFlags = 0;\r
2592 >>\r
2593 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
2594 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2595 ;\r
2596\r
2597stringFlagsField [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 | "MULTI_LINE" << $LFlags = 0x01; >>\r
2600 | questionheaderFlagsField[HFlags]\r
2601 ;\r
2602\r
2603vfrStatementPassword :\r
2604 <<\r
2605 CIfrPassword PObj;\r
40d841f6
LG
2606 UINT32 VarArraySize;\r
2607 UINT16 PasswordMinSize;\r
2608 UINT16 PasswordMaxSize;\r
30fdf114
LG
2609 >>\r
2610 L:Password << PObj.SetLineNo(L->getLine()); >>\r
2611 vfrQuestionHeader[PObj] ","\r
2612 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
2613 {\r
2614 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
2615 }\r
40d841f6
LG
2616 MinSize "=" MIN:Number "," << \r
2617 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2618 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());\r
2619 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {\r
40d841f6
LG
2620 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
2621 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
2622 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
2623 }\r
2624 PObj.SetMinSize (PasswordMinSize);\r
2625 >>\r
2626 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2627 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());\r
2628 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {\r
40d841f6
LG
2629 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
2630 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
2631 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
2632 } else if (PasswordMaxSize < PasswordMinSize) {\r
2633 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
2634 }\r
2635 PObj.SetMaxSize (PasswordMaxSize);\r
2636 >>\r
30fdf114
LG
2637 { Encoding "=" Number "," }\r
2638 vfrStatementQuestionOptionList\r
2639 E:EndPassword << CRT_END_OP (E); >>\r
2640 ";"\r
2641 ;\r
2642\r
2643vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
2644 << UINT8 HFlags = 0; >>\r
2645 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
2646 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
2647 ;\r
2648\r
2649passwordFlagsField [UINT8 & HFlags] :\r
e4ac870f 2650 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2651 | questionheaderFlagsField[HFlags]\r
2652 ;\r
2653\r
2654vfrStatementOrderedList :\r
2655 <<\r
2656 CIfrOrderedList OLObj;\r
40d841f6 2657 UINT32 VarArraySize;\r
30fdf114 2658 >>\r
ddaf640f 2659 L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
30fdf114 2660 vfrQuestionHeader[OLObj] ","\r
40d841f6
LG
2661 << \r
2662 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
2663 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
2664 >>\r
30fdf114 2665 {\r
40d841f6 2666 MaxContainers "=" M:Number "," << \r
e4ac870f 2667 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\r
40d841f6 2668 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
e4ac870f 2669 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {\r
40d841f6
LG
2670 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
2671 }\r
e4ac870f 2672 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));\r
40d841f6 2673 >>\r
30fdf114 2674 }\r
3a8e175b 2675 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
30fdf114 2676 vfrStatementQuestionOptionList\r
ddaf640f 2677 E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
30fdf114
LG
2678 ";"\r
2679 ;\r
2680\r
2681vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
2682 <<\r
2683 UINT8 HFlags = 0;\r
2684 UINT8 LFlags = 0;\r
2685 >>\r
2686 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
2687 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2688 ;\r
2689\r
2690orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2691 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2692 | "UNIQUE" << $LFlags |= 0x01; >>\r
2693 | "NOEMPTY" << $LFlags |= 0x02; >>\r
2694 | questionheaderFlagsField[HFlags]\r
2695 ;\r
2696\r
2697vfrStatementTime :\r
2698 <<\r
2699 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2700 CHAR8 *VarIdStr[3] = {NULL, };\r
2701 CIfrTime TObj;\r
2702 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2703 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
30fdf114
LG
2704 >>\r
2705 L:Time << TObj.SetLineNo(L->getLine()); >>\r
2706 (\r
2707 (\r
4afd3d04
LG
2708 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<\r
2709 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2710 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
2711 }\r
2712 >>\r
30fdf114 2713 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
40d841f6 2714 vfrStatementQuestionOptionList\r
30fdf114
LG
2715 )\r
2716 |\r
2717 (\r
2718 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
2719 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
2720 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
2721 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
2722 minMaxTimeStepDefault[Val.time, 0]\r
2723\r
2724 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
2725 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
2726 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2727 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2728 minMaxTimeStepDefault[Val.time, 1]\r
2729\r
2730 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
2731 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
2732 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
2733 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
2734 minMaxTimeStepDefault[Val.time, 2]\r
2bcc713e 2735 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
30fdf114
LG
2736 <<\r
2737 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2738 TObj.SetQuestionId (QId);\r
2739 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
e4ac870f
LG
2740 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
2741 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\r
30fdf114
LG
2742 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2743 >>\r
4afd3d04 2744 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2745 )\r
2746 ( vfrStatementInconsistentIf )*\r
2747 )\r
2748 E:EndTime << CRT_END_OP (E); >>\r
2749 ";"\r
2750 ;\r
2751\r
2752minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
2753 Minimum "=" Number ","\r
2754 Maximum "=" Number ","\r
2755 { "step" "=" Number "," }\r
2756 {\r
2757 "default" "=" N:Number "," <<\r
2758 switch (KeyValue) {\r
fd171542 2759 case 0: \r
e4ac870f 2760 T.Hour = _STOU8(N->getText(), N->getLine()); \r
fd171542 2761 if (T.Hour > 23) {\r
2762 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
2763 }\r
2764 break;\r
2765 case 1: \r
e4ac870f 2766 T.Minute = _STOU8(N->getText(), N->getLine()); \r
fd171542 2767 if (T.Minute > 59) {\r
2768 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
2769 }\r
2770 break;\r
2771 case 2: \r
e4ac870f 2772 T.Second = _STOU8(N->getText(), N->getLine());\r
fd171542 2773 if (T.Second > 59) {\r
2774 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
2775 }\r
2776 break;\r
30fdf114
LG
2777 }\r
2778 >>\r
2779 }\r
2780 ;\r
2781\r
2782vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
2783 << UINT8 LFlags = 0; >>\r
2784 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
2785 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2786 ;\r
2787\r
2788timeFlagsField [UINT8 & Flags] :\r
e4ac870f 2789 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2790 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r
2791 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r
2792 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r
2793 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2794 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2795 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2796 ;\r
2797\r
2798vfrStatementQuestionTag :\r
2799 vfrStatementStatTag "," |\r
2800 vfrStatementInconsistentIf |\r
2801 vfrStatementNoSubmitIf |\r
2802 vfrStatementDisableIfQuest |\r
2803 vfrStatementRefresh |\r
da92f276 2804 vfrStatementVarstoreDevice |\r
4234283c 2805 vfrStatementExtension |\r
e2a5feb9 2806 vfrStatementRefreshEvent "," |\r
ea0f6464 2807 vfrStatementWarningIf\r
30fdf114
LG
2808 ;\r
2809\r
2810vfrStatementQuestionTagList :\r
2811 ( vfrStatementQuestionTag )*\r
2812 ;\r
2813\r
2814vfrStatementQuestionOptionTag :\r
2815 vfrStatementSuppressIfQuest |\r
2816 vfrStatementGrayOutIfQuest |\r
2817 vfrStatementValue |\r
2818 vfrStatementDefault |\r
52302d4d
LG
2819 vfrStatementRead |\r
2820 vfrStatementWrite |\r
30fdf114
LG
2821 vfrStatementOptions\r
2822 ;\r
2823\r
2824vfrStatementQuestionOptionList :\r
2825 (\r
2826 vfrStatementQuestionTag |\r
2827 vfrStatementQuestionOptionTag\r
2828 )*\r
2829 ;\r
2830\r
2831vfrStatementStatList :\r
2832 vfrStatementStat |\r
2833 vfrStatementQuestions |\r
2834 vfrStatementConditionalNew |\r
2835 vfrStatementLabel |\r
da92f276 2836 vfrStatementExtension |\r
30fdf114
LG
2837 // Just for framework vfr compatibility\r
2838 vfrStatementInvalid\r
2839 ;\r
2840\r
2841vfrStatementStatListOld :\r
2842 vfrStatementStat |\r
2843 vfrStatementQuestions |\r
2844 vfrStatementLabel |\r
2845 // Just for framework vfr compatibility\r
2846 vfrStatementInvalid\r
2847 ;\r
2848\r
2849vfrStatementDisableIfStat :\r
2850 << \r
2851 CIfrDisableIf DIObj; \r
30fdf114
LG
2852 >>\r
2853 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 2854 vfrStatementExpression[0] ";" \r
30fdf114
LG
2855 ( vfrStatementStatList )*\r
2856 E:EndIf << CRT_END_OP (E); >>\r
2857 ";"\r
2858 ;\r
2859\r
2860vfrStatementInconsistentIfStat :\r
2861 << CIfrInconsistentIf IIObj; >>\r
2862 L:InconsistentIf <<\r
2863 if (!mCompatibleMode) {\r
2864 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
2865 }\r
2866 IIObj.SetLineNo(L->getLine());\r
2867 >>\r
e4ac870f 2868 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2869 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2870 vfrStatementExpression[0]\r
2871 E:EndIf << CRT_END_OP (E); >>\r
2872 ";"\r
2873 ;\r
2874\r
2875//\r
2876// Compatible for framework vfr file\r
2877//\r
2878vfrStatementgrayoutIfSuppressIf:\r
2879 << CIfrSuppressIf SIObj; >>\r
2880 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2881 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2882 vfrStatementExpression[0]\r
2883 ";"\r
2884 ;\r
2885\r
2886vfrStatementsuppressIfGrayOutIf:\r
2887 << CIfrGrayOutIf GOIObj; >>\r
2888 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2889 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2890 vfrStatementExpression[0]\r
2891 ";"\r
2892 ;\r
2893\r
2894vfrStatementSuppressIfStatNew :\r
2895 << CIfrSuppressIf SIObj;>>\r
2896 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2897 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2898 vfrStatementExpression[0]\r
2899 ";"\r
2900 ( vfrStatementStatList )*\r
2901 E: EndIf ";" << CRT_END_OP (E); >>\r
2902 ;\r
2903\r
2904vfrStatementGrayOutIfStatNew :\r
2905 << CIfrGrayOutIf GOIObj;>>\r
2906 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2907 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2908 vfrStatementExpression[0]\r
2909 ";"\r
2910 ( vfrStatementStatList )*\r
2911 E: EndIf ";" << CRT_END_OP (E); >>\r
2912 ;\r
2913\r
2914vfrStatementSuppressIfStatOld :\r
2915 <<\r
2916 CIfrSuppressIf SIObj;\r
2917 BOOLEAN GrayOutExist = FALSE;\r
2918 >>\r
2919 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2920 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2921 vfrStatementExpression[0]\r
2922 ";"\r
2923 {\r
2924 vfrStatementsuppressIfGrayOutIf\r
2925 << GrayOutExist = TRUE; >>\r
2926 }\r
2927 ( vfrStatementStatListOld )*\r
2928 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
2929 ;\r
2930\r
2931vfrStatementGrayOutIfStatOld :\r
2932 <<\r
2933 CIfrGrayOutIf GOIObj;\r
2934 BOOLEAN SuppressExist = FALSE;\r
2935 >>\r
2936 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2937 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2938 vfrStatementExpression[0]\r
2939 ";"\r
2940 {\r
2941 vfrStatementgrayoutIfSuppressIf\r
2942 << SuppressExist = TRUE; >>\r
2943 }\r
2944 ( vfrStatementStatListOld )*\r
2945 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
2946 ;\r
2947\r
2948vfrImageTag :\r
2949 << CIfrImage IObj; >>\r
e4ac870f 2950 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
30fdf114
LG
2951 ;\r
2952\r
2953vfrLockedTag :\r
2954 << CIfrLocked LObj; >>\r
2955 L:Locked << LObj.SetLineNo(L->getLine()); >>\r
2956 ;\r
2957\r
4234283c
LG
2958vfrModalTag :\r
2959 << CIfrModal MObj; >>\r
2960 L:Modal << MObj.SetLineNo(L->getLine()); >>\r
2961 ;\r
2962\r
30fdf114
LG
2963vfrStatementStatTag :\r
2964 vfrImageTag |\r
2965 vfrLockedTag\r
2966 ;\r
2967\r
2968vfrStatementStatTagList :\r
2969 vfrStatementStatTag ( "," vfrStatementStatTag )*\r
2970 ;\r
2971\r
2972vfrStatementImage :\r
2973 vfrImageTag\r
2974 ";"\r
2975 ;\r
2976\r
4234283c
LG
2977vfrStatementModal :\r
2978 vfrModalTag\r
2979 ";"\r
2980 ;\r
2981\r
30fdf114
LG
2982vfrStatementLocked :\r
2983 vfrLockedTag\r
2984 ";"\r
2985 ;\r
2986\r
2987vfrStatementInconsistentIf :\r
2988 << CIfrInconsistentIf IIObj; >>\r
2989 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2990 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2991 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2992 vfrStatementExpression[0]\r
2993 E:EndIf << CRT_END_OP (E); >>\r
2994 ;\r
2995\r
2996vfrStatementNoSubmitIf :\r
2997 << CIfrNoSubmitIf NSIObj; >>\r
2998 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2999 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3000 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3001 vfrStatementExpression[0]\r
3002 E:EndIf << CRT_END_OP (E); >>\r
3003 ;\r
3004\r
ea0f6464
LG
3005vfrStatementWarningIf :\r
3006 << CIfrWarningIf WIObj; >>\r
3007 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>\r
e4ac870f
LG
3008 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
3009 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
ea0f6464
LG
3010 vfrStatementExpression[0]\r
3011 E:EndIf << CRT_END_OP (E); >>\r
3012 ;\r
3013\r
30fdf114
LG
3014vfrStatementDisableIfQuest :\r
3015 << \r
3016 CIfrDisableIf DIObj; \r
30fdf114
LG
3017 >>\r
3018 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 3019 vfrStatementExpression[0] ";"\r
30fdf114
LG
3020 vfrStatementQuestionOptionList\r
3021 E:EndIf << CRT_END_OP (E); >>\r
3022 ;\r
3023\r
3024vfrStatementRefresh :\r
3025 << CIfrRefresh RObj; >>\r
3026 L:Refresh << RObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3027 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\r
30fdf114
LG
3028 ;\r
3029\r
4234283c
LG
3030vfrStatementRefreshEvent :\r
3031 <<\r
3032 CIfrRefreshId RiObj;\r
3033 EFI_GUID Guid;\r
3034 >>\r
3035 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
e2a5feb9 3036 "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >>\r
4234283c
LG
3037 ;\r
3038\r
30fdf114
LG
3039vfrStatementVarstoreDevice :\r
3040 << CIfrVarStoreDevice VDObj; >>\r
3041 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3042 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3043 ;\r
3044\r
3045vfrStatementSuppressIfQuest :\r
3046 << CIfrSuppressIf SIObj; >>\r
3047 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3048 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3049 vfrStatementExpression[0] ";"\r
3050 vfrStatementQuestionOptionList\r
3051 E:EndIf << CRT_END_OP (E); >>\r
3052 ;\r
3053\r
3054vfrStatementGrayOutIfQuest :\r
3055 << CIfrGrayOutIf GOIObj; >>\r
3056 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3057 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3058 vfrStatementExpression[0] ";"\r
3059 vfrStatementQuestionOptionList\r
3060 E:EndIf << CRT_END_OP (E); >>\r
3061 ;\r
3062\r
3063vfrStatementOptions :\r
3064 vfrStatementOneOfOption\r
3065 ;\r
3066\r
3067vfrStatementOneOfOption :\r
3068 <<\r
ddaf640f
ED
3069 UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3070 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
30fdf114 3071 CHAR8 *VarStoreName = NULL;\r
4afd3d04
LG
3072 UINT32 Size = 0;\r
3073 BOOLEAN TypeError = FALSE;\r
3074 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
3075 EFI_GUID *VarStoreGuid = NULL;\r
ddaf640f
ED
3076 BOOLEAN ArrayType = FALSE;\r
3077 CIfrOneOfOption *OOOObj;\r
3078 UINT8 *Type8 = (UINT8 *) ValueList;\r
3079 UINT16 *Type16 = (UINT16 *) ValueList;\r
3080 UINT32 *Type32 = (UINT32 *) ValueList;\r
3081 UINT64 *Type64 = (UINT64 *) ValueList;\r
30fdf114 3082 >>\r
4afd3d04 3083 L:Option << \r
ddaf640f 3084 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
4afd3d04
LG
3085 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
3086 }\r
ddaf640f 3087\r
4afd3d04 3088 >>\r
ddaf640f
ED
3089 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," \r
3090 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
a709adfa
LG
3091 << \r
3092 if (gCurrentMinMaxData != NULL) {\r
3093 //set min/max value for oneof opcode\r
3094 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
3095 switch (_GET_CURRQEST_DATATYPE()) {\r
3096 case EFI_IFR_TYPE_NUM_SIZE_64:\r
ddaf640f 3097 gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
a709adfa
LG
3098 break;\r
3099 case EFI_IFR_TYPE_NUM_SIZE_32:\r
ddaf640f 3100 gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
a709adfa
LG
3101 break;\r
3102 case EFI_IFR_TYPE_NUM_SIZE_16:\r
ddaf640f 3103 gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
a709adfa
LG
3104 break;\r
3105 case EFI_IFR_TYPE_NUM_SIZE_8:\r
ddaf640f 3106 gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
a709adfa
LG
3107 break;\r
3108 default:\r
3109 break;\r
3110 }\r
3111 }\r
ddaf640f
ED
3112 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
3113 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
3114 } else if (ArrayType) {\r
3115 switch (_GET_CURRQEST_DATATYPE()) {\r
3116 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
3117 while (Type8[Size] != 0) {\r
3118 Size++;\r
3119 }\r
3120 break;\r
3121 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
3122 while (Type16[Size] != 0) {\r
3123 Size++;\r
3124 }\r
3125 Size *= sizeof (UINT16);\r
3126 break;\r
3127 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
3128 while (Type32[Size] != 0) {\r
3129 Size++;\r
3130 }\r
3131 Size *= sizeof (UINT32);\r
3132 break;\r
3133 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
3134 while (Type64[Size] != 0) {\r
3135 Size++;\r
3136 }\r
3137 Size *= sizeof (UINT64);\r
3138 break;\r
3139 default:\r
3140 break;\r
3141 }\r
3142 } else {\r
3143 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
3144 }\r
3145 if (ReturnCode != VFR_RETURN_SUCCESS) {\r
3146 _PCATCH (ReturnCode, L->getLine());\r
3147 }\r
3148\r
3149 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
3150 OOOObj = new CIfrOneOfOption((UINT8)Size);\r
3151 OOOObj->SetLineNo(L->getLine());\r
3152 OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
3153 if (ArrayType) {\r
3154 OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
3155 } else {\r
3156 OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
3157 }\r
3158 OOOObj->SetValue (*Val); \r
a709adfa 3159 >>\r
ddaf640f 3160 F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
30fdf114 3161 <<\r
ddaf640f
ED
3162 //\r
3163 // Array type only for default type OneOfOption.\r
3164 //\r
3165 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
3166 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
3167 }\r
3168\r
3169 //\r
3170 // Clear the default flag if the option not use array value but has default flag.\r
3171 //\r
3172 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
3173 OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
3174 }\r
3175\r
4afd3d04
LG
3176 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
3177 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
3178 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
ddaf640f 3179 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
4afd3d04
LG
3180 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
3181 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3182 EFI_HII_DEFAULT_CLASS_STANDARD,\r
3183 _GET_CURRQEST_VARTINFO(),\r
3184 VarStoreName,\r
3185 VarStoreGuid,\r
3186 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3187 *Val\r
4afd3d04
LG
3188 ), L->getLine());\r
3189 }\r
ddaf640f 3190 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
4afd3d04
LG
3191 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
3192 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3193 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
3194 _GET_CURRQEST_VARTINFO(),\r
3195 VarStoreName,\r
3196 VarStoreGuid,\r
3197 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3198 *Val\r
4afd3d04
LG
3199 ), L->getLine());\r
3200 }\r
30fdf114
LG
3201 }\r
3202 >>\r
3203 {\r
3204 "," Key "=" KN:Number <<\r
3205 if (!mCompatibleMode) {\r
3206 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
3207 }\r
3208 //\r
3209 // Guid Option Key\r
3210 //\r
3211 CIfrOptionKey IfrOptionKey (\r
3212 gCurrentQuestion->QUESTION_ID(),\r
ddaf640f 3213 *Val,\r
e4ac870f 3214 _STOQID(KN->getText(), KN->getLine())\r
30fdf114
LG
3215 );\r
3216 SET_LINE_INFO (IfrOptionKey, KN);\r
3217 >>\r
3218 }\r
3219 (\r
ddaf640f 3220 T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
30fdf114 3221 )*\r
ddaf640f 3222 ";" << if (OOOObj != NULL) {delete OOOObj;} >>\r
30fdf114
LG
3223 ;\r
3224\r
3225vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
3226 <<\r
3227 UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
3228 UINT8 HFlags = 0;\r
3229 >>\r
3230 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
3231 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
3232 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
3233 ;\r
3234\r
3235oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 3236 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3237 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r
3238 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
3239 | InteractiveFlag << $HFlags |= 0x04; >>\r
30fdf114 3240 | ResetRequiredFlag << $HFlags |= 0x10; >>\r
30fdf114
LG
3241 | ManufacturingFlag << $LFlags |= 0x20; >>\r
3242 | DefaultFlag << $LFlags |= 0x10; >>\r
05154781
ED
3243 | A:NVAccessFlag << \r
3244 if (mCompatibleMode) {\r
3245 $HFlags |= 0x08;\r
3246 } else {\r
3247 gCVfrErrorHandle.HandleWarning (\r
3248 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3249 A->getLine(),\r
3250 A->getText()\r
3251 );\r
3252 }\r
3253 >>\r
3254 | L:LateCheckFlag << \r
3255 if (mCompatibleMode) {\r
3256 $HFlags |= 0x20;\r
3257 } else {\r
3258 gCVfrErrorHandle.HandleWarning (\r
3259 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3260 L->getLine(),\r
3261 L->getText()\r
3262 );\r
3263 }\r
3264 >>\r
30fdf114
LG
3265 ;\r
3266\r
3267vfrStatementLabel :\r
3268 L:Label\r
3269 N:Number <<\r
3270 if (mCompatibleMode) {\r
3271 //\r
3272 // Add end Label for Framework Vfr\r
3273 //\r
3274 CIfrLabel LObj1;\r
3275 LObj1.SetLineNo(L->getLine());\r
3276 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
3277 }\r
3278\r
3279 {\r
3280 CIfrLabel LObj2;\r
3281 LObj2.SetLineNo(L->getLine());\r
e4ac870f 3282 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
30fdf114
LG
3283 }\r
3284 >>\r
3285 ";"\r
3286 ;\r
3287\r
3288vfrStatementBanner :\r
3289 << CIfrBanner BObj; >>\r
3290 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r
e4ac870f 3291 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3292 (\r
3293 (\r
e4ac870f 3294 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
30fdf114
LG
3295 Align\r
3296 (\r
3297 Left << BObj.SetAlign (0); >>\r
3298 | Center << BObj.SetAlign (1); >>\r
3299 | Right << BObj.SetAlign (2); >>\r
3300 ) ";"\r
3301 )\r
3302 |\r
3303 (\r
e4ac870f 3304 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
30fdf114
LG
3305 )\r
3306 )\r
3307 ;\r
3308\r
3309//******************************************************************************\r
3310//\r
3311// keep some syntax for compatibility but not generate any IFR object\r
3312//\r
3313vfrStatementInvalidHidden :\r
3314 L:Hidden <<\r
3315 if (!mCompatibleMode) {\r
3316 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3317 }\r
3318 >>\r
3319 Value "=" Number ","\r
3320 Key "=" Number ";"\r
3321 ;\r
3322\r
3323vfrStatementInvalidInconsistentIf :\r
3324 InconsistentIf\r
3325 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
3326 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3327 vfrStatementExpression[0]\r
3328 EndIf\r
3329 ";"\r
3330 ;\r
3331\r
3332vfrStatementInvalidInventory :\r
3333 L:Inventory <<\r
3334 if (!mCompatibleMode) {\r
3335 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3336 }\r
3337 >>\r
3338 Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3339 Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3340 {\r
3341 Text "=" "STRING_TOKEN" "\(" Number "\)"\r
3342 }\r
3343 ";"\r
3344 ;\r
3345\r
3346vfrStatementInvalidSaveRestoreDefaults :\r
3347 (\r
3348 L:Save <<\r
3349 if (!mCompatibleMode) {\r
3350 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3351 }\r
3352 >>\r
3353 |\r
3354 K:Restore <<\r
3355 if (!mCompatibleMode) {\r
3356 _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
3357 }\r
3358 >>\r
3359 )\r
3360 Defaults ","\r
3361 FormId "=" Number ","\r
3362 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3363 Help "=" "STRING_TOKEN" "\(" Number "\)"\r
3364 { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
3365 { "," Key "=" Number }\r
3366 ";"\r
3367 ;\r
3368\r
3369//******************************************************************************\r
3370//\r
3371// The syntax of expression\r
3372//\r
3373#token Dup("dup") "dup"\r
3374#token VarEqVal("vareqval") "vareqval"\r
3375#token Var("var") "var"\r
3376#token IdEqVal("ideqval") "ideqval"\r
3377#token IdEqId("ideqid") "ideqid"\r
3378#token IdEqValList("ideqvallist") "ideqvallist"\r
3379#token QuestionRef("questionref") "questionref"\r
3380#token RuleRef("ruleref") "ruleref"\r
3381#token StringRef("stringref") "stringref"\r
3382#token PushThis("pushthis") "pushthis"\r
a709adfa 3383#token Security("security") "security"\r
52302d4d 3384#token Get("get") "get"\r
30fdf114
LG
3385#token True("TRUE") "TRUE"\r
3386#token False("FALSE") "FALSE"\r
3387#token One("ONE") "ONE"\r
3388#token Ones("ONES") "ONES"\r
3389#token Zero("ZERO") "ZERO"\r
3390#token Undefined("UNDEFINED") "UNDEFINED"\r
3391#token Version("VERSION") "VERSION"\r
3392#token Length("length") "length"\r
3393#token AND("AND") "AND"\r
3394#token OR("OR") "OR"\r
3395#token NOT("NOT") "NOT"\r
52302d4d 3396#token Set("set") "set"\r
30fdf114
LG
3397#token BitWiseNot("~") "\~"\r
3398#token BoolVal("boolval") "boolval"\r
3399#token StringVal("stringval") "stringval"\r
3400#token UnIntVal("unintval") "unintval"\r
3401#token ToUpper("toupper") "toupper"\r
3402#token ToLower("tolower") "tolower"\r
3403#token Match("match") "match"\r
3404#token Catenate("catenate") "catenate"\r
3405#token QuestionRefVal("questionrefval") "questionrefval"\r
3406#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3407#token Map("map") "map"\r
4234283c 3408#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3409\r
3410//\r
3411// Root expression extension function called by other function.\r
3412//\r
3413vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3414 << 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
3415 andTerm[$RootLevel, $ExpOpCount]\r
3416 (\r
3417 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3418 )*\r
3419 <<\r
3420 //\r
3421 // Extend OpCode Scope only for the root expression.\r
3422 //\r
3423 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3424 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3425 CIfrEnd EObj;\r
52302d4d
LG
3426 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3427 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3428 }\r
3429 }\r
3430 }\r
52302d4d
LG
3431 \r
3432 if ($RootLevel == 0) {\r
3433 mCIfrOpHdrIndex --;\r
3434 }\r
30fdf114
LG
3435 >>\r
3436 ;\r
3437\r
3438//\r
3439// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3440// This funciton is only called by sub expression.\r
3441//\r
3442vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3443 andTerm[$RootLevel, $ExpOpCount]\r
3444 (\r
3445 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3446 )*\r
3447 ;\r
3448\r
3449andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3450 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3451 (\r
3452 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3453 )*\r
3454 ;\r
3455\r
3456bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3457 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3458 (\r
3459 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3460 )*\r
3461 ;\r
3462\r
3463bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3464 equalTerm[$RootLevel, $ExpOpCount]\r
3465 (\r
3466 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3467 )*\r
3468 ;\r
3469\r
3470equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3471 compareTerm[$RootLevel, $ExpOpCount]\r
3472 (\r
3473 (\r
3474 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3475 )\r
3476 |\r
3477 (\r
3478 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3479 )\r
3480 )*\r
3481 ;\r
3482\r
3483compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3484 shiftTerm[$RootLevel, $ExpOpCount]\r
3485 (\r
3486 (\r
3487 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3488 )\r
3489 |\r
3490 (\r
3491 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3492 )\r
3493 |\r
3494 (\r
3495 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3496 )\r
3497 |\r
3498 (\r
3499 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3500 )\r
3501 )*\r
3502 ;\r
3503\r
3504shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3505 addMinusTerm[$RootLevel, $ExpOpCount]\r
3506 (\r
3507 (\r
3508 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3509 )\r
3510 |\r
3511 (\r
3512 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3513 )\r
3514 )*\r
3515 ;\r
3516\r
3517addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3518 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3519 (\r
3520 (\r
3521 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3522 )\r
3523 |\r
3524 (\r
3525 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3526 )\r
3527 )*\r
3528 ;\r
3529\r
3530multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3531 castTerm[$RootLevel, $ExpOpCount]\r
3532 (\r
3533 (\r
3534 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3535 )\r
3536 |\r
3537 (\r
3538 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3539 )\r
3540 |\r
3541 (\r
3542 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3543 )\r
3544 )*\r
3545 ;\r
3546\r
3547castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3548 << UINT8 CastType = 0xFF; >>\r
3549 (\r
3550 L:"\("\r
3551 (\r
3552 Boolean << CastType = 0; >>\r
3553 | Uint64 << CastType = 1; >>\r
3554 | Uint32 << CastType = 1; >>\r
3555 | Uint16 << CastType = 1; >>\r
3556 | Uint8 << CastType = 1; >>\r
3557 )\r
3558 "\)"\r
3559 )*\r
3560 atomTerm[$RootLevel, $ExpOpCount]\r
3561 <<\r
3562 switch (CastType) {\r
3563 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3564 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3565 }\r
3566 >>\r
3567 ;\r
3568\r
3569atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3570 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3571 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
3572 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3573 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3574 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3575 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3576 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3577 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3578 | (\r
3579 L:NOT\r
3580 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3581 )\r
3582 ;\r
3583\r
3584vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3585 L:Catenate\r
3586 "\("\r
3587 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3588 ","\r
3589 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3590 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3591 ;\r
3592\r
3593vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3594 L:Match\r
3595 "\("\r
3596 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3597 ","\r
3598 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3599 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3600 ;\r
3601\r
3602vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3603 "\("\r
3604 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3605 "\)"\r
3606 ;\r
3607\r
3608vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3609 dupExp[$RootLevel, $ExpOpCount]\r
3610 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3611 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3612 | ideqidExp[$RootLevel, $ExpOpCount]\r
3613 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3614 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3615 | rulerefExp[$RootLevel, $ExpOpCount]\r
3616 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3617 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3618 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3619 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3620 ;\r
3621\r
3622dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3623 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3624 ;\r
3625\r
3626vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3627 <<\r
3628 EFI_QUESTION_ID QId;\r
3629 UINT32 Mask;\r
3630 UINT16 ConstVal;\r
3631 CHAR8 *VarIdStr;\r
3632 UINT32 LineNo;\r
30fdf114 3633 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3634 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3635 >>\r
3636 L:VarEqVal <<\r
3637 if (!mCompatibleMode) {\r
3638 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3639 }\r
3640 >>\r
3641 VK:Var\r
3642 OpenParen\r
3643 VN:Number <<\r
3644 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
4afd3d04 3645 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114
LG
3646 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
3647 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
3648 VarIdStr,\r
3649 &mFormsetGuid,\r
e4ac870f 3650 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3651 0x2, //default type is UINT16\r
3652 FALSE\r
3653 ), VN);\r
3654 } else {\r
3655 _PCATCH (VfrReturnCode, VN);\r
3656 }\r
3657 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3658 LineNo = GET_LINENO(VN);\r
3659 >>\r
3660 CloseParen\r
3661 (\r
3662 (\r
3663 "=="\r
e4ac870f 3664 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3665 <<\r
3666 if (Mask == 0) {\r
3667 CIfrEqIdVal EIVObj (L->getLine());\r
3668 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3669 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3670 EIVObj.SetValue (ConstVal);\r
3671 $ExpOpCount++;\r
3672 } else {\r
3673 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3674 }\r
3675 >>\r
3676 )\r
3677 |\r
3678 (\r
3679 "<="\r
e4ac870f 3680 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3681 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3682 )\r
3683 |\r
3684 (\r
3685 "<"\r
e4ac870f 3686 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3687 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3688 )\r
3689 |\r
3690 (\r
3691 ">="\r
e4ac870f 3692 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3693 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3694 )\r
3695 |\r
3696 (\r
3697 ">"\r
e4ac870f 3698 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3699 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3700 )\r
3701 )\r
3702 ;\r
3703\r
3704ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3705 <<\r
3706 EFI_QUESTION_ID QId;\r
3707 UINT32 Mask;\r
3708 UINT16 ConstVal;\r
3709 CHAR8 *VarIdStr;\r
3710 UINT32 LineNo;\r
3711 >>\r
3712 L:IdEqVal\r
3713 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3714 (\r
3715 (\r
3716 "=="\r
e4ac870f 3717 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3718 <<\r
3719 if (Mask == 0) {\r
3720 CIfrEqIdVal EIVObj (L->getLine());\r
3721 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3722 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3723 EIVObj.SetValue (ConstVal);\r
3724 $ExpOpCount++;\r
3725 } else {\r
3726 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3727 }\r
3728 >>\r
3729 )\r
3730 |\r
3731 (\r
3732 "<="\r
e4ac870f 3733 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3734 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3735 )\r
3736 |\r
3737 (\r
3738 "<"\r
e4ac870f 3739 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3740 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3741 )\r
3742 |\r
3743 (\r
3744 ">="\r
e4ac870f 3745 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3746 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3747 )\r
3748 |\r
3749 (\r
3750 ">"\r
e4ac870f 3751 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3752 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3753 )\r
3754 )\r
3755 ;\r
3756\r
3757ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3758 <<\r
3759 EFI_QUESTION_ID QId[2];\r
3760 UINT32 Mask[2];\r
3761 CHAR8 *VarIdStr[2];\r
3762 UINT32 LineNo[2];\r
3763 >>\r
3764 L:IdEqId\r
3765 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
3766 (\r
3767 (\r
3768 "=="\r
3769 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3770 <<\r
3771 if (Mask[0] & Mask[1]) {\r
3772 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
3773 } else {\r
3774 CIfrEqIdId EIIObj(L->getLine());\r
3775 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
3776 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
3777 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
3778 $ExpOpCount++;\r
3779 }\r
3780 >>\r
3781 )\r
3782 |\r
3783 (\r
3784 "<="\r
3785 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3786 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
3787 )\r
3788 |\r
3789 (\r
3790 "<"\r
3791 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3792 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
3793 )\r
3794 |\r
3795 (\r
3796 ">="\r
3797 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3798 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
3799 )\r
3800 |\r
3801 (\r
3802 ">"\r
3803 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3804 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
3805 )\r
3806 )\r
3807 ;\r
3808\r
3809ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3810 <<\r
3811 UINT16 ListLen = 0;\r
3812 EFI_QUESTION_ID QId;\r
3813 UINT32 Mask;\r
3814 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3815 CHAR8 *VarIdStr;\r
3816 UINT32 LineNo;\r
3817 >>\r
3818 L:IdEqValList\r
3819 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3820 "=="\r
3821 (\r
e4ac870f 3822 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
3823 )+\r
3824 <<\r
3825 if (Mask != 0) {\r
3826 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
3827 } else {\r
3828 UINT16 Index;\r
3829 CIfrEqIdList EILObj(L->getLine());\r
3830 if (QId != EFI_QUESTION_ID_INVALID) {\r
3831 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3832 }\r
3833 EILObj.SetListLength (ListLen);\r
3834 for (Index = 0; Index < ListLen; Index++) {\r
3835 EILObj.SetValueList (Index, ValueList[Index]);\r
3836 }\r
3837 \r
3838 EILObj.UpdateIfrBuffer();\r
3839 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
3840 \r
3841 if (QId == EFI_QUESTION_ID_INVALID) {\r
3842 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3843 }\r
3844 $ExpOpCount++;\r
3845 }\r
3846 >>\r
3847 ;\r
3848\r
2bcc713e 3849questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 3850 <<\r
30fdf114
LG
3851 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3852 UINT32 BitMask;\r
3853 CHAR8 *QName = NULL;\r
3854 UINT32 LineNo = 0;\r
3855 >>\r
3856 L:QuestionRef\r
2bcc713e
LG
3857 "\("\r
3858 (\r
30fdf114
LG
3859 QN:StringIdentifier <<\r
3860 QName = QN->getText();\r
2bcc713e 3861 LineNo = QN->getLine();\r
30fdf114
LG
3862 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
3863 >>\r
e4ac870f 3864 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 3865 )\r
2bcc713e 3866 "\)"\r
30fdf114 3867 <<\r
2bcc713e 3868 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
3869 ;\r
3870\r
3871rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3872 L:RuleRef\r
3873 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
3874 ;\r
3875\r
3876//******************************************************\r
3877// PARSE:\r
3878// stringref (STR_FORM_SET_TITLE)\r
3879//\r
3880stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
3881 <<\r
3882 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
3883 >>\r
30fdf114 3884 L:StringRef\r
52302d4d
LG
3885 "\("\r
3886 ( \r
3887 "STRING_TOKEN"\r
3888 "\(" \r
e4ac870f 3889 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 3890 "\)"\r
e4ac870f 3891 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
3892 )\r
3893 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
3894 ;\r
3895\r
3896pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3897 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3898 ;\r
3899\r
a709adfa
LG
3900securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3901 <<\r
3902 EFI_GUID Guid;\r
3903 >>\r
3904 L:Security\r
3905 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
3906 ;\r
3907\r
52302d4d
LG
3908numericVarStoreType [UINT8 & VarType] :\r
3909 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
3910 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
3911 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
3912 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
3913 ;\r
3914\r
3915getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3916 <<\r
3917 EFI_VARSTORE_INFO Info;\r
3918 CHAR8 *VarIdStr = NULL;\r
3919 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3920 UINT32 Mask = 0;\r
3921 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3922 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3923 UINT32 VarSize = 0;\r
3924 Info.mVarStoreId = 0;\r
3925 >>\r
3926 L:Get\r
3927 "\(" \r
3928 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3929 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
3930 "\)" << \r
3931 {\r
3932 if (Info.mVarStoreId == 0) {\r
3933 // support Date/Time question\r
3934 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3935 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3936 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3937 }\r
3938 if (QType == QUESTION_DATE) {\r
3939 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3940 } else if (QType == QUESTION_TIME) {\r
3941 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3942 }\r
3943 switch (Mask) {\r
3944 case DATE_YEAR_BITMASK:\r
3945 Info.mInfo.mVarOffset = 0;\r
3946 break;\r
3947 case DATE_DAY_BITMASK:\r
3948 Info.mInfo.mVarOffset = 3;\r
3949 break;\r
3950 case TIME_HOUR_BITMASK:\r
3951 Info.mInfo.mVarOffset = 0;\r
3952 break;\r
3953 case TIME_MINUTE_BITMASK:\r
3954 Info.mInfo.mVarOffset = 1;\r
3955 break;\r
3956 case TIME_SECOND_BITMASK:\r
3957 Info.mInfo.mVarOffset = 2;\r
3958 break;\r
3959 default:\r
3960 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3961 break;\r
3962 }\r
3963 } else {\r
3964 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3965 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3966 }\r
3967 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3968 Info.mVarType = VarType;\r
3969 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3970 Info.mVarTotalSize = VarSize;\r
3971 }\r
3972 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3973 if (VarSize != Info.mVarTotalSize) {\r
3974 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
3975 }\r
3976 }\r
3977 CIfrGet GObj(L->getLine()); \r
3978 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
3979 GObj.SetVarInfo (&Info); \r
3980 delete VarIdStr; \r
3981 $ExpOpCount++;\r
3982 }\r
3983 >>\r
3984 ;\r
3985\r
30fdf114
LG
3986vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3987 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
3988 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
3989 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
3990 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
3991 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
3992 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
3993 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 3994 | 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
3995 ;\r
3996\r
3997vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3998 lengthExp[$RootLevel, $ExpOpCount]\r
3999 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 4000 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4001 | stringref2Exp[$RootLevel, $ExpOpCount]\r
4002 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 4003 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4004 | unintExp[$RootLevel, $ExpOpCount]\r
4005 | toupperExp[$RootLevel, $ExpOpCount]\r
4006 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 4007 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4008 ;\r
4009\r
4010lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4011 L:Length\r
4012 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4013 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
4014 ;\r
4015\r
4016bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4017 L:BitWiseNot\r
4018 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4019 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
4020 ;\r
4021\r
2bcc713e
LG
4022question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4023 <<\r
4024 UINT8 Type = 0x1;\r
4025 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
4026 EFI_GUID Guid = {0,};\r
4027 >>\r
30fdf114 4028 L:QuestionRefVal\r
2bcc713e
LG
4029 "\("\r
4030 {\r
e4ac870f 4031 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
4032 }\r
4033 {\r
4034 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
4035 }\r
4036 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4037 "\)"\r
4038 <<\r
4039 switch (Type) {\r
4040 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
4041 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
4042 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
4043 }\r
4044 $ExpOpCount++;\r
4045 >>\r
30fdf114
LG
4046 ;\r
4047\r
4048stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4049 L:StringRefVal\r
4050 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4051 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
4052 ;\r
4053\r
4054toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4055 L:BoolVal\r
4056 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4057 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
4058 ;\r
4059\r
4060tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4061 << UINT8 Fmt = 0; >>\r
4062 L:StringVal\r
4063 {\r
e4ac870f 4064 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
4065 }\r
4066 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4067 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
4068 ;\r
4069\r
4070unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4071 L:UnIntVal\r
4072 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4073 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
4074 ;\r
4075\r
4076toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4077 L:ToUpper\r
4078 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4079 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
4080 ;\r
4081\r
4082tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4083 L:ToLower\r
4084 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4085 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
4086 ;\r
4087\r
52302d4d
LG
4088setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4089 <<\r
4090 EFI_VARSTORE_INFO Info;\r
4091 CHAR8 *VarIdStr = NULL;\r
4092 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4093 UINT32 Mask = 0;\r
4094 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4095 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4096 UINT32 VarSize = 0;\r
4097 Info.mVarStoreId = 0;\r
4098 >>\r
4099 L:Set\r
4100 "\("\r
4101 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4102 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
4103 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4104 "\)"\r
4105 << \r
4106 {\r
4107 if (Info.mVarStoreId == 0) {\r
4108 // support Date/Time question\r
4109 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4110 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4111 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4112 }\r
4113 if (QType == QUESTION_DATE) {\r
4114 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4115 } else if (QType == QUESTION_TIME) {\r
4116 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4117 }\r
4118 switch (Mask) {\r
4119 case DATE_YEAR_BITMASK:\r
4120 Info.mInfo.mVarOffset = 0;\r
4121 break;\r
4122 case DATE_DAY_BITMASK:\r
4123 Info.mInfo.mVarOffset = 3;\r
4124 break;\r
4125 case TIME_HOUR_BITMASK:\r
4126 Info.mInfo.mVarOffset = 0;\r
4127 break;\r
4128 case TIME_MINUTE_BITMASK:\r
4129 Info.mInfo.mVarOffset = 1;\r
4130 break;\r
4131 case TIME_SECOND_BITMASK:\r
4132 Info.mInfo.mVarOffset = 2;\r
4133 break;\r
4134 default:\r
4135 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4136 break;\r
4137 }\r
4138 } else {\r
4139 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
4140 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4141 }\r
4142 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4143 Info.mVarType = VarType;\r
4144 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4145 Info.mVarTotalSize = VarSize;\r
4146 }\r
4147 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4148 if (VarSize != Info.mVarTotalSize) {\r
4149 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4150 }\r
4151 }\r
4152 CIfrSet TSObj(L->getLine()); \r
4153 TSObj.SetVarInfo (&Info); \r
4154 delete VarIdStr; \r
4155 $ExpOpCount++;\r
4156 }\r
4157 >>\r
4158 ;\r
4159\r
30fdf114
LG
4160vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4161 conditionalExp[$RootLevel, $ExpOpCount]\r
4162 | findExp[$RootLevel, $ExpOpCount]\r
4163 | midExp[$RootLevel, $ExpOpCount]\r
4164 | tokenExp[$RootLevel, $ExpOpCount]\r
4165 | spanExp[$RootLevel, $ExpOpCount]\r
4166 ;\r
4167\r
4168#token Cond("cond") "cond"\r
4169#token Find("find") "find"\r
4170#token Mid("mid") "mid"\r
4171#token Tok("token") "token"\r
4172#token Span("span") "span"\r
4173\r
4174conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4175 L:Cond "\("\r
4176 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4177 "?"\r
4178 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4179 ":"\r
4180 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4181 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
4182 ;\r
4183\r
4184findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4185 << UINT8 Format; >>\r
4186 L:Find "\("\r
4187 findFormat[Format] ( "\|" findFormat[Format] )*\r
4188 ","\r
4189 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4190 ","\r
4191 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4192 ","\r
4193 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4194 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
4195 ;\r
4196\r
4197findFormat [UINT8 & Format] :\r
4198 "SENSITIVE" << $Format = 0x00; >>\r
4199 | "INSENSITIVE" << $Format = 0x01; >>\r
4200 ;\r
4201\r
4202midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4203 L:Mid "\("\r
4204 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4205 ","\r
4206 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4207 ","\r
4208 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4209 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
4210 ;\r
4211\r
4212tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4213 L:Tok "\("\r
4214 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4215 ","\r
4216 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4217 ","\r
4218 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4219 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4220 ;\r
4221\r
4222spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4223 << UINT8 Flags = 0; >>\r
4224 S:Span "\("\r
4225 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4226 ","\r
4227 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4228 ","\r
4229 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4230 ","\r
4231 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4232 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4233 ;\r
4234\r
52302d4d
LG
4235vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4236 L:Map \r
4237 "\(" \r
4238 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4239 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4240 (\r
4241 vfrStatementExpression[0]\r
4242 ","\r
4243 vfrStatementExpression[0]\r
4244 ";"\r
4245 ) *\r
4246 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4247 ;\r
4248\r
30fdf114 4249spanFlags [UINT8 & Flags] :\r
e4ac870f 4250 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4251 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4252 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4253 ;\r
4254\r
4255#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4256#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4257\r
4258//******************************************************************************\r
4259//\r
4260// Parser class definition.\r
4261//\r
4262class EfiVfrParser {\r
4263<<\r
4264private:\r
4265 UINT8 mParserStatus;\r
4266 BOOLEAN mConstantOnlyInExpression;\r
4267\r
4268 CVfrDefaultStore mCVfrDefaultStore;\r
4269 CVfrDataStorage mCVfrDataStorage;\r
4270 CVfrQuestionDB mCVfrQuestionDB;\r
4271 CVfrRulesDB mCVfrRulesDB;\r
4272\r
52302d4d
LG
4273 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
4274 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
4275 UINT8 mCIfrOpHdrIndex;\r
30fdf114
LG
4276 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
4277 VOID _CLEAR_SAVED_OPHDR (VOID);\r
4278 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
4279\r
4280\r
4281 EFI_VARSTORE_INFO mCurrQestVarInfo;\r
4234283c 4282 EFI_GUID *mOverrideClassGuid;\r
4afd3d04
LG
4283 CHAR8* mLastFormEndAddr;\r
4284\r
4285//\r
4286// Whether the question already has default value.\r
4287//\r
4288 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
4289 UINT16 mUsedDefaultCount;\r
30fdf114
LG
4290\r
4291//\r
4292// For framework vfr compatibility\r
4293//\r
4294 BOOLEAN mCompatibleMode;\r
4295 EFI_GUID mFormsetGuid;\r
4296\r
4297 VOID _CRT_OP (IN BOOLEAN);\r
4298\r
4299 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
4300 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
4301\r
4302 UINT8 _GET_CURRQEST_DATATYPE ();\r
4303 UINT32 _GET_CURRQEST_VARSIZE ();\r
b303ea72 4304 UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
4afd3d04 4305 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
30fdf114
LG
4306\r
4307public:\r
52302d4d 4308 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
30fdf114
LG
4309 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
4310 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
4311 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
52302d4d 4312 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
30fdf114
LG
4313\r
4314 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
4315\r
4316 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
4317 CHAR8* _U32TOS (IN UINT32);\r
e4ac870f
LG
4318 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);\r
4319 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);\r
4320 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);\r
4321 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);\r
4322 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4323 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4324 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
4325\r
4326 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);\r
4327 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);\r
4328 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);\r
30fdf114 4329\r
52302d4d 4330 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
30fdf114 4331\r
30fdf114
LG
4332 VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
4333 VOID _DeclareStandardDefaultStorage (IN UINT32);\r
4334 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
4335\r
4336 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
4337\r
4338 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r
4339 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
4340 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
4341 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
4234283c 4342 VOID SetOverrideClassGuid (IN EFI_GUID *);\r
30fdf114
LG
4343//\r
4344// For framework vfr compatibility\r
4345//\r
4346 VOID SetCompatibleMode (IN BOOLEAN);\r
4347>>\r
4348}\r
4349\r
4350<<\r
4351VOID\r
4352EfiVfrParser::_SAVE_OPHDR_COND (\r
4353 IN CIfrOpHeader &OpHdr,\r
4354 IN BOOLEAN Cond,\r
4355 IN UINT32 LineNo\r
4356 )\r
4357{\r
4358 if (Cond == TRUE) {\r
52302d4d 4359 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
30fdf114
LG
4360 return ;\r
4361 }\r
52302d4d
LG
4362 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
4363 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
30fdf114
LG
4364 }\r
4365}\r
4366\r
4367VOID\r
4368EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
4369 VOID\r
4370 )\r
4371{\r
52302d4d
LG
4372 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
4373 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
30fdf114
LG
4374}\r
4375\r
4376BOOLEAN\r
4377EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
4378 VOID\r
4379 )\r
4380{\r
52302d4d
LG
4381 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
4382 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
30fdf114
LG
4383 return TRUE;\r
4384 }\r
52302d4d 4385\r
30fdf114
LG
4386 //\r
4387 // IfrOpHdr is not set, FALSE is return.\r
4388 //\r
4389 return FALSE;\r
4390}\r
4391\r
4392VOID\r
4393EfiVfrParser::_CRT_OP (\r
4394 IN BOOLEAN Crt\r
4395 )\r
4396{\r
4397 gCreateOp = Crt;\r
4398}\r
4399\r
4400VOID\r
4401EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
4402 IN EFI_VARSTORE_INFO &Info\r
4403 )\r
4404{\r
4405 mCurrQestVarInfo = Info;\r
4406}\r
4407\r
4408EFI_VARSTORE_INFO &\r
4409EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
4410 VOID\r
4411 )\r
4412{\r
4413 return mCurrQestVarInfo;\r
4414}\r
4415\r
b303ea72
LG
4416UINT32\r
4417EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
4418 VOID\r
4419 )\r
4420{\r
4421 UINT8 Size = 1;\r
4422\r
4423 switch (mCurrQestVarInfo.mVarType) {\r
4424 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4425 Size = 1;\r
4426 break;\r
4427\r
4428 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4429 Size = 2;\r
4430 break;\r
4431\r
4432 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4433 Size = 4;\r
4434 break;\r
4435\r
4436 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4437 Size = 8;\r
4438 break;\r
4439\r
4440 default:\r
4441 break;\r
4442 }\r
4443\r
4444 return (mCurrQestVarInfo.mVarTotalSize / Size);\r
4445}\r
4446\r
30fdf114
LG
4447UINT8\r
4448EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
4449 VOID\r
4450 )\r
4451{\r
4452 return mCurrQestVarInfo.mVarType;\r
4453}\r
4454\r
4455UINT32\r
4456EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
4457 VOID\r
4458 )\r
4459{\r
4460 return mCurrQestVarInfo.mVarTotalSize;\r
4461}\r
4462\r
4463VOID\r
4464EfiVfrParser::_PCATCH (\r
4465 IN INTN ReturnCode,\r
4466 IN INTN ExpectCode,\r
4467 IN ANTLRTokenPtr Tok,\r
52302d4d 4468 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4469 )\r
4470{\r
4471 if (ReturnCode != ExpectCode) {\r
4472 mParserStatus++;\r
4473 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r
4474 }\r
4475}\r
4476\r
4477VOID\r
4478EfiVfrParser::_PCATCH (\r
4479 IN EFI_VFR_RETURN_CODE ReturnCode\r
4480 )\r
4481{\r
52302d4d 4482 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
30fdf114
LG
4483}\r
4484\r
4485VOID\r
4486EfiVfrParser::_PCATCH (\r
4487 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4488 IN ANTLRTokenPtr Tok\r
4489 )\r
4490{\r
52302d4d 4491 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
30fdf114
LG
4492}\r
4493\r
4494VOID\r
4495EfiVfrParser::_PCATCH (\r
4496 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4497 IN UINT32 LineNum\r
4498 )\r
4499{\r
52302d4d 4500 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
30fdf114
LG
4501}\r
4502\r
4503VOID\r
4504EfiVfrParser::_PCATCH (\r
4505 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4506 IN UINT32 LineNum,\r
52302d4d 4507 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4508 )\r
4509{\r
52302d4d 4510 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
30fdf114
LG
4511}\r
4512\r
4513VOID\r
4514EfiVfrParser::syn (\r
4515 ANTLRAbstractToken *Tok,\r
4516 ANTLRChar *Egroup,\r
4517 SetWordType *Eset,\r
4518 ANTLRTokenType ETok,\r
4519 INT32 Huh\r
4520 )\r
4521{\r
4522 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
4523\r
4524 mParserStatus += 1;\r
4525}\r
4526\r
4527CHAR8 *\r
4528EfiVfrParser::TrimHex (\r
4529 IN CHAR8 *Str,\r
4530 OUT BOOLEAN *IsHex\r
4531 )\r
4532{\r
4533 *IsHex = FALSE;\r
4534\r
4535 while (*Str && *Str == ' ') {\r
4536 Str++;\r
4537 }\r
4538 while (*Str && *Str == '0') {\r
4539 Str++;\r
4540 }\r
4541 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
4542 Str++;\r
4543 *IsHex = TRUE;\r
4544 }\r
4545\r
4546 return Str;\r
4547}\r
4548\r
4549CHAR8 *\r
4550EfiVfrParser::_U32TOS (\r
4551 IN UINT32 Value\r
4552 )\r
4553{\r
4554 CHAR8 *Str;\r
4555 Str = new CHAR8[20];\r
4556 sprintf (Str, "%d", Value);\r
4557 return Str;\r
4558}\r
4559\r
4560UINT8\r
4561EfiVfrParser::_STOU8 (\r
e4ac870f
LG
4562 IN CHAR8 *Str,\r
4563 IN UINT32 LineNum\r
30fdf114
LG
4564 )\r
4565{\r
4566 BOOLEAN IsHex;\r
4567 UINT8 Value;\r
4568 CHAR8 c;\r
4569\r
e4ac870f
LG
4570 UINT8 PreviousValue;\r
4571 CHAR8 *OrigString = Str;\r
4572 CHAR8 ErrorMsg[100];\r
4573\r
30fdf114
LG
4574 Str = TrimHex (Str, &IsHex);\r
4575 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4576 PreviousValue = Value;\r
30fdf114
LG
4577 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4578\r
4579 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4580 Value += (c - 'a' + 10);\r
4581 }\r
4582 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4583 Value += (c - 'A' + 10);\r
4584 }\r
4585 if (c >= '0' && c <= '9') {\r
4586 Value += (c - '0');\r
4587 }\r
e4ac870f
LG
4588 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4589 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
4590 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4591 }\r
30fdf114
LG
4592 }\r
4593\r
4594 return Value;\r
4595}\r
4596\r
4597UINT16\r
4598EfiVfrParser::_STOU16 (\r
e4ac870f
LG
4599 IN CHAR8 *Str,\r
4600 IN UINT32 LineNum\r
30fdf114
LG
4601 )\r
4602{\r
4603 BOOLEAN IsHex;\r
4604 UINT16 Value;\r
4605 CHAR8 c;\r
4606\r
e4ac870f
LG
4607 UINT16 PreviousValue;\r
4608 CHAR8 *OrigString = Str;\r
4609 CHAR8 ErrorMsg[100];\r
4610\r
30fdf114
LG
4611 Str = TrimHex (Str, &IsHex);\r
4612 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4613 PreviousValue = Value;\r
30fdf114
LG
4614 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4615\r
4616 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4617 Value += (c - 'a' + 10);\r
4618 }\r
4619 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4620 Value += (c - 'A' + 10);\r
4621 }\r
4622 if (c >= '0' && c <= '9') {\r
4623 Value += (c - '0');\r
4624 }\r
e4ac870f
LG
4625 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4626 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
4627 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4628 }\r
30fdf114
LG
4629 }\r
4630\r
4631 return Value;\r
4632}\r
4633\r
4634UINT32\r
4635EfiVfrParser::_STOU32 (\r
e4ac870f
LG
4636 IN CHAR8 *Str,\r
4637 IN UINT32 LineNum\r
30fdf114
LG
4638 )\r
4639{\r
4640 BOOLEAN IsHex;\r
4641 UINT32 Value;\r
4642 CHAR8 c;\r
4643\r
e4ac870f
LG
4644 UINT32 PreviousValue;\r
4645 CHAR8 *OrigString = Str;\r
4646 CHAR8 ErrorMsg[100];\r
4647\r
30fdf114
LG
4648 Str = TrimHex (Str, &IsHex);\r
4649 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4650 PreviousValue = Value;\r
30fdf114
LG
4651 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4652\r
4653 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4654 Value += (c - 'a' + 10);\r
4655 }\r
4656 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4657 Value += (c - 'A' + 10);\r
4658 }\r
4659 if (c >= '0' && c <= '9') {\r
4660 Value += (c - '0');\r
4661 }\r
e4ac870f
LG
4662 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
4663 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
4664 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4665 }\r
30fdf114
LG
4666 }\r
4667\r
4668 return Value;\r
4669}\r
4670\r
4671UINT64\r
4672EfiVfrParser::_STOU64 (\r
e4ac870f
LG
4673 IN CHAR8 *Str,\r
4674 IN UINT32 LineNum\r
30fdf114
LG
4675 )\r
4676{\r
4677 BOOLEAN IsHex;\r
4678 UINT64 Value;\r
4679 CHAR8 c;\r
e4ac870f
LG
4680 UINT64 PreviousValue;\r
4681 CHAR8 *OrigString = Str;\r
4682 CHAR8 ErrorMsg[100];\r
30fdf114
LG
4683\r
4684 Str = TrimHex (Str, &IsHex);\r
4685 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4686 PreviousValue = Value;\r
30fdf114
LG
4687 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4688\r
4689 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4690 Value += (c - 'a' + 10);\r
4691 }\r
4692 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4693 Value += (c - 'A' + 10);\r
4694 }\r
4695 if (c >= '0' && c <= '9') {\r
4696 Value += (c - '0');\r
4697 }\r
e4ac870f
LG
4698 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
4699 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
4700 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4701 }\r
30fdf114
LG
4702 }\r
4703\r
4704 return Value;\r
4705}\r
4706\r
4707EFI_HII_DATE\r
4708EfiVfrParser::_STOD (\r
4709 IN CHAR8 *Year,\r
4710 IN CHAR8 *Month,\r
e4ac870f
LG
4711 IN CHAR8 *Day,\r
4712 IN UINT32 LineNum\r
30fdf114
LG
4713 )\r
4714{\r
4715 EFI_HII_DATE Date;\r
4716\r
e4ac870f
LG
4717 Date.Year = _STOU16 (Year, LineNum);\r
4718 Date.Month = _STOU8 (Month, LineNum);\r
4719 Date.Day = _STOU8 (Day, LineNum);\r
30fdf114
LG
4720\r
4721 return Date;\r
4722}\r
4723\r
4724EFI_HII_TIME\r
4725EfiVfrParser::_STOT (\r
4726 IN CHAR8 *Hour,\r
4727 IN CHAR8 *Minute,\r
e4ac870f
LG
4728 IN CHAR8 *Second,\r
4729 IN UINT32 LineNum\r
30fdf114
LG
4730 )\r
4731{\r
4732 EFI_HII_TIME Time;\r
4733\r
e4ac870f
LG
4734 Time.Hour = _STOU8 (Hour, LineNum);\r
4735 Time.Minute = _STOU8 (Minute, LineNum);\r
4736 Time.Second = _STOU8 (Second, LineNum);\r
30fdf114
LG
4737\r
4738 return Time;\r
4739}\r
4740\r
4741EFI_STRING_ID\r
4742EfiVfrParser::_STOSID (\r
e4ac870f
LG
4743 IN CHAR8 *Str,\r
4744 IN UINT32 LineNum\r
30fdf114
LG
4745 )\r
4746{\r
e4ac870f 4747 return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4748}\r
4749\r
4750EFI_FORM_ID\r
4751EfiVfrParser::_STOFID (\r
e4ac870f
LG
4752 IN CHAR8 *Str,\r
4753 IN UINT32 LineNum\r
30fdf114
LG
4754 )\r
4755{\r
e4ac870f 4756 return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4757}\r
4758\r
4759EFI_QUESTION_ID\r
4760EfiVfrParser::_STOQID (\r
e4ac870f
LG
4761 IN CHAR8 *Str,\r
4762 IN UINT32 LineNum\r
30fdf114
LG
4763 )\r
4764{\r
e4ac870f 4765 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4766}\r
4767\r
4768VOID\r
4769EfiVfrParser::_STRCAT (\r
4770 IN OUT CHAR8 **Dest,\r
52302d4d 4771 IN CONST CHAR8 *Src\r
30fdf114
LG
4772 )\r
4773{\r
4774 CHAR8 *NewStr;\r
4775 UINT32 Len;\r
4776\r
4777 if ((Dest == NULL) || (Src == NULL)) {\r
4778 return;\r
4779 }\r
4780\r
4781 Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
4782 Len += strlen (Src);\r
4783 if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r
4784 return;\r
4785 }\r
4786 NewStr[0] = '\0';\r
4787 if (*Dest != NULL) {\r
4788 strcpy (NewStr, *Dest);\r
4789 delete *Dest;\r
4790 }\r
4791 strcat (NewStr, Src);\r
4792\r
4793 *Dest = NewStr;\r
4794}\r
4795\r
4234283c
LG
4796EFI_HII_REF\r
4797EfiVfrParser::_STOR (\r
4798 IN CHAR8 *QuestionId,\r
4799 IN CHAR8 *FormId,\r
4800 IN EFI_GUID *FormSetGuid,\r
e4ac870f
LG
4801 IN CHAR8 *DevicePath,\r
4802 IN UINT32 LineNum\r
4234283c
LG
4803 )\r
4804{\r
4805 EFI_HII_REF Ref;\r
4806 UINT32 Index;\r
4807\r
4808 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
e4ac870f
LG
4809 Ref.QuestionId = _STOQID (QuestionId, LineNum);\r
4810 Ref.FormId = _STOFID (FormId, LineNum);\r
4811 Ref.DevicePath = _STOSID (DevicePath, LineNum);\r
4234283c
LG
4812\r
4813 return Ref;\r
4814}\r
4815\r
30fdf114
LG
4816//\r
4817// framework vfr to default declare varstore for each structure\r
4818//\r
4819VOID\r
4820EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
4821 IN UINT32 LineNo\r
4822 )\r
4823{\r
4824 SVfrVarStorageNode *pNode;\r
4825 UINT32 TypeSize;\r
4826 BOOLEAN FirstNode;\r
52302d4d 4827 CONST CHAR8 VarName[] = "Setup";\r
30fdf114
LG
4828\r
4829 FirstNode = TRUE;\r
4830 pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
4831 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
4832 //\r
4833 // Create the default Buffer Var Store when no VarStore is defined.\r
4834 // its name should be "Setup"\r
4835 //\r
4836 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
4837 CIfrVarStore VSObj;\r
4838 VSObj.SetLineNo (LineNo);\r
4839 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
52302d4d 4840 VSObj.SetSize ((UINT16) TypeSize);\r
30fdf114 4841 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
52302d4d 4842 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4843 VSObj.SetGuid (&mFormsetGuid);\r
4844#ifdef VFREXP_DEBUG\r
4845 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
4846#endif\r
4847 } else {\r
4848 for (; pNode != NULL; pNode = pNode->mNext) {\r
4849 //\r
4850 // create the default varstore opcode for not declared varstore\r
4851 // the first varstore name should be "Setup"\r
4852 //\r
4853 if (!pNode->mAssignedFlag) {\r
4854 CIfrVarStore VSObj;\r
4855 VSObj.SetLineNo (LineNo);\r
4856 VSObj.SetVarStoreId (pNode->mVarStoreId);\r
52302d4d 4857 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
30fdf114 4858 if (FirstNode) {\r
52302d4d 4859 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4860 FirstNode = FALSE;\r
4861 } else {\r
4862 VSObj.SetName (pNode->mVarStoreName);\r
4863 }\r
4864 VSObj.SetGuid (&pNode->mGuid);\r
4865#ifdef VFREXP_DEBUG\r
4866 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4867#endif\r
4868 }\r
4869 }\r
4870 }\r
4871\r
4872 pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
4873 for (; pNode != NULL; pNode = pNode->mNext) {\r
4874 //\r
4875 // create the default efi varstore opcode for not exist varstore\r
4876 //\r
4877 if (!pNode->mAssignedFlag) {\r
4878 CIfrVarStoreEfi VSEObj;\r
4879 VSEObj.SetLineNo (LineNo);\r
4880 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
4881 VSEObj.SetGuid (&pNode->mGuid);\r
4882 VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
4234283c
LG
4883 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
4884 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
4885 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
30fdf114
LG
4886#ifdef VFREXP_DEBUG\r
4887 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4888#endif\r
4889 }\r
4890 }\r
4891\r
4892}\r
4893\r
4894VOID\r
4895EfiVfrParser::_DeclareDefaultLinearVarStore (\r
4896 IN UINT32 LineNo\r
4897 )\r
4898{\r
4899 UINT32 Index;\r
4900 CHAR8 **TypeNameList;\r
4901 UINT32 ListSize;\r
52302d4d
LG
4902 CONST CHAR8 DateName[] = "Date";\r
4903 CONST CHAR8 TimeName[] = "Time";\r
4904 CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
4905 CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
30fdf114
LG
4906\r
4907 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
4908\r
4909 for (Index = 0; Index < ListSize; Index++) {\r
4910 UINT32 Size;\r
4911 EFI_VARSTORE_ID VarStoreId;\r
4912 CIfrVarStore VSObj;\r
4913\r
4914 VSObj.SetLineNo (LineNo);\r
4915 mCVfrDataStorage.DeclareBufferVarStore (\r
4916 TypeNameList[Index],\r
4917 &mFormsetGuid,\r
4918 &gCVfrVarDataTypeDB,\r
4919 TypeNameList[Index],\r
4920 EFI_VARSTORE_ID_INVALID\r
4921 );\r
4afd3d04 4922 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
30fdf114
LG
4923 VSObj.SetVarStoreId (VarStoreId);\r
4924 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
52302d4d 4925 VSObj.SetSize ((UINT16) Size);\r
30fdf114
LG
4926 VSObj.SetName (TypeNameList[Index]);\r
4927 VSObj.SetGuid (&mFormsetGuid);\r
4928 }\r
4929\r
4930//\r
4931// not required to declare Date and Time VarStore,\r
4932// because code to support old format Data and Time\r
4933//\r
52302d4d 4934 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
30fdf114
LG
4935 UINT32 Size;\r
4936 EFI_VARSTORE_ID VarStoreId;\r
4937 CIfrVarStore VSObj;\r
4938\r
4939 VSObj.SetLineNo (LineNo);\r
4940 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4941 (CHAR8 *) DateName,\r
30fdf114
LG
4942 &mFormsetGuid,\r
4943 &gCVfrVarDataTypeDB,\r
52302d4d 4944 (CHAR8 *) DateType,\r
30fdf114
LG
4945 EFI_VARSTORE_ID_INVALID\r
4946 );\r
4afd3d04 4947 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4948 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4949 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
4950 VSObj.SetSize ((UINT16) Size);\r
4951 VSObj.SetName ((CHAR8 *) DateName);\r
30fdf114
LG
4952 VSObj.SetGuid (&mFormsetGuid);\r
4953 }\r
4954\r
52302d4d 4955 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
30fdf114
LG
4956 UINT32 Size;\r
4957 EFI_VARSTORE_ID VarStoreId;\r
4958 CIfrVarStore VSObj;\r
4959\r
4960 VSObj.SetLineNo (LineNo);\r
4961 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4962 (CHAR8 *) TimeName,\r
30fdf114
LG
4963 &mFormsetGuid,\r
4964 &gCVfrVarDataTypeDB,\r
52302d4d 4965 (CHAR8 *) TimeType,\r
30fdf114
LG
4966 EFI_VARSTORE_ID_INVALID\r
4967 );\r
4afd3d04 4968 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4969 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4970 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
4971 VSObj.SetSize ((UINT16) Size);\r
4972 VSObj.SetName ((CHAR8 *) TimeName);\r
30fdf114
LG
4973 VSObj.SetGuid (&mFormsetGuid);\r
4974 }\r
4975}\r
4976\r
4977VOID\r
4978EfiVfrParser::_DeclareStandardDefaultStorage (\r
4979 IN UINT32 LineNo\r
4980 )\r
4981{\r
4982 //\r
4983 // Default Store is declared.\r
4984 //\r
4985 CIfrDefaultStore DSObj;\r
4986\r
52302d4d 4987 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
30fdf114
LG
4988 DSObj.SetLineNo (LineNo);\r
4989 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
4990 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
4991\r
4992 //\r
4993 // Default MANUFACTURING Store is declared.\r
4994 //\r
4995 CIfrDefaultStore DSObjMF;\r
4996\r
52302d4d 4997 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
30fdf114
LG
4998 DSObjMF.SetLineNo (LineNo);\r
4999 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
5000 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
5001}\r
5002\r
5003VOID\r
5004EfiVfrParser::AssignQuestionKey (\r
5005 IN CIfrQuestionHeader &QHObj,\r
5006 IN ANTLRTokenPtr KeyTok\r
5007 )\r
5008{\r
5009 UINT16 KeyValue;\r
5010\r
5011 if (KeyTok == NULL) {\r
5012 return;\r
5013 }\r
5014\r
e4ac870f 5015 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
30fdf114
LG
5016\r
5017 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
5018 /*\r
5019 * if the question is not CALLBACK ignore the key.\r
5020 */\r
5021 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
5022 QHObj.SetQuestionId (KeyValue);\r
5023 }\r
5024}\r
5025\r
5026VOID\r
5027EfiVfrParser::ConvertIdExpr (\r
5028 IN UINT32 &ExpOpCount,\r
5029 IN UINT32 LineNo,\r
5030 IN EFI_QUESTION_ID QId,\r
5031 IN CHAR8 *VarIdStr,\r
5032 IN UINT32 BitMask\r
5033 )\r
5034{\r
5035 CIfrQuestionRef1 QR1Obj(LineNo);\r
5036 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
5037 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
5038\r
5039 if (BitMask != 0) {\r
5040 CIfrUint32 U32Obj(LineNo);\r
5041 U32Obj.SetValue (BitMask);\r
5042\r
5043 CIfrBitWiseAnd BWAObj(LineNo);\r
5044\r
5045 CIfrUint8 U8Obj(LineNo);\r
5046 switch (BitMask) {\r
5047 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r
5048 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
5049 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r
5050 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r
5051 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
5052 }\r
5053\r
5054 CIfrShiftRight SRObj(LineNo);\r
5055 }\r
5056\r
5057 ExpOpCount += 4;\r
5058}\r
5059\r
5060VOID\r
5061EfiVfrParser::IdEqValDoSpecial (\r
5062 IN UINT32 &ExpOpCount,\r
5063 IN UINT32 LineNo,\r
5064 IN EFI_QUESTION_ID QId,\r
5065 IN CHAR8 *VarIdStr,\r
5066 IN UINT32 BitMask,\r
5067 IN UINT16 ConstVal,\r
5068 IN EFI_COMPARE_TYPE CompareType\r
5069 )\r
5070{\r
5071 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
5072\r
5073 if (ConstVal > 0xFF) {\r
5074 CIfrUint16 U16Obj(LineNo);\r
5075 U16Obj.SetValue (ConstVal);\r
5076 } else {\r
5077 CIfrUint8 U8Obj(LineNo);\r
5078 U8Obj.SetValue ((UINT8)ConstVal);\r
5079 }\r
5080\r
5081 switch (CompareType) {\r
5082 case EQUAL :\r
5083 {\r
5084 CIfrEqual EObj(LineNo);\r
5085 break;\r
5086 }\r
5087 case LESS_EQUAL :\r
5088 {\r
5089 CIfrLessEqual LEObj(LineNo);\r
5090 break;\r
5091 }\r
5092 case LESS_THAN :\r
5093 {\r
5094 CIfrLessThan LTObj(LineNo);\r
5095 break;\r
5096 }\r
5097 case GREATER_EQUAL :\r
5098 {\r
5099 CIfrGreaterEqual GEObj(LineNo);\r
5100 break;\r
5101 }\r
5102 case GREATER_THAN :\r
5103 {\r
5104 CIfrGreaterThan GTObj(LineNo);\r
5105 break;\r
5106 }\r
5107 }\r
5108\r
5109 ExpOpCount += 2;\r
5110}\r
5111\r
5112VOID\r
5113EfiVfrParser::IdEqIdDoSpecial (\r
5114 IN UINT32 &ExpOpCount,\r
5115 IN UINT32 LineNo,\r
5116 IN EFI_QUESTION_ID QId1,\r
5117 IN CHAR8 *VarId1Str,\r
5118 IN UINT32 BitMask1,\r
5119 IN EFI_QUESTION_ID QId2,\r
5120 IN CHAR8 *VarId2Str,\r
5121 IN UINT32 BitMask2,\r
5122 IN EFI_COMPARE_TYPE CompareType\r
5123 )\r
5124{\r
5125 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
5126 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
5127\r
5128 switch (CompareType) {\r
5129 case EQUAL :\r
5130 {\r
5131 CIfrEqual EObj(LineNo);\r
5132 break;\r
5133 }\r
5134 case LESS_EQUAL :\r
5135 {\r
5136 CIfrLessEqual LEObj(LineNo);\r
5137 break;\r
5138 }\r
5139 case LESS_THAN :\r
5140 {\r
5141 CIfrLessThan LTObj(LineNo);\r
5142 break;\r
5143 }\r
5144 case GREATER_EQUAL :\r
5145 {\r
5146 CIfrGreaterEqual GEObj(LineNo);\r
5147 break;\r
5148 }\r
5149 case GREATER_THAN :\r
5150 {\r
5151 CIfrGreaterThan GTObj(LineNo);\r
5152 break;\r
5153 }\r
5154 }\r
5155\r
5156 ExpOpCount++;\r
5157}\r
5158\r
5159VOID\r
5160EfiVfrParser::IdEqListDoSpecial (\r
5161 IN UINT32 &ExpOpCount,\r
5162 IN UINT32 LineNo,\r
5163 IN EFI_QUESTION_ID QId,\r
5164 IN CHAR8 *VarIdStr,\r
5165 IN UINT32 BitMask,\r
5166 IN UINT16 ListLen,\r
5167 IN UINT16 *ValueList\r
5168 )\r
5169{\r
5170 UINT16 Index;\r
5171\r
5172 if (ListLen == 0) {\r
5173 return;\r
5174 }\r
5175\r
5176 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
5177 for (Index = 1; Index < ListLen; Index++) {\r
5178 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
5179 CIfrOr OObj (LineNo);\r
5180 ExpOpCount++;\r
5181 }\r
5182}\r
5183\r
4234283c
LG
5184VOID \r
5185EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
5186{\r
5187 mOverrideClassGuid = OverrideClassGuid;\r
5188}\r
5189\r
30fdf114
LG
5190//\r
5191// For framework vfr compatibility\r
5192//\r
5193VOID\r
5194EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
5195{\r
5196 mCompatibleMode = Mode;\r
5197 mCVfrQuestionDB.SetCompatibleMode (Mode);\r
5198}\r
4afd3d04
LG
5199\r
5200VOID\r
5201EfiVfrParser::CheckDuplicateDefaultValue (\r
5202 IN EFI_DEFAULT_ID DefaultId,\r
5203 IN ANTLRTokenPtr Tok\r
5204 )\r
5205{\r
5206 UINT16 Index;\r
5207\r
5208 for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
5209 if (mUsedDefaultArray[Index] == DefaultId) {\r
5210 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
5211 }\r
5212 }\r
5213\r
5214 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
5215 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
5216 }\r
5217\r
5218 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
5219}\r
30fdf114 5220>>\r