]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: Enable Match2 Opcode.
[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
5d377616 3404#token Match2("match2") "match2"\r
30fdf114
LG
3405#token Catenate("catenate") "catenate"\r
3406#token QuestionRefVal("questionrefval") "questionrefval"\r
3407#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3408#token Map("map") "map"\r
4234283c 3409#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3410\r
3411//\r
3412// Root expression extension function called by other function.\r
3413//\r
3414vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3415 << 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
3416 andTerm[$RootLevel, $ExpOpCount]\r
3417 (\r
3418 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3419 )*\r
3420 <<\r
3421 //\r
3422 // Extend OpCode Scope only for the root expression.\r
3423 //\r
3424 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3425 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3426 CIfrEnd EObj;\r
52302d4d
LG
3427 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3428 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3429 }\r
3430 }\r
3431 }\r
52302d4d
LG
3432 \r
3433 if ($RootLevel == 0) {\r
3434 mCIfrOpHdrIndex --;\r
3435 }\r
30fdf114
LG
3436 >>\r
3437 ;\r
3438\r
3439//\r
3440// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3441// This funciton is only called by sub expression.\r
3442//\r
3443vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3444 andTerm[$RootLevel, $ExpOpCount]\r
3445 (\r
3446 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3447 )*\r
3448 ;\r
3449\r
3450andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3451 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3452 (\r
3453 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3454 )*\r
3455 ;\r
3456\r
3457bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3458 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3459 (\r
3460 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3461 )*\r
3462 ;\r
3463\r
3464bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3465 equalTerm[$RootLevel, $ExpOpCount]\r
3466 (\r
3467 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3468 )*\r
3469 ;\r
3470\r
3471equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3472 compareTerm[$RootLevel, $ExpOpCount]\r
3473 (\r
3474 (\r
3475 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3476 )\r
3477 |\r
3478 (\r
3479 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3480 )\r
3481 )*\r
3482 ;\r
3483\r
3484compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3485 shiftTerm[$RootLevel, $ExpOpCount]\r
3486 (\r
3487 (\r
3488 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3489 )\r
3490 |\r
3491 (\r
3492 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3493 )\r
3494 |\r
3495 (\r
3496 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3497 )\r
3498 |\r
3499 (\r
3500 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3501 )\r
3502 )*\r
3503 ;\r
3504\r
3505shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3506 addMinusTerm[$RootLevel, $ExpOpCount]\r
3507 (\r
3508 (\r
3509 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3510 )\r
3511 |\r
3512 (\r
3513 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3514 )\r
3515 )*\r
3516 ;\r
3517\r
3518addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3519 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3520 (\r
3521 (\r
3522 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3523 )\r
3524 |\r
3525 (\r
3526 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3527 )\r
3528 )*\r
3529 ;\r
3530\r
3531multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3532 castTerm[$RootLevel, $ExpOpCount]\r
3533 (\r
3534 (\r
3535 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3536 )\r
3537 |\r
3538 (\r
3539 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3540 )\r
3541 |\r
3542 (\r
3543 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3544 )\r
3545 )*\r
3546 ;\r
3547\r
3548castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3549 << UINT8 CastType = 0xFF; >>\r
3550 (\r
3551 L:"\("\r
3552 (\r
3553 Boolean << CastType = 0; >>\r
3554 | Uint64 << CastType = 1; >>\r
3555 | Uint32 << CastType = 1; >>\r
3556 | Uint16 << CastType = 1; >>\r
3557 | Uint8 << CastType = 1; >>\r
3558 )\r
3559 "\)"\r
3560 )*\r
3561 atomTerm[$RootLevel, $ExpOpCount]\r
3562 <<\r
3563 switch (CastType) {\r
3564 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3565 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3566 }\r
3567 >>\r
3568 ;\r
3569\r
3570atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3571 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3572 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
5d377616 3573 | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3574 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3575 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3576 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3577 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3578 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3579 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3580 | (\r
3581 L:NOT\r
3582 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3583 )\r
3584 ;\r
3585\r
3586vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3587 L:Catenate\r
3588 "\("\r
3589 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3590 ","\r
3591 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3592 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3593 ;\r
3594\r
3595vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3596 L:Match\r
3597 "\("\r
3598 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3599 ","\r
3600 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3601 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3602 ;\r
3603\r
5d377616
ED
3604vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3605 <<\r
3606 EFI_GUID Guid;\r
3607 >>\r
3608 L:Match2\r
3609 "\("\r
3610 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3611 ","\r
3612 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3613 ","\r
3614 guidDefinition[Guid]\r
3615 "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
3616 ;\r
3617\r
30fdf114
LG
3618vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3619 "\("\r
3620 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3621 "\)"\r
3622 ;\r
3623\r
3624vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3625 dupExp[$RootLevel, $ExpOpCount]\r
3626 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3627 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3628 | ideqidExp[$RootLevel, $ExpOpCount]\r
3629 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3630 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3631 | rulerefExp[$RootLevel, $ExpOpCount]\r
3632 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3633 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3634 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3635 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3636 ;\r
3637\r
3638dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3639 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3640 ;\r
3641\r
3642vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3643 <<\r
3644 EFI_QUESTION_ID QId;\r
3645 UINT32 Mask;\r
3646 UINT16 ConstVal;\r
3647 CHAR8 *VarIdStr;\r
3648 UINT32 LineNo;\r
30fdf114 3649 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3650 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3651 >>\r
3652 L:VarEqVal <<\r
3653 if (!mCompatibleMode) {\r
3654 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3655 }\r
3656 >>\r
3657 VK:Var\r
3658 OpenParen\r
3659 VN:Number <<\r
3660 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
4afd3d04 3661 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114
LG
3662 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
3663 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
3664 VarIdStr,\r
3665 &mFormsetGuid,\r
e4ac870f 3666 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3667 0x2, //default type is UINT16\r
3668 FALSE\r
3669 ), VN);\r
3670 } else {\r
3671 _PCATCH (VfrReturnCode, VN);\r
3672 }\r
3673 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3674 LineNo = GET_LINENO(VN);\r
3675 >>\r
3676 CloseParen\r
3677 (\r
3678 (\r
3679 "=="\r
e4ac870f 3680 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3681 <<\r
3682 if (Mask == 0) {\r
3683 CIfrEqIdVal EIVObj (L->getLine());\r
3684 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3685 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3686 EIVObj.SetValue (ConstVal);\r
3687 $ExpOpCount++;\r
3688 } else {\r
3689 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3690 }\r
3691 >>\r
3692 )\r
3693 |\r
3694 (\r
3695 "<="\r
e4ac870f 3696 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3697 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3698 )\r
3699 |\r
3700 (\r
3701 "<"\r
e4ac870f 3702 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3703 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3704 )\r
3705 |\r
3706 (\r
3707 ">="\r
e4ac870f 3708 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3709 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3710 )\r
3711 |\r
3712 (\r
3713 ">"\r
e4ac870f 3714 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3715 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3716 )\r
3717 )\r
3718 ;\r
3719\r
3720ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3721 <<\r
3722 EFI_QUESTION_ID QId;\r
3723 UINT32 Mask;\r
3724 UINT16 ConstVal;\r
3725 CHAR8 *VarIdStr;\r
3726 UINT32 LineNo;\r
3727 >>\r
3728 L:IdEqVal\r
3729 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3730 (\r
3731 (\r
3732 "=="\r
e4ac870f 3733 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3734 <<\r
3735 if (Mask == 0) {\r
3736 CIfrEqIdVal EIVObj (L->getLine());\r
3737 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3738 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3739 EIVObj.SetValue (ConstVal);\r
3740 $ExpOpCount++;\r
3741 } else {\r
3742 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3743 }\r
3744 >>\r
3745 )\r
3746 |\r
3747 (\r
3748 "<="\r
e4ac870f 3749 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3750 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3751 )\r
3752 |\r
3753 (\r
3754 "<"\r
e4ac870f 3755 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3756 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3757 )\r
3758 |\r
3759 (\r
3760 ">="\r
e4ac870f 3761 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3762 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3763 )\r
3764 |\r
3765 (\r
3766 ">"\r
e4ac870f 3767 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3768 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3769 )\r
3770 )\r
3771 ;\r
3772\r
3773ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3774 <<\r
3775 EFI_QUESTION_ID QId[2];\r
3776 UINT32 Mask[2];\r
3777 CHAR8 *VarIdStr[2];\r
3778 UINT32 LineNo[2];\r
3779 >>\r
3780 L:IdEqId\r
3781 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
3782 (\r
3783 (\r
3784 "=="\r
3785 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3786 <<\r
3787 if (Mask[0] & Mask[1]) {\r
3788 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
3789 } else {\r
3790 CIfrEqIdId EIIObj(L->getLine());\r
3791 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
3792 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
3793 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
3794 $ExpOpCount++;\r
3795 }\r
3796 >>\r
3797 )\r
3798 |\r
3799 (\r
3800 "<="\r
3801 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3802 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
3803 )\r
3804 |\r
3805 (\r
3806 "<"\r
3807 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3808 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
3809 )\r
3810 |\r
3811 (\r
3812 ">="\r
3813 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3814 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
3815 )\r
3816 |\r
3817 (\r
3818 ">"\r
3819 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3820 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
3821 )\r
3822 )\r
3823 ;\r
3824\r
3825ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3826 <<\r
3827 UINT16 ListLen = 0;\r
3828 EFI_QUESTION_ID QId;\r
3829 UINT32 Mask;\r
3830 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3831 CHAR8 *VarIdStr;\r
3832 UINT32 LineNo;\r
3833 >>\r
3834 L:IdEqValList\r
3835 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3836 "=="\r
3837 (\r
e4ac870f 3838 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
3839 )+\r
3840 <<\r
3841 if (Mask != 0) {\r
3842 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
3843 } else {\r
3844 UINT16 Index;\r
3845 CIfrEqIdList EILObj(L->getLine());\r
3846 if (QId != EFI_QUESTION_ID_INVALID) {\r
3847 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3848 }\r
3849 EILObj.SetListLength (ListLen);\r
3850 for (Index = 0; Index < ListLen; Index++) {\r
3851 EILObj.SetValueList (Index, ValueList[Index]);\r
3852 }\r
3853 \r
3854 EILObj.UpdateIfrBuffer();\r
3855 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
3856 \r
3857 if (QId == EFI_QUESTION_ID_INVALID) {\r
3858 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3859 }\r
3860 $ExpOpCount++;\r
3861 }\r
3862 >>\r
3863 ;\r
3864\r
2bcc713e 3865questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 3866 <<\r
30fdf114
LG
3867 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3868 UINT32 BitMask;\r
3869 CHAR8 *QName = NULL;\r
3870 UINT32 LineNo = 0;\r
3871 >>\r
3872 L:QuestionRef\r
2bcc713e
LG
3873 "\("\r
3874 (\r
30fdf114
LG
3875 QN:StringIdentifier <<\r
3876 QName = QN->getText();\r
2bcc713e 3877 LineNo = QN->getLine();\r
30fdf114
LG
3878 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
3879 >>\r
e4ac870f 3880 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 3881 )\r
2bcc713e 3882 "\)"\r
30fdf114 3883 <<\r
2bcc713e 3884 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
3885 ;\r
3886\r
3887rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3888 L:RuleRef\r
3889 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
3890 ;\r
3891\r
3892//******************************************************\r
3893// PARSE:\r
3894// stringref (STR_FORM_SET_TITLE)\r
3895//\r
3896stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
3897 <<\r
3898 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
3899 >>\r
30fdf114 3900 L:StringRef\r
52302d4d
LG
3901 "\("\r
3902 ( \r
3903 "STRING_TOKEN"\r
3904 "\(" \r
e4ac870f 3905 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 3906 "\)"\r
e4ac870f 3907 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
3908 )\r
3909 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
3910 ;\r
3911\r
3912pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3913 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3914 ;\r
3915\r
a709adfa
LG
3916securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3917 <<\r
3918 EFI_GUID Guid;\r
3919 >>\r
3920 L:Security\r
3921 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
3922 ;\r
3923\r
52302d4d
LG
3924numericVarStoreType [UINT8 & VarType] :\r
3925 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
3926 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
3927 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
3928 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
3929 ;\r
3930\r
3931getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3932 <<\r
3933 EFI_VARSTORE_INFO Info;\r
3934 CHAR8 *VarIdStr = NULL;\r
3935 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3936 UINT32 Mask = 0;\r
3937 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3938 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3939 UINT32 VarSize = 0;\r
3940 Info.mVarStoreId = 0;\r
3941 >>\r
3942 L:Get\r
3943 "\(" \r
3944 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3945 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
3946 "\)" << \r
3947 {\r
3948 if (Info.mVarStoreId == 0) {\r
3949 // support Date/Time question\r
3950 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3951 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3952 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3953 }\r
3954 if (QType == QUESTION_DATE) {\r
3955 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3956 } else if (QType == QUESTION_TIME) {\r
3957 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3958 }\r
3959 switch (Mask) {\r
3960 case DATE_YEAR_BITMASK:\r
3961 Info.mInfo.mVarOffset = 0;\r
3962 break;\r
3963 case DATE_DAY_BITMASK:\r
3964 Info.mInfo.mVarOffset = 3;\r
3965 break;\r
3966 case TIME_HOUR_BITMASK:\r
3967 Info.mInfo.mVarOffset = 0;\r
3968 break;\r
3969 case TIME_MINUTE_BITMASK:\r
3970 Info.mInfo.mVarOffset = 1;\r
3971 break;\r
3972 case TIME_SECOND_BITMASK:\r
3973 Info.mInfo.mVarOffset = 2;\r
3974 break;\r
3975 default:\r
3976 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3977 break;\r
3978 }\r
3979 } else {\r
3980 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3981 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3982 }\r
3983 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3984 Info.mVarType = VarType;\r
3985 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3986 Info.mVarTotalSize = VarSize;\r
3987 }\r
3988 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3989 if (VarSize != Info.mVarTotalSize) {\r
3990 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
3991 }\r
3992 }\r
3993 CIfrGet GObj(L->getLine()); \r
3994 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
3995 GObj.SetVarInfo (&Info); \r
3996 delete VarIdStr; \r
3997 $ExpOpCount++;\r
3998 }\r
3999 >>\r
4000 ;\r
4001\r
30fdf114
LG
4002vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4003 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
4004 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
4005 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
4006 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
4007 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
4008 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
4009 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 4010 | 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
4011 ;\r
4012\r
4013vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4014 lengthExp[$RootLevel, $ExpOpCount]\r
4015 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 4016 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4017 | stringref2Exp[$RootLevel, $ExpOpCount]\r
4018 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 4019 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4020 | unintExp[$RootLevel, $ExpOpCount]\r
4021 | toupperExp[$RootLevel, $ExpOpCount]\r
4022 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 4023 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4024 ;\r
4025\r
4026lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4027 L:Length\r
4028 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4029 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
4030 ;\r
4031\r
4032bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4033 L:BitWiseNot\r
4034 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4035 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
4036 ;\r
4037\r
2bcc713e
LG
4038question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4039 <<\r
4040 UINT8 Type = 0x1;\r
4041 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
4042 EFI_GUID Guid = {0,};\r
4043 >>\r
30fdf114 4044 L:QuestionRefVal\r
2bcc713e
LG
4045 "\("\r
4046 {\r
e4ac870f 4047 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
4048 }\r
4049 {\r
4050 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
4051 }\r
4052 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4053 "\)"\r
4054 <<\r
4055 switch (Type) {\r
4056 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
4057 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
4058 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
4059 }\r
4060 $ExpOpCount++;\r
4061 >>\r
30fdf114
LG
4062 ;\r
4063\r
4064stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4065 L:StringRefVal\r
4066 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4067 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
4068 ;\r
4069\r
4070toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4071 L:BoolVal\r
4072 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4073 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
4074 ;\r
4075\r
4076tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4077 << UINT8 Fmt = 0; >>\r
4078 L:StringVal\r
4079 {\r
e4ac870f 4080 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
4081 }\r
4082 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4083 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
4084 ;\r
4085\r
4086unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4087 L:UnIntVal\r
4088 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4089 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
4090 ;\r
4091\r
4092toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4093 L:ToUpper\r
4094 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4095 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
4096 ;\r
4097\r
4098tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4099 L:ToLower\r
4100 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4101 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
4102 ;\r
4103\r
52302d4d
LG
4104setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4105 <<\r
4106 EFI_VARSTORE_INFO Info;\r
4107 CHAR8 *VarIdStr = NULL;\r
4108 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4109 UINT32 Mask = 0;\r
4110 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4111 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4112 UINT32 VarSize = 0;\r
4113 Info.mVarStoreId = 0;\r
4114 >>\r
4115 L:Set\r
4116 "\("\r
4117 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4118 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
4119 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4120 "\)"\r
4121 << \r
4122 {\r
4123 if (Info.mVarStoreId == 0) {\r
4124 // support Date/Time question\r
4125 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4126 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4127 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4128 }\r
4129 if (QType == QUESTION_DATE) {\r
4130 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4131 } else if (QType == QUESTION_TIME) {\r
4132 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4133 }\r
4134 switch (Mask) {\r
4135 case DATE_YEAR_BITMASK:\r
4136 Info.mInfo.mVarOffset = 0;\r
4137 break;\r
4138 case DATE_DAY_BITMASK:\r
4139 Info.mInfo.mVarOffset = 3;\r
4140 break;\r
4141 case TIME_HOUR_BITMASK:\r
4142 Info.mInfo.mVarOffset = 0;\r
4143 break;\r
4144 case TIME_MINUTE_BITMASK:\r
4145 Info.mInfo.mVarOffset = 1;\r
4146 break;\r
4147 case TIME_SECOND_BITMASK:\r
4148 Info.mInfo.mVarOffset = 2;\r
4149 break;\r
4150 default:\r
4151 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4152 break;\r
4153 }\r
4154 } else {\r
4155 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
4156 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4157 }\r
4158 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4159 Info.mVarType = VarType;\r
4160 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4161 Info.mVarTotalSize = VarSize;\r
4162 }\r
4163 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4164 if (VarSize != Info.mVarTotalSize) {\r
4165 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4166 }\r
4167 }\r
4168 CIfrSet TSObj(L->getLine()); \r
4169 TSObj.SetVarInfo (&Info); \r
4170 delete VarIdStr; \r
4171 $ExpOpCount++;\r
4172 }\r
4173 >>\r
4174 ;\r
4175\r
30fdf114
LG
4176vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4177 conditionalExp[$RootLevel, $ExpOpCount]\r
4178 | findExp[$RootLevel, $ExpOpCount]\r
4179 | midExp[$RootLevel, $ExpOpCount]\r
4180 | tokenExp[$RootLevel, $ExpOpCount]\r
4181 | spanExp[$RootLevel, $ExpOpCount]\r
4182 ;\r
4183\r
4184#token Cond("cond") "cond"\r
4185#token Find("find") "find"\r
4186#token Mid("mid") "mid"\r
4187#token Tok("token") "token"\r
4188#token Span("span") "span"\r
4189\r
4190conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4191 L:Cond "\("\r
4192 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4193 "?"\r
4194 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4195 ":"\r
4196 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4197 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
4198 ;\r
4199\r
4200findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4201 << UINT8 Format; >>\r
4202 L:Find "\("\r
4203 findFormat[Format] ( "\|" findFormat[Format] )*\r
4204 ","\r
4205 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4206 ","\r
4207 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4208 ","\r
4209 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4210 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
4211 ;\r
4212\r
4213findFormat [UINT8 & Format] :\r
4214 "SENSITIVE" << $Format = 0x00; >>\r
4215 | "INSENSITIVE" << $Format = 0x01; >>\r
4216 ;\r
4217\r
4218midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4219 L:Mid "\("\r
4220 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4221 ","\r
4222 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4223 ","\r
4224 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4225 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
4226 ;\r
4227\r
4228tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4229 L:Tok "\("\r
4230 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4231 ","\r
4232 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4233 ","\r
4234 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4235 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4236 ;\r
4237\r
4238spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4239 << UINT8 Flags = 0; >>\r
4240 S:Span "\("\r
4241 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4242 ","\r
4243 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4244 ","\r
4245 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4246 ","\r
4247 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4248 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4249 ;\r
4250\r
52302d4d
LG
4251vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4252 L:Map \r
4253 "\(" \r
4254 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4255 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4256 (\r
4257 vfrStatementExpression[0]\r
4258 ","\r
4259 vfrStatementExpression[0]\r
4260 ";"\r
4261 ) *\r
4262 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4263 ;\r
4264\r
30fdf114 4265spanFlags [UINT8 & Flags] :\r
e4ac870f 4266 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4267 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4268 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4269 ;\r
4270\r
4271#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4272#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4273\r
4274//******************************************************************************\r
4275//\r
4276// Parser class definition.\r
4277//\r
4278class EfiVfrParser {\r
4279<<\r
4280private:\r
4281 UINT8 mParserStatus;\r
4282 BOOLEAN mConstantOnlyInExpression;\r
4283\r
4284 CVfrDefaultStore mCVfrDefaultStore;\r
4285 CVfrDataStorage mCVfrDataStorage;\r
4286 CVfrQuestionDB mCVfrQuestionDB;\r
4287 CVfrRulesDB mCVfrRulesDB;\r
4288\r
52302d4d
LG
4289 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
4290 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
4291 UINT8 mCIfrOpHdrIndex;\r
30fdf114
LG
4292 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
4293 VOID _CLEAR_SAVED_OPHDR (VOID);\r
4294 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
4295\r
4296\r
4297 EFI_VARSTORE_INFO mCurrQestVarInfo;\r
4234283c 4298 EFI_GUID *mOverrideClassGuid;\r
4afd3d04
LG
4299 CHAR8* mLastFormEndAddr;\r
4300\r
4301//\r
4302// Whether the question already has default value.\r
4303//\r
4304 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
4305 UINT16 mUsedDefaultCount;\r
30fdf114
LG
4306\r
4307//\r
4308// For framework vfr compatibility\r
4309//\r
4310 BOOLEAN mCompatibleMode;\r
4311 EFI_GUID mFormsetGuid;\r
4312\r
4313 VOID _CRT_OP (IN BOOLEAN);\r
4314\r
4315 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
4316 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
4317\r
4318 UINT8 _GET_CURRQEST_DATATYPE ();\r
4319 UINT32 _GET_CURRQEST_VARSIZE ();\r
b303ea72 4320 UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
4afd3d04 4321 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
30fdf114
LG
4322\r
4323public:\r
52302d4d 4324 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
30fdf114
LG
4325 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
4326 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
4327 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
52302d4d 4328 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
30fdf114
LG
4329\r
4330 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
4331\r
4332 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
4333 CHAR8* _U32TOS (IN UINT32);\r
e4ac870f
LG
4334 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);\r
4335 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);\r
4336 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);\r
4337 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);\r
4338 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4339 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4340 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
4341\r
4342 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);\r
4343 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);\r
4344 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);\r
30fdf114 4345\r
52302d4d 4346 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
30fdf114 4347\r
30fdf114
LG
4348 VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
4349 VOID _DeclareStandardDefaultStorage (IN UINT32);\r
4350 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
4351\r
4352 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
4353\r
4354 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r
4355 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
4356 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
4357 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
4234283c 4358 VOID SetOverrideClassGuid (IN EFI_GUID *);\r
30fdf114
LG
4359//\r
4360// For framework vfr compatibility\r
4361//\r
4362 VOID SetCompatibleMode (IN BOOLEAN);\r
4363>>\r
4364}\r
4365\r
4366<<\r
4367VOID\r
4368EfiVfrParser::_SAVE_OPHDR_COND (\r
4369 IN CIfrOpHeader &OpHdr,\r
4370 IN BOOLEAN Cond,\r
4371 IN UINT32 LineNo\r
4372 )\r
4373{\r
4374 if (Cond == TRUE) {\r
52302d4d 4375 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
30fdf114
LG
4376 return ;\r
4377 }\r
52302d4d
LG
4378 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
4379 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
30fdf114
LG
4380 }\r
4381}\r
4382\r
4383VOID\r
4384EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
4385 VOID\r
4386 )\r
4387{\r
52302d4d
LG
4388 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
4389 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
30fdf114
LG
4390}\r
4391\r
4392BOOLEAN\r
4393EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
4394 VOID\r
4395 )\r
4396{\r
52302d4d
LG
4397 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
4398 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
30fdf114
LG
4399 return TRUE;\r
4400 }\r
52302d4d 4401\r
30fdf114
LG
4402 //\r
4403 // IfrOpHdr is not set, FALSE is return.\r
4404 //\r
4405 return FALSE;\r
4406}\r
4407\r
4408VOID\r
4409EfiVfrParser::_CRT_OP (\r
4410 IN BOOLEAN Crt\r
4411 )\r
4412{\r
4413 gCreateOp = Crt;\r
4414}\r
4415\r
4416VOID\r
4417EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
4418 IN EFI_VARSTORE_INFO &Info\r
4419 )\r
4420{\r
4421 mCurrQestVarInfo = Info;\r
4422}\r
4423\r
4424EFI_VARSTORE_INFO &\r
4425EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
4426 VOID\r
4427 )\r
4428{\r
4429 return mCurrQestVarInfo;\r
4430}\r
4431\r
b303ea72
LG
4432UINT32\r
4433EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
4434 VOID\r
4435 )\r
4436{\r
4437 UINT8 Size = 1;\r
4438\r
4439 switch (mCurrQestVarInfo.mVarType) {\r
4440 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4441 Size = 1;\r
4442 break;\r
4443\r
4444 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4445 Size = 2;\r
4446 break;\r
4447\r
4448 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4449 Size = 4;\r
4450 break;\r
4451\r
4452 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4453 Size = 8;\r
4454 break;\r
4455\r
4456 default:\r
4457 break;\r
4458 }\r
4459\r
4460 return (mCurrQestVarInfo.mVarTotalSize / Size);\r
4461}\r
4462\r
30fdf114
LG
4463UINT8\r
4464EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
4465 VOID\r
4466 )\r
4467{\r
4468 return mCurrQestVarInfo.mVarType;\r
4469}\r
4470\r
4471UINT32\r
4472EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
4473 VOID\r
4474 )\r
4475{\r
4476 return mCurrQestVarInfo.mVarTotalSize;\r
4477}\r
4478\r
4479VOID\r
4480EfiVfrParser::_PCATCH (\r
4481 IN INTN ReturnCode,\r
4482 IN INTN ExpectCode,\r
4483 IN ANTLRTokenPtr Tok,\r
52302d4d 4484 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4485 )\r
4486{\r
4487 if (ReturnCode != ExpectCode) {\r
4488 mParserStatus++;\r
4489 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r
4490 }\r
4491}\r
4492\r
4493VOID\r
4494EfiVfrParser::_PCATCH (\r
4495 IN EFI_VFR_RETURN_CODE ReturnCode\r
4496 )\r
4497{\r
52302d4d 4498 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
30fdf114
LG
4499}\r
4500\r
4501VOID\r
4502EfiVfrParser::_PCATCH (\r
4503 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4504 IN ANTLRTokenPtr Tok\r
4505 )\r
4506{\r
52302d4d 4507 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
30fdf114
LG
4508}\r
4509\r
4510VOID\r
4511EfiVfrParser::_PCATCH (\r
4512 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4513 IN UINT32 LineNum\r
4514 )\r
4515{\r
52302d4d 4516 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
30fdf114
LG
4517}\r
4518\r
4519VOID\r
4520EfiVfrParser::_PCATCH (\r
4521 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4522 IN UINT32 LineNum,\r
52302d4d 4523 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4524 )\r
4525{\r
52302d4d 4526 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
30fdf114
LG
4527}\r
4528\r
4529VOID\r
4530EfiVfrParser::syn (\r
4531 ANTLRAbstractToken *Tok,\r
4532 ANTLRChar *Egroup,\r
4533 SetWordType *Eset,\r
4534 ANTLRTokenType ETok,\r
4535 INT32 Huh\r
4536 )\r
4537{\r
4538 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
4539\r
4540 mParserStatus += 1;\r
4541}\r
4542\r
4543CHAR8 *\r
4544EfiVfrParser::TrimHex (\r
4545 IN CHAR8 *Str,\r
4546 OUT BOOLEAN *IsHex\r
4547 )\r
4548{\r
4549 *IsHex = FALSE;\r
4550\r
4551 while (*Str && *Str == ' ') {\r
4552 Str++;\r
4553 }\r
4554 while (*Str && *Str == '0') {\r
4555 Str++;\r
4556 }\r
4557 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
4558 Str++;\r
4559 *IsHex = TRUE;\r
4560 }\r
4561\r
4562 return Str;\r
4563}\r
4564\r
4565CHAR8 *\r
4566EfiVfrParser::_U32TOS (\r
4567 IN UINT32 Value\r
4568 )\r
4569{\r
4570 CHAR8 *Str;\r
4571 Str = new CHAR8[20];\r
4572 sprintf (Str, "%d", Value);\r
4573 return Str;\r
4574}\r
4575\r
4576UINT8\r
4577EfiVfrParser::_STOU8 (\r
e4ac870f
LG
4578 IN CHAR8 *Str,\r
4579 IN UINT32 LineNum\r
30fdf114
LG
4580 )\r
4581{\r
4582 BOOLEAN IsHex;\r
4583 UINT8 Value;\r
4584 CHAR8 c;\r
4585\r
e4ac870f
LG
4586 UINT8 PreviousValue;\r
4587 CHAR8 *OrigString = Str;\r
4588 CHAR8 ErrorMsg[100];\r
4589\r
30fdf114
LG
4590 Str = TrimHex (Str, &IsHex);\r
4591 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4592 PreviousValue = Value;\r
30fdf114
LG
4593 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4594\r
4595 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4596 Value += (c - 'a' + 10);\r
4597 }\r
4598 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4599 Value += (c - 'A' + 10);\r
4600 }\r
4601 if (c >= '0' && c <= '9') {\r
4602 Value += (c - '0');\r
4603 }\r
e4ac870f
LG
4604 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4605 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
4606 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4607 }\r
30fdf114
LG
4608 }\r
4609\r
4610 return Value;\r
4611}\r
4612\r
4613UINT16\r
4614EfiVfrParser::_STOU16 (\r
e4ac870f
LG
4615 IN CHAR8 *Str,\r
4616 IN UINT32 LineNum\r
30fdf114
LG
4617 )\r
4618{\r
4619 BOOLEAN IsHex;\r
4620 UINT16 Value;\r
4621 CHAR8 c;\r
4622\r
e4ac870f
LG
4623 UINT16 PreviousValue;\r
4624 CHAR8 *OrigString = Str;\r
4625 CHAR8 ErrorMsg[100];\r
4626\r
30fdf114
LG
4627 Str = TrimHex (Str, &IsHex);\r
4628 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4629 PreviousValue = Value;\r
30fdf114
LG
4630 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4631\r
4632 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4633 Value += (c - 'a' + 10);\r
4634 }\r
4635 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4636 Value += (c - 'A' + 10);\r
4637 }\r
4638 if (c >= '0' && c <= '9') {\r
4639 Value += (c - '0');\r
4640 }\r
e4ac870f
LG
4641 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4642 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
4643 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4644 }\r
30fdf114
LG
4645 }\r
4646\r
4647 return Value;\r
4648}\r
4649\r
4650UINT32\r
4651EfiVfrParser::_STOU32 (\r
e4ac870f
LG
4652 IN CHAR8 *Str,\r
4653 IN UINT32 LineNum\r
30fdf114
LG
4654 )\r
4655{\r
4656 BOOLEAN IsHex;\r
4657 UINT32 Value;\r
4658 CHAR8 c;\r
4659\r
e4ac870f
LG
4660 UINT32 PreviousValue;\r
4661 CHAR8 *OrigString = Str;\r
4662 CHAR8 ErrorMsg[100];\r
4663\r
30fdf114
LG
4664 Str = TrimHex (Str, &IsHex);\r
4665 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4666 PreviousValue = Value;\r
30fdf114
LG
4667 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4668\r
4669 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4670 Value += (c - 'a' + 10);\r
4671 }\r
4672 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4673 Value += (c - 'A' + 10);\r
4674 }\r
4675 if (c >= '0' && c <= '9') {\r
4676 Value += (c - '0');\r
4677 }\r
e4ac870f
LG
4678 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
4679 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
4680 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4681 }\r
30fdf114
LG
4682 }\r
4683\r
4684 return Value;\r
4685}\r
4686\r
4687UINT64\r
4688EfiVfrParser::_STOU64 (\r
e4ac870f
LG
4689 IN CHAR8 *Str,\r
4690 IN UINT32 LineNum\r
30fdf114
LG
4691 )\r
4692{\r
4693 BOOLEAN IsHex;\r
4694 UINT64 Value;\r
4695 CHAR8 c;\r
e4ac870f
LG
4696 UINT64 PreviousValue;\r
4697 CHAR8 *OrigString = Str;\r
4698 CHAR8 ErrorMsg[100];\r
30fdf114
LG
4699\r
4700 Str = TrimHex (Str, &IsHex);\r
4701 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4702 PreviousValue = Value;\r
30fdf114
LG
4703 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4704\r
4705 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4706 Value += (c - 'a' + 10);\r
4707 }\r
4708 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4709 Value += (c - 'A' + 10);\r
4710 }\r
4711 if (c >= '0' && c <= '9') {\r
4712 Value += (c - '0');\r
4713 }\r
e4ac870f
LG
4714 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
4715 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
4716 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4717 }\r
30fdf114
LG
4718 }\r
4719\r
4720 return Value;\r
4721}\r
4722\r
4723EFI_HII_DATE\r
4724EfiVfrParser::_STOD (\r
4725 IN CHAR8 *Year,\r
4726 IN CHAR8 *Month,\r
e4ac870f
LG
4727 IN CHAR8 *Day,\r
4728 IN UINT32 LineNum\r
30fdf114
LG
4729 )\r
4730{\r
4731 EFI_HII_DATE Date;\r
4732\r
e4ac870f
LG
4733 Date.Year = _STOU16 (Year, LineNum);\r
4734 Date.Month = _STOU8 (Month, LineNum);\r
4735 Date.Day = _STOU8 (Day, LineNum);\r
30fdf114
LG
4736\r
4737 return Date;\r
4738}\r
4739\r
4740EFI_HII_TIME\r
4741EfiVfrParser::_STOT (\r
4742 IN CHAR8 *Hour,\r
4743 IN CHAR8 *Minute,\r
e4ac870f
LG
4744 IN CHAR8 *Second,\r
4745 IN UINT32 LineNum\r
30fdf114
LG
4746 )\r
4747{\r
4748 EFI_HII_TIME Time;\r
4749\r
e4ac870f
LG
4750 Time.Hour = _STOU8 (Hour, LineNum);\r
4751 Time.Minute = _STOU8 (Minute, LineNum);\r
4752 Time.Second = _STOU8 (Second, LineNum);\r
30fdf114
LG
4753\r
4754 return Time;\r
4755}\r
4756\r
4757EFI_STRING_ID\r
4758EfiVfrParser::_STOSID (\r
e4ac870f
LG
4759 IN CHAR8 *Str,\r
4760 IN UINT32 LineNum\r
30fdf114
LG
4761 )\r
4762{\r
e4ac870f 4763 return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4764}\r
4765\r
4766EFI_FORM_ID\r
4767EfiVfrParser::_STOFID (\r
e4ac870f
LG
4768 IN CHAR8 *Str,\r
4769 IN UINT32 LineNum\r
30fdf114
LG
4770 )\r
4771{\r
e4ac870f 4772 return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4773}\r
4774\r
4775EFI_QUESTION_ID\r
4776EfiVfrParser::_STOQID (\r
e4ac870f
LG
4777 IN CHAR8 *Str,\r
4778 IN UINT32 LineNum\r
30fdf114
LG
4779 )\r
4780{\r
e4ac870f 4781 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4782}\r
4783\r
4784VOID\r
4785EfiVfrParser::_STRCAT (\r
4786 IN OUT CHAR8 **Dest,\r
52302d4d 4787 IN CONST CHAR8 *Src\r
30fdf114
LG
4788 )\r
4789{\r
4790 CHAR8 *NewStr;\r
4791 UINT32 Len;\r
4792\r
4793 if ((Dest == NULL) || (Src == NULL)) {\r
4794 return;\r
4795 }\r
4796\r
4797 Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
4798 Len += strlen (Src);\r
4799 if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r
4800 return;\r
4801 }\r
4802 NewStr[0] = '\0';\r
4803 if (*Dest != NULL) {\r
4804 strcpy (NewStr, *Dest);\r
4805 delete *Dest;\r
4806 }\r
4807 strcat (NewStr, Src);\r
4808\r
4809 *Dest = NewStr;\r
4810}\r
4811\r
4234283c
LG
4812EFI_HII_REF\r
4813EfiVfrParser::_STOR (\r
4814 IN CHAR8 *QuestionId,\r
4815 IN CHAR8 *FormId,\r
4816 IN EFI_GUID *FormSetGuid,\r
e4ac870f
LG
4817 IN CHAR8 *DevicePath,\r
4818 IN UINT32 LineNum\r
4234283c
LG
4819 )\r
4820{\r
4821 EFI_HII_REF Ref;\r
4822 UINT32 Index;\r
4823\r
4824 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
e4ac870f
LG
4825 Ref.QuestionId = _STOQID (QuestionId, LineNum);\r
4826 Ref.FormId = _STOFID (FormId, LineNum);\r
4827 Ref.DevicePath = _STOSID (DevicePath, LineNum);\r
4234283c
LG
4828\r
4829 return Ref;\r
4830}\r
4831\r
30fdf114
LG
4832//\r
4833// framework vfr to default declare varstore for each structure\r
4834//\r
4835VOID\r
4836EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
4837 IN UINT32 LineNo\r
4838 )\r
4839{\r
4840 SVfrVarStorageNode *pNode;\r
4841 UINT32 TypeSize;\r
4842 BOOLEAN FirstNode;\r
52302d4d 4843 CONST CHAR8 VarName[] = "Setup";\r
30fdf114
LG
4844\r
4845 FirstNode = TRUE;\r
4846 pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
4847 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
4848 //\r
4849 // Create the default Buffer Var Store when no VarStore is defined.\r
4850 // its name should be "Setup"\r
4851 //\r
4852 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
4853 CIfrVarStore VSObj;\r
4854 VSObj.SetLineNo (LineNo);\r
4855 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
52302d4d 4856 VSObj.SetSize ((UINT16) TypeSize);\r
30fdf114 4857 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
52302d4d 4858 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4859 VSObj.SetGuid (&mFormsetGuid);\r
4860#ifdef VFREXP_DEBUG\r
4861 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
4862#endif\r
4863 } else {\r
4864 for (; pNode != NULL; pNode = pNode->mNext) {\r
4865 //\r
4866 // create the default varstore opcode for not declared varstore\r
4867 // the first varstore name should be "Setup"\r
4868 //\r
4869 if (!pNode->mAssignedFlag) {\r
4870 CIfrVarStore VSObj;\r
4871 VSObj.SetLineNo (LineNo);\r
4872 VSObj.SetVarStoreId (pNode->mVarStoreId);\r
52302d4d 4873 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
30fdf114 4874 if (FirstNode) {\r
52302d4d 4875 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4876 FirstNode = FALSE;\r
4877 } else {\r
4878 VSObj.SetName (pNode->mVarStoreName);\r
4879 }\r
4880 VSObj.SetGuid (&pNode->mGuid);\r
4881#ifdef VFREXP_DEBUG\r
4882 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4883#endif\r
4884 }\r
4885 }\r
4886 }\r
4887\r
4888 pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
4889 for (; pNode != NULL; pNode = pNode->mNext) {\r
4890 //\r
4891 // create the default efi varstore opcode for not exist varstore\r
4892 //\r
4893 if (!pNode->mAssignedFlag) {\r
4894 CIfrVarStoreEfi VSEObj;\r
4895 VSEObj.SetLineNo (LineNo);\r
4896 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
4897 VSEObj.SetGuid (&pNode->mGuid);\r
4898 VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
4234283c
LG
4899 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
4900 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
4901 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
30fdf114
LG
4902#ifdef VFREXP_DEBUG\r
4903 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4904#endif\r
4905 }\r
4906 }\r
4907\r
4908}\r
4909\r
4910VOID\r
4911EfiVfrParser::_DeclareDefaultLinearVarStore (\r
4912 IN UINT32 LineNo\r
4913 )\r
4914{\r
4915 UINT32 Index;\r
4916 CHAR8 **TypeNameList;\r
4917 UINT32 ListSize;\r
52302d4d
LG
4918 CONST CHAR8 DateName[] = "Date";\r
4919 CONST CHAR8 TimeName[] = "Time";\r
4920 CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
4921 CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
30fdf114
LG
4922\r
4923 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
4924\r
4925 for (Index = 0; Index < ListSize; Index++) {\r
4926 UINT32 Size;\r
4927 EFI_VARSTORE_ID VarStoreId;\r
4928 CIfrVarStore VSObj;\r
4929\r
4930 VSObj.SetLineNo (LineNo);\r
4931 mCVfrDataStorage.DeclareBufferVarStore (\r
4932 TypeNameList[Index],\r
4933 &mFormsetGuid,\r
4934 &gCVfrVarDataTypeDB,\r
4935 TypeNameList[Index],\r
4936 EFI_VARSTORE_ID_INVALID\r
4937 );\r
4afd3d04 4938 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
30fdf114
LG
4939 VSObj.SetVarStoreId (VarStoreId);\r
4940 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
52302d4d 4941 VSObj.SetSize ((UINT16) Size);\r
30fdf114
LG
4942 VSObj.SetName (TypeNameList[Index]);\r
4943 VSObj.SetGuid (&mFormsetGuid);\r
4944 }\r
4945\r
4946//\r
4947// not required to declare Date and Time VarStore,\r
4948// because code to support old format Data and Time\r
4949//\r
52302d4d 4950 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
30fdf114
LG
4951 UINT32 Size;\r
4952 EFI_VARSTORE_ID VarStoreId;\r
4953 CIfrVarStore VSObj;\r
4954\r
4955 VSObj.SetLineNo (LineNo);\r
4956 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4957 (CHAR8 *) DateName,\r
30fdf114
LG
4958 &mFormsetGuid,\r
4959 &gCVfrVarDataTypeDB,\r
52302d4d 4960 (CHAR8 *) DateType,\r
30fdf114
LG
4961 EFI_VARSTORE_ID_INVALID\r
4962 );\r
4afd3d04 4963 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4964 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4965 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
4966 VSObj.SetSize ((UINT16) Size);\r
4967 VSObj.SetName ((CHAR8 *) DateName);\r
30fdf114
LG
4968 VSObj.SetGuid (&mFormsetGuid);\r
4969 }\r
4970\r
52302d4d 4971 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
30fdf114
LG
4972 UINT32 Size;\r
4973 EFI_VARSTORE_ID VarStoreId;\r
4974 CIfrVarStore VSObj;\r
4975\r
4976 VSObj.SetLineNo (LineNo);\r
4977 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4978 (CHAR8 *) TimeName,\r
30fdf114
LG
4979 &mFormsetGuid,\r
4980 &gCVfrVarDataTypeDB,\r
52302d4d 4981 (CHAR8 *) TimeType,\r
30fdf114
LG
4982 EFI_VARSTORE_ID_INVALID\r
4983 );\r
4afd3d04 4984 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4985 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4986 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
4987 VSObj.SetSize ((UINT16) Size);\r
4988 VSObj.SetName ((CHAR8 *) TimeName);\r
30fdf114
LG
4989 VSObj.SetGuid (&mFormsetGuid);\r
4990 }\r
4991}\r
4992\r
4993VOID\r
4994EfiVfrParser::_DeclareStandardDefaultStorage (\r
4995 IN UINT32 LineNo\r
4996 )\r
4997{\r
4998 //\r
4999 // Default Store is declared.\r
5000 //\r
5001 CIfrDefaultStore DSObj;\r
5002\r
52302d4d 5003 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
30fdf114
LG
5004 DSObj.SetLineNo (LineNo);\r
5005 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
5006 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
5007\r
5008 //\r
5009 // Default MANUFACTURING Store is declared.\r
5010 //\r
5011 CIfrDefaultStore DSObjMF;\r
5012\r
52302d4d 5013 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
30fdf114
LG
5014 DSObjMF.SetLineNo (LineNo);\r
5015 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
5016 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
5017}\r
5018\r
5019VOID\r
5020EfiVfrParser::AssignQuestionKey (\r
5021 IN CIfrQuestionHeader &QHObj,\r
5022 IN ANTLRTokenPtr KeyTok\r
5023 )\r
5024{\r
5025 UINT16 KeyValue;\r
5026\r
5027 if (KeyTok == NULL) {\r
5028 return;\r
5029 }\r
5030\r
e4ac870f 5031 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
30fdf114
LG
5032\r
5033 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
5034 /*\r
5035 * if the question is not CALLBACK ignore the key.\r
5036 */\r
5037 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
5038 QHObj.SetQuestionId (KeyValue);\r
5039 }\r
5040}\r
5041\r
5042VOID\r
5043EfiVfrParser::ConvertIdExpr (\r
5044 IN UINT32 &ExpOpCount,\r
5045 IN UINT32 LineNo,\r
5046 IN EFI_QUESTION_ID QId,\r
5047 IN CHAR8 *VarIdStr,\r
5048 IN UINT32 BitMask\r
5049 )\r
5050{\r
5051 CIfrQuestionRef1 QR1Obj(LineNo);\r
5052 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
5053 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
5054\r
5055 if (BitMask != 0) {\r
5056 CIfrUint32 U32Obj(LineNo);\r
5057 U32Obj.SetValue (BitMask);\r
5058\r
5059 CIfrBitWiseAnd BWAObj(LineNo);\r
5060\r
5061 CIfrUint8 U8Obj(LineNo);\r
5062 switch (BitMask) {\r
5063 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r
5064 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
5065 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r
5066 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r
5067 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
5068 }\r
5069\r
5070 CIfrShiftRight SRObj(LineNo);\r
5071 }\r
5072\r
5073 ExpOpCount += 4;\r
5074}\r
5075\r
5076VOID\r
5077EfiVfrParser::IdEqValDoSpecial (\r
5078 IN UINT32 &ExpOpCount,\r
5079 IN UINT32 LineNo,\r
5080 IN EFI_QUESTION_ID QId,\r
5081 IN CHAR8 *VarIdStr,\r
5082 IN UINT32 BitMask,\r
5083 IN UINT16 ConstVal,\r
5084 IN EFI_COMPARE_TYPE CompareType\r
5085 )\r
5086{\r
5087 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
5088\r
5089 if (ConstVal > 0xFF) {\r
5090 CIfrUint16 U16Obj(LineNo);\r
5091 U16Obj.SetValue (ConstVal);\r
5092 } else {\r
5093 CIfrUint8 U8Obj(LineNo);\r
5094 U8Obj.SetValue ((UINT8)ConstVal);\r
5095 }\r
5096\r
5097 switch (CompareType) {\r
5098 case EQUAL :\r
5099 {\r
5100 CIfrEqual EObj(LineNo);\r
5101 break;\r
5102 }\r
5103 case LESS_EQUAL :\r
5104 {\r
5105 CIfrLessEqual LEObj(LineNo);\r
5106 break;\r
5107 }\r
5108 case LESS_THAN :\r
5109 {\r
5110 CIfrLessThan LTObj(LineNo);\r
5111 break;\r
5112 }\r
5113 case GREATER_EQUAL :\r
5114 {\r
5115 CIfrGreaterEqual GEObj(LineNo);\r
5116 break;\r
5117 }\r
5118 case GREATER_THAN :\r
5119 {\r
5120 CIfrGreaterThan GTObj(LineNo);\r
5121 break;\r
5122 }\r
5123 }\r
5124\r
5125 ExpOpCount += 2;\r
5126}\r
5127\r
5128VOID\r
5129EfiVfrParser::IdEqIdDoSpecial (\r
5130 IN UINT32 &ExpOpCount,\r
5131 IN UINT32 LineNo,\r
5132 IN EFI_QUESTION_ID QId1,\r
5133 IN CHAR8 *VarId1Str,\r
5134 IN UINT32 BitMask1,\r
5135 IN EFI_QUESTION_ID QId2,\r
5136 IN CHAR8 *VarId2Str,\r
5137 IN UINT32 BitMask2,\r
5138 IN EFI_COMPARE_TYPE CompareType\r
5139 )\r
5140{\r
5141 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
5142 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
5143\r
5144 switch (CompareType) {\r
5145 case EQUAL :\r
5146 {\r
5147 CIfrEqual EObj(LineNo);\r
5148 break;\r
5149 }\r
5150 case LESS_EQUAL :\r
5151 {\r
5152 CIfrLessEqual LEObj(LineNo);\r
5153 break;\r
5154 }\r
5155 case LESS_THAN :\r
5156 {\r
5157 CIfrLessThan LTObj(LineNo);\r
5158 break;\r
5159 }\r
5160 case GREATER_EQUAL :\r
5161 {\r
5162 CIfrGreaterEqual GEObj(LineNo);\r
5163 break;\r
5164 }\r
5165 case GREATER_THAN :\r
5166 {\r
5167 CIfrGreaterThan GTObj(LineNo);\r
5168 break;\r
5169 }\r
5170 }\r
5171\r
5172 ExpOpCount++;\r
5173}\r
5174\r
5175VOID\r
5176EfiVfrParser::IdEqListDoSpecial (\r
5177 IN UINT32 &ExpOpCount,\r
5178 IN UINT32 LineNo,\r
5179 IN EFI_QUESTION_ID QId,\r
5180 IN CHAR8 *VarIdStr,\r
5181 IN UINT32 BitMask,\r
5182 IN UINT16 ListLen,\r
5183 IN UINT16 *ValueList\r
5184 )\r
5185{\r
5186 UINT16 Index;\r
5187\r
5188 if (ListLen == 0) {\r
5189 return;\r
5190 }\r
5191\r
5192 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
5193 for (Index = 1; Index < ListLen; Index++) {\r
5194 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
5195 CIfrOr OObj (LineNo);\r
5196 ExpOpCount++;\r
5197 }\r
5198}\r
5199\r
4234283c
LG
5200VOID \r
5201EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
5202{\r
5203 mOverrideClassGuid = OverrideClassGuid;\r
5204}\r
5205\r
30fdf114
LG
5206//\r
5207// For framework vfr compatibility\r
5208//\r
5209VOID\r
5210EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
5211{\r
5212 mCompatibleMode = Mode;\r
5213 mCVfrQuestionDB.SetCompatibleMode (Mode);\r
5214}\r
4afd3d04
LG
5215\r
5216VOID\r
5217EfiVfrParser::CheckDuplicateDefaultValue (\r
5218 IN EFI_DEFAULT_ID DefaultId,\r
5219 IN ANTLRTokenPtr Tok\r
5220 )\r
5221{\r
5222 UINT16 Index;\r
5223\r
5224 for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
5225 if (mUsedDefaultArray[Index] == DefaultId) {\r
5226 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
5227 }\r
5228 }\r
5229\r
5230 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
5231 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
5232 }\r
5233\r
5234 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
5235}\r
30fdf114 5236>>\r