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