]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: Extend the Macro used in the FDF !include statement
[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
74bbe31b 599 gCVfrDataStorage,\r
4afd3d04
LG
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
74bbe31b
DB
617 InsertOpcodeAddr,\r
618 FALSE\r
4afd3d04
LG
619 );\r
620 }\r
621\r
622 if (FSObj != NULL) {\r
623 delete FSObj;\r
624 }\r
30fdf114
LG
625 >>\r
626 ";"\r
627 ;\r
628\r
629vfrFormSetList :\r
630 (\r
631 vfrFormDefinition |\r
52302d4d 632 vfrFormMapDefinition |\r
30fdf114
LG
633 vfrStatementImage |\r
634 vfrStatementVarStoreLinear |\r
635 vfrStatementVarStoreEfi |\r
636 vfrStatementVarStoreNameValue |\r
637 vfrStatementDefaultStore |\r
a709adfa 638 vfrStatementDisableIfFormSet |\r
da92f276
LG
639 vfrStatementSuppressIfFormSet |\r
640 vfrStatementExtension\r
30fdf114
LG
641 )*\r
642 ;\r
643\r
da92f276
LG
644vfrStatementExtension:\r
645 << \r
646 EFI_GUID Guid;\r
647 CIfrGuid *GuidObj = NULL;\r
648 CHAR8 *TypeName = NULL;\r
649 UINT32 TypeSize = 0;\r
650 UINT8 *DataBuff = NULL;\r
651 UINT32 Size = 0;\r
652 UINT8 Idx = 0;\r
653 UINT32 LineNum;\r
654 BOOLEAN IsStruct = FALSE;\r
655 UINT32 ArrayNum = 0;\r
656 >>\r
657 L:GuidOp\r
658 Uuid "=" guidDefinition[Guid]\r
659 {"," DataType "=" \r
660 (\r
e4ac870f 661 U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText(), AN1->getLine());>>}\r
da92f276 662 << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
e4ac870f 663 | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>}\r
da92f276 664 << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
e4ac870f 665 | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>}\r
da92f276 666 << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
e4ac870f 667 | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>}\r
da92f276 668 << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
e4ac870f 669 | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>}\r
da92f276 670 << TypeName = BL->getText(); LineNum = BL->getLine(); >>\r
e4ac870f 671 | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>}\r
da92f276 672 << TypeName = SI->getText(); LineNum = SI->getLine(); >>\r
e4ac870f 673 | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>}\r
da92f276 674 << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>\r
e4ac870f 675 | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>}\r
da92f276 676 << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>\r
e4ac870f 677 | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>}\r
4234283c 678 << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> \r
e4ac870f 679 | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>}\r
da92f276
LG
680 << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>\r
681 )\r
682 <<\r
683 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);\r
684 if (ArrayNum > 0) {\r
685 Size = TypeSize*ArrayNum;\r
686 } else {\r
687 Size = TypeSize;\r
688 }\r
689 if (Size > (128 - sizeof (EFI_IFR_GUID))) return;\r
690 DataBuff = (UINT8 *)malloc(Size);\r
691 for (Idx = 0; Idx < Size; Idx++) {\r
692 DataBuff[Idx] = 0;\r
693 }\r
694 >>\r
695 vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]\r
696 }\r
697 <<\r
698 {\r
699 GuidObj = new CIfrGuid(Size);\r
700 if (GuidObj != NULL) {\r
701 GuidObj->SetLineNo(L->getLine());\r
702 GuidObj->SetGuid (&Guid);\r
703 }\r
704 }\r
705 if (TypeName != NULL) {\r
706 GuidObj->SetData(DataBuff, Size);\r
707 }\r
708 >>\r
709 {","\r
710 (\r
711 vfrStatementExtension\r
712 )*\r
713 E:EndGuidOp << GuidObj->SetScope(1); CRT_END_OP (E); >>\r
714 }\r
715 <<\r
716 if (GuidObj != NULL) delete GuidObj;\r
717 if (DataBuff != NULL) free(DataBuff);\r
718 >>\r
719 ";"\r
720;\r
721\r
722vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:\r
723 <<\r
724 CHAR8 *TFName = NULL;\r
725 UINT32 ArrayIdx = 0;\r
726 UINT16 FieldOffset;\r
727 UINT8 FieldType;\r
728 UINT32 FieldSize;\r
729 UINT64 Data_U64 = 0;\r
730 UINT32 Data_U32 = 0;\r
731 UINT16 Data_U16 = 0;\r
732 UINT8 Data_U8 = 0;\r
733 BOOLEAN Data_BL = 0;\r
734 EFI_STRING_ID Data_SID = 0;\r
735 BOOLEAN IsArray = FALSE;\r
736 UINT8 *ByteOffset = NULL;\r
737 >>\r
738(\r
739 ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}\r
740 <<\r
741 ArrayIdx = 0;\r
742 if (IsArray == TRUE) {\r
e4ac870f 743 ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine());\r
da92f276
LG
744 if (ArrayIdx >= ArrayNum) return;\r
745 IsArray = FALSE;\r
746 }\r
747 ByteOffset = DataBuff + (ArrayIdx * TypeSize);\r
748 if (IsStruct == TRUE) {\r
749 _STRCAT(&TFName, TypeName);\r
750 }\r
751 >>\r
752 ("." FN:StringIdentifier\r
753 <<\r
754 if (IsStruct == TRUE) {\r
755 _STRCAT(&TFName, ".");\r
756 _STRCAT(&TFName, FN->getText());\r
757 }\r
758 >>\r
759 {\r
760 OpenBracket IDX2:Number CloseBracket\r
761 <<\r
762 if (IsStruct == TRUE) {\r
763 _STRCAT(&TFName, "[");\r
764 _STRCAT(&TFName, IDX2->getText());\r
765 _STRCAT(&TFName, "]");\r
766 }\r
767 >>\r
768 }\r
769 )*\r
770 "=" RD:Number\r
771 <<\r
772 if (IsStruct == FALSE) {\r
773 if (strcmp ("UINT64", TypeName) == 0) {\r
e4ac870f 774 Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
da92f276
LG
775 memcpy (ByteOffset, &Data_U64, TypeSize);\r
776 }else if (strcmp ("UINT32", TypeName) == 0) {\r
e4ac870f 777 Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
da92f276
LG
778 memcpy (ByteOffset, &Data_U32, TypeSize); \r
779 }else if (strcmp ("UINT16", TypeName) == 0) {\r
e4ac870f 780 Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
da92f276
LG
781 memcpy (ByteOffset, &Data_U16, TypeSize); \r
782 }else if (strcmp ("UINT8", TypeName) == 0) {\r
e4ac870f 783 Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
784 memcpy (ByteOffset, &Data_U8, TypeSize); \r
785 }else if (strcmp ("BOOLEAN", TypeName)== 0) {\r
e4ac870f 786 Data_BL = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
787 memcpy (ByteOffset, &Data_BL, TypeSize); \r
788 }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {\r
e4ac870f 789 Data_SID = _STOSID(RD->getText(), RD->getLine());\r
da92f276
LG
790 memcpy (ByteOffset, &Data_SID, TypeSize); \r
791 }\r
792 } else {\r
793 gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);\r
794 switch (FieldType) {\r
795 case EFI_IFR_TYPE_NUM_SIZE_8:\r
e4ac870f 796 Data_U8 = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
797 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);\r
798 break;\r
799 case EFI_IFR_TYPE_NUM_SIZE_16:\r
e4ac870f 800 Data_U16 = _STOU16(RD->getText(), RD->getLine());\r
da92f276
LG
801 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);\r
802 break;\r
803 case EFI_IFR_TYPE_NUM_SIZE_32:\r
e4ac870f 804 Data_U32 = _STOU32(RD->getText(), RD->getLine());\r
da92f276
LG
805 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);\r
806 break;\r
807 case EFI_IFR_TYPE_NUM_SIZE_64:\r
e4ac870f 808 Data_U64 = _STOU64(RD->getText(), RD->getLine());\r
da92f276
LG
809 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);\r
810 break;\r
811 case EFI_IFR_TYPE_BOOLEAN:\r
e4ac870f 812 Data_BL = _STOU8(RD->getText(), RD->getLine());\r
da92f276
LG
813 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);\r
814 break;\r
815 case EFI_IFR_TYPE_STRING:\r
e4ac870f 816 Data_SID = _STOSID(RD->getText(), RD->getLine());\r
da92f276
LG
817 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);\r
818 break;\r
819 default:\r
820 break;\r
821 }\r
822 }\r
823 if (TFName != NULL) { delete TFName; TFName = NULL; }\r
824 >>\r
825 )*\r
826)\r
827;\r
828\r
829\r
30fdf114
LG
830vfrStatementDefaultStore :\r
831 << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
832 D:DefaultStore N:StringIdentifier ","\r
833 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"\r
834 {\r
e4ac870f 835 "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >>\r
30fdf114
LG
836 }\r
837 <<\r
74bbe31b 838 if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
30fdf114 839 CIfrDefaultStore DSObj;\r
74bbe31b 840 _PCATCH(gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
30fdf114 841 DSObj.SetLineNo(D->getLine());\r
e4ac870f 842 DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));\r
30fdf114
LG
843 DSObj.SetDefaultId (DefaultId);\r
844 } else {\r
74bbe31b 845 _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
30fdf114
LG
846 }\r
847 >>\r
848 ";"\r
849 ;\r
850\r
851vfrStatementVarStoreLinear :\r
852 <<\r
853 EFI_GUID Guid;\r
854 CIfrVarStore VSObj;\r
855 CHAR8 *TypeName;\r
856 CHAR8 *StoreName;\r
857 UINT32 LineNum;\r
858 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
859 UINT32 Size;\r
860 >>\r
861 V:Varstore << VSObj.SetLineNo(V->getLine()); >>\r
862 (\r
863 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
52302d4d
LG
864 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
865 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
866 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
867 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
868 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
869 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
870 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
4234283c 871 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>\r
30fdf114
LG
872 )\r
873 { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
874 if (mCompatibleMode) {\r
e4ac870f 875 VarStoreId = _STOU16(FID->getText(), FID->getLine());\r
30fdf114
LG
876 }\r
877 >>\r
878 }\r
879 {\r
880 VarId "=" ID:Number "," <<\r
881 _PCATCH(\r
e4ac870f 882 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
30fdf114
LG
883 (INTN)TRUE,\r
884 ID,\r
885 "varid 0 is not allowed."\r
886 );\r
887 >>\r
888 }\r
889 Name "=" SN:StringIdentifier ","\r
890 Uuid "=" guidDefinition[Guid]\r
891 <<\r
892 if (mCompatibleMode) {\r
893 StoreName = TypeName;\r
894 } else {\r
895 StoreName = SN->getText();\r
896 }\r
74bbe31b 897 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
30fdf114
LG
898 StoreName,\r
899 &Guid,\r
900 &gCVfrVarDataTypeDB,\r
901 TypeName,\r
902 VarStoreId\r
903 ), LineNum);\r
30fdf114 904 VSObj.SetGuid (&Guid);\r
74bbe31b 905 _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
30fdf114
LG
906 VSObj.SetVarStoreId (VarStoreId);\r
907 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
52302d4d 908 VSObj.SetSize ((UINT16) Size);\r
df1780f8 909 VSObj.SetName (SN->getText());\r
30fdf114
LG
910 >>\r
911 ";"\r
912 ;\r
913\r
914vfrStatementVarStoreEfi :\r
915 <<\r
4234283c 916 BOOLEAN IsUEFI23EfiVarstore = TRUE;\r
30fdf114
LG
917 EFI_GUID Guid;\r
918 CIfrVarStoreEfi VSEObj;\r
4234283c 919 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114 920 UINT32 Attr = 0;\r
4234283c
LG
921 UINT32 Size;\r
922 CHAR8 *TypeName;\r
923 UINT32 LineNum;\r
924 CHAR8 *StoreName = NULL;\r
5c7956a2 925 BOOLEAN CustomizedName = FALSE;\r
30fdf114
LG
926 >>\r
927 E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>\r
4234283c 928 (\r
5c7956a2 929 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>\r
4234283c
LG
930 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>\r
931 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>\r
932 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>\r
933 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>\r
934 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>\r
935 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>\r
936 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>\r
937 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> \r
938 )\r
939 {\r
940 VarId "=" ID:Number "," <<\r
941 _PCATCH(\r
e4ac870f 942 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
4234283c
LG
943 (INTN)TRUE,\r
944 ID,\r
945 "varid 0 is not allowed."\r
946 );\r
947 >>\r
948 }\r
30fdf114
LG
949 Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","\r
950 << VSEObj.SetAttributes (Attr); >>\r
4234283c
LG
951\r
952 (\r
953 Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >>\r
954 |\r
955 Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," \r
956 VarSize "=" N:Number "," << \r
957 IsUEFI23EfiVarstore = FALSE;\r
e4ac870f 958 StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText(), VN->getLine()));\r
4234283c
LG
959 if (StoreName == NULL) {\r
960 _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");\r
961 }\r
5c7956a2
ED
962 if (!CustomizedName) {\r
963 _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!");\r
964 return;\r
965 }\r
e4ac870f 966 Size = _STOU32(N->getText(), N->getLine());\r
4234283c
LG
967 switch (Size) {\r
968 case 1:\r
969 TypeName = (CHAR8 *) "UINT8";\r
970 break;\r
971 case 2:\r
972 TypeName = (CHAR8 *) "UINT16";\r
973 break;\r
974 case 4:\r
975 TypeName = (CHAR8 *) "UINT32";\r
976 break;\r
977 case 8:\r
978 TypeName = (CHAR8 *) "UINT64";\r
979 break; \r
980 default:\r
981 _PCATCH (VFR_RETURN_UNSUPPORTED, N);\r
982 break;\r
983 }\r
984 >>\r
985 )\r
986\r
987 Uuid "=" guidDefinition[Guid] << \r
988 if (IsUEFI23EfiVarstore) {\r
74bbe31b 989 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
4234283c
LG
990 StoreName,\r
991 &Guid,\r
992 &gCVfrVarDataTypeDB,\r
993 TypeName,\r
994 VarStoreId\r
995 ), LineNum); \r
74bbe31b 996 _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
4234283c
LG
997 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
998 } else {\r
74bbe31b 999 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
871f6733 1000 TN->getText(),\r
4234283c
LG
1001 &Guid,\r
1002 &gCVfrVarDataTypeDB,\r
1003 TypeName,\r
1004 VarStoreId\r
1005 ), LineNum); \r
74bbe31b 1006 _PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
4234283c
LG
1007 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
1008 }\r
1009 VSEObj.SetGuid (&Guid); \r
30fdf114 1010 VSEObj.SetVarStoreId (VarStoreId);\r
4234283c
LG
1011 \r
1012 VSEObj.SetSize ((UINT16) Size);\r
1013 VSEObj.SetName (StoreName);\r
1014 if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {\r
1015 delete StoreName; \r
1016 }\r
30fdf114
LG
1017 >>\r
1018 ";"\r
1019 ;\r
1020\r
1021vfrVarStoreEfiAttr [UINT32 & Attr] :\r
e4ac870f 1022 N:Number << $Attr |= _STOU32(N->getText(), N->getLine()); >>\r
30fdf114
LG
1023 ;\r
1024\r
1025vfrStatementVarStoreNameValue :\r
1026 <<\r
1027 EFI_GUID Guid;\r
1028 CIfrVarStoreNameValue VSNVObj;\r
e8a47801
LG
1029 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
1030 BOOLEAN Created = FALSE;\r
30fdf114
LG
1031 >>\r
1032 L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >>\r
e8a47801
LG
1033 SN:StringIdentifier ","\r
1034 {\r
1035 VarId "=" ID:Number "," <<\r
1036 _PCATCH(\r
e4ac870f 1037 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,\r
e8a47801
LG
1038 (INTN)TRUE,\r
1039 ID,\r
1040 "varid 0 is not allowed."\r
1041 );\r
1042 >>\r
1043 }\r
30fdf114 1044 (\r
e8a47801
LG
1045 Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << \r
1046 if (!Created) {\r
74bbe31b 1047 _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
e8a47801
LG
1048 Created = TRUE;\r
1049 }\r
74bbe31b 1050 _PCATCH(gCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN);\r
e8a47801 1051 >>\r
30fdf114 1052 )+\r
74bbe31b 1053 Uuid "=" guidDefinition[Guid] << _PCATCH(gCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
30fdf114
LG
1054 <<\r
1055 VSNVObj.SetGuid (&Guid);\r
74bbe31b 1056 _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
30fdf114
LG
1057 VSNVObj.SetVarStoreId (VarStoreId);\r
1058 >>\r
1059 ";"\r
1060 ;\r
1061\r
1062//\r
1063// keep classDeinition and validClassNames for compatibility but not generate\r
1064// any IFR object\r
1065//\r
1066classDefinition[UINT16 & Class] :\r
1067 << $Class = 0; >>\r
1068 validClassNames[$Class] ( "\|" validClassNames[$Class] )*\r
1069 ;\r
1070\r
1071validClassNames[UINT16 & Class] :\r
1072 ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >>\r
1073 | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >>\r
1074 | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >>\r
1075 | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >>\r
1076 | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >>\r
1077 | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>\r
1078 | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >>\r
e4ac870f 1079 | N:Number << $Class |= _STOU16(N->getText(), N->getLine()); >>\r
30fdf114
LG
1080 ;\r
1081\r
1082subclassDefinition[UINT16 & SubClass] :\r
1083 << $SubClass = 0; >>\r
1084 SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>\r
1085 | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>\r
1086 | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>\r
1087 | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>\r
e4ac870f 1088 | N:Number << $SubClass |= _STOU16(N->getText(), N->getLine()); >>\r
30fdf114
LG
1089 ;\r
1090\r
1091vfrStatementDisableIfFormSet :\r
1092 <<\r
1093 CIfrDisableIf DIObj;\r
1094 mConstantOnlyInExpression = TRUE;\r
1095 >>\r
1096 D:DisableIf << DIObj.SetLineNo(D->getLine()); >>\r
1097 vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>\r
1098 vfrFormSetList\r
1099 E:EndIf << CRT_END_OP (E); >>\r
1100 ";"\r
1101 ;\r
1102\r
a709adfa
LG
1103vfrStatementSuppressIfFormSet :\r
1104 << CIfrSuppressIf SIObj;>>\r
1105 L:SuppressIf <<\r
1106 if (mCompatibleMode) {\r
1107 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
1108 }\r
1109 SIObj.SetLineNo(L->getLine()); \r
1110 >>\r
1111 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
1112 vfrStatementExpression[0] ";"\r
1113 vfrFormSetList\r
1114 E: EndIf \r
1115 ";" << CRT_END_OP (E); >>\r
1116 ;\r
1117\r
30fdf114
LG
1118//*****************************************************************************\r
1119//\r
1120// the syntax of question header and statement header\r
1121//\r
1122vfrStatementHeader[CIfrStatementHeader *SHObj] :\r
e4ac870f
LG
1123 Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText(), S1->getLine())); >>\r
1124 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >>\r
30fdf114
LG
1125 ;\r
1126\r
1127vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
1128 <<\r
1129 EFI_VARSTORE_INFO Info;\r
4afd3d04
LG
1130 Info.mVarType = EFI_IFR_TYPE_OTHER;\r
1131 Info.mVarTotalSize = 0;\r
1132 Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
1133 Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
1134 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1135 CHAR8 *QName = NULL;\r
1136 CHAR8 *VarIdStr = NULL;\r
4afd3d04 1137 mUsedDefaultCount = 0;\r
30fdf114
LG
1138 >>\r
1139 {\r
1140 Name "=" QN:StringIdentifier "," <<\r
1141 QName = QN->getText();\r
1142 _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
1143 >>\r
1144 }\r
1145 { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
1146 {\r
1147 QuestionId "=" ID:Number "," <<\r
e4ac870f 1148 QId = _STOQID(ID->getText(), ID->getLine());\r
30fdf114
LG
1149 _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");\r
1150 >>\r
1151 }\r
1152 <<\r
1153 switch (QType) {\r
1154 case QUESTION_NORMAL:\r
1155 mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
1156 break;\r
1157 case QUESTION_DATE:\r
52302d4d
LG
1158 mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
1159 break;\r
30fdf114 1160 case QUESTION_TIME:\r
52302d4d
LG
1161 mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
1162 break;\r
4234283c
LG
1163 case QUESTION_REF:\r
1164 //\r
1165 // VarIdStr != NULL stand for question with storagae.\r
1166 //\r
1167 if (VarIdStr != NULL) {\r
1168 mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);\r
1169 } else {\r
1170 mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
1171 }\r
1172 break;\r
30fdf114
LG
1173 default:\r
1174 _PCATCH(VFR_RETURN_FATAL_ERROR);\r
1175 }\r
1176 $QHObj.SetQuestionId (QId);\r
4234283c
LG
1177 if (VarIdStr != NULL) {\r
1178 $QHObj.SetVarStoreInfo (&Info);\r
1179 }\r
30fdf114
LG
1180 >>\r
1181 vfrStatementHeader[&$QHObj]\r
4234283c
LG
1182 << \r
1183 if (VarIdStr != NULL) {\r
1184 delete VarIdStr; \r
4234283c 1185 }\r
4afd3d04 1186 _SAVE_CURRQEST_VARINFO (Info);\r
30fdf114 1187 >>\r
30fdf114
LG
1188 ;\r
1189\r
1190questionheaderFlagsField[UINT8 & Flags] :\r
1191 ReadOnlyFlag << $Flags |= 0x01; >>\r
1192 | InteractiveFlag << $Flags |= 0x04; >>\r
1193 | ResetRequiredFlag << $Flags |= 0x10; >>\r
366430c7 1194 | ReconnectRequiredFlag << $Flags |= 0x40; >>\r
05154781
ED
1195 | O:OptionOnlyFlag << \r
1196 if (mCompatibleMode) {\r
1197 $Flags |= 0x80;\r
1198 } else {\r
1199 gCVfrErrorHandle.HandleWarning (\r
1200 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1201 O->getLine(),\r
1202 O->getText()\r
1203 );\r
1204 }\r
1205 >>\r
1206 | N:NVAccessFlag << \r
1207 if (!mCompatibleMode) {\r
1208 gCVfrErrorHandle.HandleWarning (\r
1209 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1210 N->getLine(),\r
1211 N->getText()\r
1212 );\r
1213 }\r
1214 >>\r
1215 | L:LateCheckFlag << \r
1216 if (!mCompatibleMode) {\r
1217 gCVfrErrorHandle.HandleWarning (\r
1218 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1219 L->getLine(),\r
1220 L->getText()\r
1221 );\r
1222 }\r
1223 >>\r
30fdf114
LG
1224 ;\r
1225\r
52302d4d 1226vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :\r
30fdf114
LG
1227 <<\r
1228 UINT32 Idx;\r
1229 UINT32 LineNo;\r
1230 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
1231 CHAR8 *VarIdStr = NULL;\r
1232 CHAR8 *VarStr = NULL;\r
1233 CHAR8 *SName = NULL;\r
1234 CHAR8 *TName = NULL;\r
1235 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
1236 EFI_IFR_TYPE_VALUE Dummy = gZeroEfiIfrTypeValue;\r
4afd3d04 1237 EFI_GUID *VarGuid = NULL;\r
30fdf114
LG
1238 >>\r
1239 (\r
1240 SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
1241 OpenBracket I1:Number CloseBracket <<\r
e4ac870f 1242 Idx = _STOU32(I1->getText(), I1->getLine());\r
30fdf114
LG
1243 _STRCAT(&VarIdStr, "[");\r
1244 _STRCAT(&VarIdStr, I1->getText());\r
1245 _STRCAT(&VarIdStr, "]");\r
1246 >>\r
1247 <<\r
74bbe31b 1248 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
30fdf114 1249 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
74bbe31b 1250 gCVfrDataStorage.DeclareBufferVarStore (\r
30fdf114
LG
1251 SName,\r
1252 &mFormsetGuid,\r
1253 &gCVfrVarDataTypeDB,\r
1254 SName,\r
1255 EFI_VARSTORE_ID_INVALID,\r
1256 FALSE\r
1257 );\r
74bbe31b 1258 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
30fdf114 1259 }\r
52302d4d
LG
1260 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1261 _PCATCH(VfrReturnCode, SN1);\r
74bbe31b 1262 _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
52302d4d 1263 }\r
4234283c
LG
1264\r
1265 QuestVarIdStr = VarIdStr;\r
30fdf114
LG
1266 >>\r
1267 )\r
1268 |\r
1269 (\r
1270 SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
1271 <<\r
74bbe31b 1272 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
30fdf114 1273 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
74bbe31b 1274 gCVfrDataStorage.DeclareBufferVarStore (\r
30fdf114
LG
1275 SName,\r
1276 &mFormsetGuid,\r
1277 &gCVfrVarDataTypeDB,\r
1278 SName,\r
1279 EFI_VARSTORE_ID_INVALID,\r
1280 FALSE\r
1281 );\r
74bbe31b 1282 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
30fdf114 1283 }\r
52302d4d
LG
1284 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1285 _PCATCH(VfrReturnCode, SN2);\r
74bbe31b 1286 VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
52302d4d 1287 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
74bbe31b 1288 _PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
52302d4d
LG
1289 _STRCAT(&VarStr, TName);\r
1290 }\r
30fdf114
LG
1291 }\r
1292 >>\r
1293\r
1294 (\r
1295 "." <<\r
52302d4d
LG
1296 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
1297 _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
1298 }\r
30fdf114
LG
1299 _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
1300 >>\r
1301 SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
1302 {\r
1303 OpenBracket I2:Number CloseBracket <<\r
e4ac870f 1304 Idx = _STOU32(I2->getText(), I2->getLine());\r
30fdf114
LG
1305 if (mCompatibleMode) Idx --;\r
1306 if (Idx > 0) {\r
1307 //\r
1308 // Idx == 0, [0] can be ignored.\r
1309 // Array[0] is same to Array for unify the varid name to cover [0]\r
1310 //\r
1311 _STRCAT(&VarIdStr, "[");\r
1312 _STRCAT(&VarIdStr, I2->getText());\r
1313 _STRCAT(&VarIdStr, "]");\r
1314 }\r
1315 _STRCAT(&VarStr, "[");\r
1316 _STRCAT(&VarStr, I2->getText());\r
1317 _STRCAT(&VarStr, "]");\r
1318 >>\r
1319 }\r
1320 )* <<\r
1321 switch (VarStoreType) {\r
1322 case EFI_VFR_VARSTORE_EFI:\r
74bbe31b 1323 _PCATCH(gCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
30fdf114
LG
1324 break;\r
1325 case EFI_VFR_VARSTORE_BUFFER:\r
1326 _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
74bbe31b 1327 VarGuid = gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
30fdf114
LG
1328 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
1329 SName,\r
4afd3d04 1330 VarGuid,\r
30fdf114
LG
1331 NULL),\r
1332 SN2->getLine());\r
1333 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (\r
1334 'a',\r
1335 SName,\r
4afd3d04 1336 VarGuid,\r
30fdf114
LG
1337 NULL,\r
1338 $Info.mVarType,\r
1339 $Info.mInfo.mVarOffset,\r
1340 $Info.mVarTotalSize,\r
1341 Dummy),\r
1342 SN2->getLine());\r
74bbe31b 1343 _PCATCH(gCVfrDataStorage.AddBufferVarStoreFieldInfo(&$Info ),SN2->getLine());\r
30fdf114
LG
1344 break;\r
1345 case EFI_VFR_VARSTORE_NAME:\r
1346 default: break;\r
1347 }\r
1348\r
1349 QuestVarIdStr = VarIdStr;\r
1350 if (VarStr != NULL) {delete VarStr;}\r
1351 >>\r
1352 )\r
1353 ;\r
1354\r
1355vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] :\r
1356 <<\r
1357 UINT32 Idx;\r
1358 VarIdStr = NULL; LineNo = 0;\r
1359 >>\r
1360 (\r
1361 SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>\r
1362 OpenBracket I1:Number CloseBracket <<\r
1363 _STRCAT(&VarIdStr, "[");\r
1364 _STRCAT(&VarIdStr, I1->getText());\r
1365 _STRCAT(&VarIdStr, "]");\r
1366 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask);\r
1367 if (mConstantOnlyInExpression) {\r
1368 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r
1369 }\r
1370 >>\r
1371 )\r
1372 |\r
1373 (\r
1374 SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>\r
1375 (\r
1376 "." << \r
1377 _STRCAT (&VarIdStr, ".");\r
1378 if (mConstantOnlyInExpression) {\r
1379 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);\r
1380 }\r
1381 >>\r
1382 SF:StringIdentifier << _STRCAT (&VarIdStr, SF->getText()); >>\r
1383 {\r
1384 OpenBracket I2:Number CloseBracket <<\r
e4ac870f 1385 Idx = _STOU32(I2->getText(), I2->getLine());\r
30fdf114
LG
1386 if (mCompatibleMode) Idx --;\r
1387 if (Idx > 0) {\r
1388 //\r
1389 // Idx == 0, [0] can be ignored.\r
1390 // Array[0] is same to Array\r
1391 //\r
1392 _STRCAT(&VarIdStr, "[");\r
1393 _STRCAT(&VarIdStr, I2->getText());\r
1394 _STRCAT(&VarIdStr, "]");\r
1395 }\r
1396 >>\r
1397 }\r
1398 )*\r
1399 << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
1400 )\r
1401 ;\r
1402\r
ddaf640f
ED
1403vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
1404 << \r
1afac950
ED
1405 EFI_GUID Guid;\r
1406 BOOLEAN Negative = FALSE;\r
1407 BOOLEAN IntDecStyle = FALSE;\r
1408 CIfrNumeric *NumericQst = NULL;\r
1409 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
1410 NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
1411 IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
1412 }\r
ddaf640f
ED
1413 UINT8 *Type8 = (UINT8 *) &Value;\r
1414 UINT16 *Type16 = (UINT16 *) &Value;\r
1415 UINT32 *Type32 = (UINT32 *) &Value;\r
1416 UINT64 *Type64 = (UINT64 *) &Value;\r
1417 UINT16 Index = 0;\r
1418 ListType = FALSE;\r
4234283c 1419 >>\r
1afac950
ED
1420 {\r
1421 "\-" << Negative = TRUE; >>\r
1422 }\r
30fdf114
LG
1423 N1:Number <<\r
1424 switch ($Type) {\r
1425 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1afac950
ED
1426 $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
1427 if (IntDecStyle) {\r
1428 if (Negative) {\r
1429 if ($Value.u8 > 0x80) {\r
1430 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
1431 }\r
1432 } else {\r
1433 if ($Value.u8 > 0x7F) {\r
1434 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
1435 }\r
1436 }\r
1437 }\r
1438 if (Negative) {\r
1439 $Value.u8 = ~$Value.u8 + 1;\r
1440 }\r
30fdf114
LG
1441 break;\r
1442 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1afac950
ED
1443 $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
1444 if (IntDecStyle) {\r
1445 if (Negative) {\r
1446 if ($Value.u16 > 0x8000) {\r
1447 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
1448 }\r
1449 } else {\r
1450 if ($Value.u16 > 0x7FFF) {\r
1451 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
1452 }\r
1453 }\r
1454 }\r
1455 if (Negative) {\r
1456 $Value.u16 = ~$Value.u16 + 1;\r
1457 }\r
30fdf114
LG
1458 break;\r
1459 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
e4ac870f 1460 $Value.u32 = _STOU32(N1->getText(), N1->getLine());\r
1afac950
ED
1461 if (IntDecStyle) {\r
1462 if (Negative) {\r
1463 if ($Value.u32 > 0x80000000) {\r
1464 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
1465 }\r
1466 } else {\r
1467 if ($Value.u32 > 0X7FFFFFFF) {\r
1468 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
1469 }\r
1470 }\r
1471 }\r
1472 if (Negative) {\r
1473 $Value.u32 = ~$Value.u32 + 1;\r
1474 }\r
30fdf114
LG
1475 break;\r
1476 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
e4ac870f 1477 $Value.u64 = _STOU64(N1->getText(), N1->getLine());\r
1afac950
ED
1478 if (IntDecStyle) {\r
1479 if (Negative) {\r
1480 if ($Value.u64 > 0x8000000000000000) {\r
1481 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
1482 }\r
1483 } else {\r
1484 if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
1485 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
1486 }\r
1487 }\r
1488 }\r
1489 if (Negative) {\r
1490 $Value.u64 = ~$Value.u64 + 1;\r
1491 }\r
30fdf114
LG
1492 break;\r
1493 case EFI_IFR_TYPE_BOOLEAN :\r
e4ac870f 1494 $Value.b = _STOU8(N1->getText(), N1->getLine());\r
30fdf114
LG
1495 break;\r
1496 case EFI_IFR_TYPE_STRING :\r
e4ac870f 1497 $Value.string = _STOU16(N1->getText(), N1->getLine());\r
30fdf114
LG
1498 break;\r
1499 case EFI_IFR_TYPE_TIME :\r
1500 case EFI_IFR_TYPE_DATE :\r
4234283c 1501 case EFI_IFR_TYPE_REF :\r
30fdf114
LG
1502 default :\r
1503 break;\r
1504 }\r
1505 >>\r
1506 | B1:True << $Value.b = TRUE; >>\r
1507 | B2:False << $Value.b = FALSE; >>\r
e4ac870f
LG
1508 | O1:One << $Value.u8 = _STOU8(O1->getText(), O1->getLine()); >>\r
1509 | O2:Ones << $Value.u64 = _STOU64(O2->getText(), O2->getLine()); >>\r
1510 | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >>\r
1511 | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >>\r
1512 | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >>\r
4234283c 1513 | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
e4ac870f
LG
1514 << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
1515 | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
ddaf640f
ED
1516 | "\{" << ListType = TRUE; >>\r
1517 L1:Number << \r
1518 switch (Type) {\r
1519 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1520 Type8[Index] = _STOU8(L1->getText(), L1->getLine());\r
1521 break;\r
1522 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1523 Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
1524 break;\r
1525 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1526 Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
1527 break;\r
1528 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1529 Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
1530 break;\r
1531 default:\r
1532 break;\r
1533 }\r
1534 Index++;\r
1535 >>\r
1536 (\r
1537 "," \r
1538 L2:Number << \r
1539 switch (Type) {\r
1540 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1541 Type8[Index] = _STOU8(L2->getText(), L2->getLine());\r
1542 break;\r
1543 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1544 Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
1545 break;\r
1546 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1547 Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
1548 break;\r
1549 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1550 Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
1551 break;\r
1552 default:\r
1553 break;\r
1554 }\r
1555 Index++;\r
1556 >>\r
1557 )*\r
1558 "\}" \r
30fdf114
LG
1559 ;\r
1560\r
1561//*****************************************************************************\r
1562//\r
1563// the syntax of form definition\r
1564//\r
1565vfrFormDefinition :\r
1566 << CIfrForm FObj; >>\r
1567 F:Form << FObj.SetLineNo(F->getLine()); >>\r
e4ac870f
LG
1568 FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
1569 Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >>\r
30fdf114
LG
1570 (\r
1571 vfrStatementImage |\r
1572 vfrStatementLocked |\r
1573 vfrStatementRules |\r
1574 vfrStatementDefault |\r
1575 vfrStatementStat |\r
1576 vfrStatementQuestions |\r
1577 vfrStatementConditional |\r
1578 vfrStatementLabel |\r
1579 vfrStatementBanner |\r
1580 // Just for framework vfr compatibility\r
da92f276 1581 vfrStatementInvalid |\r
4234283c 1582 vfrStatementExtension |\r
e2a5feb9
ED
1583 vfrStatementModal |\r
1584 vfrStatementRefreshEvent ";"\r
30fdf114
LG
1585 )*\r
1586 E:EndForm <<\r
1587 if (mCompatibleMode) {\r
1588 //\r
1589 // Add Label for Framework Vfr\r
1590 //\r
1591 CIfrLabel LObj1;\r
1592 LObj1.SetLineNo(E->getLine());\r
1593 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
1594 CIfrLabel LObj2;\r
1595 LObj2.SetLineNo(E->getLine());\r
1596 LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0\r
1597 CIfrLabel LObj3;\r
1598 LObj3.SetLineNo(E->getLine());\r
1599 LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
30fdf114 1600 }\r
b36d134f 1601\r
4afd3d04 1602 {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}\r
30fdf114
LG
1603 >>\r
1604 ";"\r
1605 ;\r
1606\r
52302d4d
LG
1607vfrFormMapDefinition :\r
1608 << \r
1609 CIfrFormMap *FMapObj = NULL;\r
1610 UINT32 FormMapMethodNumber = 0;\r
1611 EFI_GUID Guid;\r
1612 >>\r
1613 F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>\r
e4ac870f 1614 FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>\r
52302d4d
LG
1615 (\r
1616 MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"\r
e4ac870f 1617 MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >>\r
52302d4d
LG
1618 )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>\r
1619 (\r
1620 vfrStatementImage |\r
1621 vfrStatementLocked |\r
1622 vfrStatementRules |\r
1623 vfrStatementDefault |\r
1624 vfrStatementStat |\r
1625 vfrStatementQuestions |\r
1626 vfrStatementConditional |\r
1627 vfrStatementLabel |\r
da92f276 1628 vfrStatementBanner |\r
4234283c 1629 vfrStatementExtension |\r
e2a5feb9
ED
1630 vfrStatementModal |\r
1631 vfrStatementRefreshEvent ";"\r
52302d4d
LG
1632 )*\r
1633 E:EndForm << CRT_END_OP (E); >>\r
1634 ";"\r
1635 ;\r
1636\r
30fdf114
LG
1637vfrStatementRules :\r
1638 << CIfrRule RObj; >>\r
1639 R:Rule << RObj.SetLineNo(R->getLine()); >>\r
1640 S1:StringIdentifier "," <<\r
1641 mCVfrRulesDB.RegisterRule (S1->getText());\r
1642 RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));\r
1643 >>\r
1644 vfrStatementExpression[0]\r
1645 E:EndRule << CRT_END_OP (E); >>\r
1646 ";"\r
1647 ;\r
1648\r
1649vfrStatementDefault :\r
1650 <<\r
1651 BOOLEAN IsExp = FALSE;\r
ddaf640f
ED
1652 UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
1653 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
4afd3d04
LG
1654 CIfrDefault *DObj = NULL;\r
1655 CIfrDefault2 *DObj2 = NULL;\r
30fdf114
LG
1656 EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
1657 CHAR8 *VarStoreName = NULL;\r
1658 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04
LG
1659 UINT32 Size = 0;\r
1660 EFI_GUID *VarGuid = NULL;\r
ddaf640f
ED
1661 BOOLEAN ArrayType = FALSE;\r
1662 UINT8 *Type8 = (UINT8 *) ValueList;\r
1663 UINT16 *Type16 = (UINT16 *) ValueList;\r
1664 UINT32 *Type32 = (UINT32 *) ValueList;\r
1665 UINT64 *Type64 = (UINT64 *) ValueList;\r
1afac950 1666 CIfrNumeric *NumericQst = NULL;\r
ddaf640f 1667\r
30fdf114 1668 >>\r
4afd3d04 1669 D:Default \r
30fdf114
LG
1670 (\r
1671 (\r
ddaf640f 1672 "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," \r
4afd3d04 1673 << \r
a709adfa
LG
1674 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
1675 //check default value is valid for Numeric Opcode\r
1afac950
ED
1676 NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
1677 if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {\r
1678 switch (_GET_CURRQEST_DATATYPE()) {\r
1679 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4e4872bc
ED
1680 if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
1681 ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
1afac950
ED
1682 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
1683 }\r
1684 break;\r
1685 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4e4872bc
ED
1686 if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
1687 ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
1afac950
ED
1688 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
1689 }\r
1690 break;\r
1691 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4e4872bc
ED
1692 if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
1693 ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
1afac950
ED
1694 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
1695 }\r
1696 break;\r
1697 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4e4872bc
ED
1698 if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
1699 ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
1afac950
ED
1700 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
1701 }\r
1702 break;\r
1703 default:\r
1704 break;\r
1705 }\r
1706 } else {\r
4e4872bc 1707 if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
1afac950
ED
1708 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
1709 }\r
fd171542 1710 }\r
1711 }\r
4afd3d04
LG
1712 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1713 _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
1714 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
ddaf640f
ED
1715 } else if (ArrayType) {\r
1716 switch (_GET_CURRQEST_DATATYPE()) {\r
1717 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1718 while (Type8[Size] != 0) {\r
1719 Size++;\r
1720 }\r
1721 break;\r
1722 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1723 while (Type16[Size] != 0) {\r
1724 Size++;\r
1725 }\r
1726 Size *= sizeof (UINT16);\r
1727 break;\r
1728\r
1729 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1730 while (Type32[Size] != 0) {\r
1731 Size++;\r
1732 }\r
1733 Size *= sizeof (UINT32);\r
1734 break;\r
1735\r
1736 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1737 while (Type64[Size] != 0) {\r
1738 Size++;\r
1739 }\r
1740 Size *= sizeof (UINT64);\r
1741 break;\r
1742\r
1743 default:\r
1744 break;\r
1745 }\r
4afd3d04
LG
1746 } else {\r
1747 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
1748 }\r
1749 Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
1750 DObj = new CIfrDefault ((UINT8)Size);\r
1751 DObj->SetLineNo(D->getLine());\r
ddaf640f
ED
1752 if (ArrayType) {\r
1753 DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
2bf63b20
DB
1754 } else if (gIsStringOp) {\r
1755 DObj->SetType (EFI_IFR_TYPE_STRING);\r
ddaf640f
ED
1756 } else {\r
1757 DObj->SetType (_GET_CURRQEST_DATATYPE());\r
1758 }\r
1759 DObj->SetValue(*Val);\r
fd171542 1760 >>\r
4afd3d04
LG
1761 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
1762 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
30fdf114
LG
1763 )\r
1764 {\r
4afd3d04 1765 DefaultStore "=" SN:StringIdentifier "," << \r
74bbe31b 1766 _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN);\r
4afd3d04
LG
1767 if (DObj != NULL) {\r
1768 DObj->SetDefaultId (DefaultId); \r
1769 } \r
1770\r
1771 if (DObj2 != NULL) {\r
1772 DObj2->SetDefaultId (DefaultId); \r
1773 }\r
1774 >>\r
30fdf114
LG
1775 }\r
1776 <<\r
4afd3d04
LG
1777 CheckDuplicateDefaultValue (DefaultId, D);\r
1778 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
74bbe31b
DB
1779 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
1780 VarGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1781 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
30fdf114 1782 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
74bbe31b 1783 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
30fdf114
LG
1784 DefaultId,\r
1785 _GET_CURRQEST_VARTINFO(),\r
1786 VarStoreName,\r
4afd3d04 1787 VarGuid,\r
30fdf114 1788 _GET_CURRQEST_DATATYPE (),\r
ddaf640f
ED
1789 *Val),\r
1790 D->getLine()\r
1791 );\r
4afd3d04 1792 }\r
30fdf114 1793 }\r
4afd3d04
LG
1794 if (DObj != NULL) {delete DObj;} \r
1795 if (DObj2 != NULL) {delete DObj2;} \r
30fdf114
LG
1796 >>\r
1797 )\r
1798 ;\r
1799\r
1800vfrStatementStat :\r
1801 vfrStatementSubTitle |\r
1802 vfrStatementStaticText |\r
1803 vfrStatementCrossReference\r
1804 ;\r
1805\r
1806vfrStatementQuestions :\r
1807 vfrStatementBooleanType |\r
1808 vfrStatementDate |\r
1809 vfrStatementNumericType |\r
1810 vfrStatementStringType |\r
1811 vfrStatementOrderedList |\r
1812 vfrStatementTime\r
1813 ;\r
1814\r
1815vfrStatementConditional :\r
1816 vfrStatementDisableIfStat |\r
1817 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif\r
1818 vfrStatementGrayOutIfStat |\r
1819 vfrStatementInconsistentIfStat //to be compatible for framework\r
1820 ;\r
1821\r
1822vfrStatementConditionalNew :\r
1823 vfrStatementDisableIfStat |\r
1824 vfrStatementSuppressIfStatNew |\r
1825 vfrStatementGrayOutIfStatNew |\r
1826 vfrStatementInconsistentIfStat //to be compatible for framework\r
1827 ;\r
1828\r
1829vfrStatementSuppressIfStat :\r
1830 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
1831 | vfrStatementSuppressIfStatNew\r
1832 ;\r
1833\r
1834vfrStatementGrayOutIfStat :\r
1835 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
1836 | vfrStatementGrayOutIfStatNew\r
1837 ;\r
1838\r
1839vfrStatementInvalid :\r
1840 (\r
1841 vfrStatementInvalidHidden |\r
1842 vfrStatementInvalidInventory |\r
1843 vfrStatementInvalidSaveRestoreDefaults\r
1844 )\r
1845 << _CRT_OP (TRUE); >>\r
1846 ;\r
1847\r
1848flagsField :\r
05154781
ED
1849 Number \r
1850 | InteractiveFlag \r
1851 | ManufacturingFlag \r
1852 | DefaultFlag \r
1853 | ResetRequiredFlag \r
366430c7 1854 | ReconnectRequiredFlag\r
05154781
ED
1855 | N:NVAccessFlag << \r
1856 if (!mCompatibleMode) {\r
1857 gCVfrErrorHandle.HandleWarning (\r
1858 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1859 N->getLine(),\r
1860 N->getText()\r
1861 );\r
1862 }\r
1863 >>\r
1864 | L:LateCheckFlag << \r
1865 if (!mCompatibleMode) {\r
1866 gCVfrErrorHandle.HandleWarning (\r
1867 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1868 L->getLine(),\r
1869 L->getText()\r
1870 );\r
1871 }\r
1872 >> \r
30fdf114
LG
1873 ;\r
1874\r
1875vfrStatementValue :\r
1876 << CIfrValue VObj; >>\r
1877 V:Value << VObj.SetLineNo(V->getLine()); >>\r
fd171542 1878 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
30fdf114
LG
1879 ;\r
1880\r
52302d4d
LG
1881vfrStatementRead :\r
1882 << CIfrRead RObj; >>\r
1883 R:Read << RObj.SetLineNo(R->getLine()); >>\r
1884 vfrStatementExpression[0] ";" \r
1885 ;\r
1886\r
1887vfrStatementWrite :\r
1888 << CIfrWrite WObj; >>\r
1889 W:Write << WObj.SetLineNo(W->getLine()); >>\r
1890 vfrStatementExpression[0] ";" \r
1891 ;\r
1892\r
30fdf114
LG
1893vfrStatementSubTitle :\r
1894 << CIfrSubtitle SObj; >>\r
1895 L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r
e4ac870f 1896 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
1897 {\r
1898 "," FLAGS "=" vfrSubtitleFlags[SObj]\r
1899 }\r
e8a47801
LG
1900 (\r
1901 {vfrStatementStatTagList "," }\r
1902 E:";" << CRT_END_OP (E); >>\r
1903 |\r
1904 { "," vfrStatementStatTagList}\r
1905 { "," (vfrStatementStat | vfrStatementQuestions)*}\r
15be099a 1906 D: EndSubtitle ";" << CRT_END_OP (D); >>\r
e8a47801 1907 )\r
30fdf114
LG
1908 ;\r
1909\r
1910vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
1911 << UINT8 LFlags = 0; >>\r
1912 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r
1913 << _PCATCH(SObj.SetFlags (LFlags)); >>\r
1914 ;\r
1915\r
1916subtitleFlagsField [UINT8 & Flags] :\r
e4ac870f 1917 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
1918 | "HORIZONTAL" << $Flags |= 0x01; >>\r
1919 ;\r
1920\r
1921vfrStatementStaticText :\r
1922 <<\r
1923 UINT8 Flags = 0;\r
1924 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1925 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;\r
1926 >>\r
1927 T:Text\r
1928 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
1929 Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
1930 {\r
e4ac870f 1931 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>\r
30fdf114
LG
1932 }\r
1933 {\r
1934 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
1935 "," Key "=" KN:Number\r
1936 }\r
1937 <<\r
1938 if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
1d218f83
ED
1939 if (TxtTwo != EFI_STRING_ID_INVALID) {\r
1940 gCVfrErrorHandle.HandleWarning (\r
1941 VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
1942 S3->getLine(),\r
1943 S3->getText()\r
1944 );\r
1945 }\r
30fdf114
LG
1946 CIfrAction AObj;\r
1947 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
1948 AObj.SetLineNo (F->getLine());\r
1949 AObj.SetQuestionId (QId);\r
e4ac870f
LG
1950 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
1951 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
30fdf114
LG
1952 _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
1953 AssignQuestionKey (AObj, KN);\r
1954 CRT_END_OP (KN);\r
1955 } else {\r
1956 CIfrText TObj;\r
1957 TObj.SetLineNo (T->getLine());\r
e4ac870f
LG
1958 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
1959 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
1960 TObj.SetTextTwo (TxtTwo);\r
1961 }\r
1962 >>\r
1963 { "," vfrStatementStatTagList }\r
1964 ";"\r
1965 ;\r
1966\r
1967staticTextFlagsField[UINT8 & HFlags] :\r
e4ac870f 1968 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1969 | questionheaderFlagsField[HFlags]\r
1970 ;\r
1971\r
1972vfrStatementCrossReference :\r
1973 vfrStatementGoto |\r
1974 vfrStatementResetButton\r
1975 ;\r
1976\r
1977vfrStatementGoto :\r
1978 <<\r
4234283c 1979 UINT8 RefType = 5;\r
52302d4d
LG
1980 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
1981 EFI_GUID FSId = {0,};\r
30fdf114
LG
1982 EFI_FORM_ID FId;\r
1983 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1984 UINT32 BitMask;\r
1985 CIfrQuestionHeader *QHObj = NULL;\r
0d2711a6 1986 CIfrOpHeader *OHObj = NULL;\r
30fdf114
LG
1987 CIfrRef *R1Obj = NULL;\r
1988 CIfrRef2 *R2Obj = NULL;\r
1989 CIfrRef3 *R3Obj = NULL;\r
1990 CIfrRef4 *R4Obj = NULL;\r
4234283c 1991 CIfrRef5 *R5Obj = NULL;\r
30fdf114
LG
1992 >>\r
1993 G:Goto\r
4234283c 1994 {\r
30fdf114
LG
1995 (\r
1996 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
1997 FormSetGuid "=" guidDefinition[FSId] ","\r
1998 FormId "=" F1:Number ","\r
1999 Question "=" QN1:Number ","\r
2000 <<\r
2001 RefType = 4;\r
e4ac870f
LG
2002 DevPath = _STOSID(P->getText(), P->getLine());\r
2003 FId = _STOFID(F1->getText(), F1->getLine());\r
2004 QId = _STOQID(QN1->getText(), QN1->getLine());\r
30fdf114
LG
2005 >>\r
2006 )\r
2007 |\r
2008 (\r
2009 FormSetGuid "=" guidDefinition[FSId] ","\r
2010 FormId "=" F2:Number ","\r
2011 Question "=" QN2:Number ","\r
2012 <<\r
2013 RefType = 3;\r
e4ac870f
LG
2014 FId = _STOFID(F2->getText(), F2->getLine());\r
2015 QId = _STOQID(QN2->getText(), QN2->getLine());\r
30fdf114
LG
2016 >>\r
2017 )\r
2018 |\r
2019 (\r
e4ac870f 2020 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
30fdf114
LG
2021 Question "="\r
2022 (\r
0d2711a6
LG
2023 QN3:StringIdentifier "," << \r
2024 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
2025 if (QId == EFI_QUESTION_ID_INVALID) {\r
2026 _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
2027 }\r
2028 >>\r
e4ac870f 2029 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>\r
30fdf114
LG
2030 )\r
2031 )\r
2032 |\r
2033 (\r
2034 F4:Number "," <<\r
2035 RefType = 1;\r
e4ac870f 2036 FId = _STOFID(F4->getText(), F4->getLine());\r
30fdf114
LG
2037 >>\r
2038 )\r
4234283c 2039 }\r
30fdf114
LG
2040 <<\r
2041 switch (RefType) {\r
4234283c
LG
2042 case 5:\r
2043 {\r
2044 R5Obj = new CIfrRef5;\r
2045 QHObj = R5Obj;\r
0d2711a6 2046 OHObj = R5Obj;\r
4234283c
LG
2047 R5Obj->SetLineNo(G->getLine());\r
2048 break;\r
2049 }\r
30fdf114
LG
2050 case 4:\r
2051 {\r
2052 R4Obj = new CIfrRef4;\r
2053 QHObj = R4Obj;\r
0d2711a6 2054 OHObj = R4Obj;\r
30fdf114
LG
2055 R4Obj->SetLineNo(G->getLine());\r
2056 R4Obj->SetDevicePath (DevPath);\r
2057 R4Obj->SetFormSetId (FSId);\r
2058 R4Obj->SetFormId (FId);\r
2059 R4Obj->SetQuestionId (QId);\r
2060 break;\r
2061 }\r
2062 case 3:\r
2063 {\r
2064 R3Obj = new CIfrRef3;\r
2065 QHObj = R3Obj;\r
0d2711a6 2066 OHObj = R3Obj;\r
30fdf114
LG
2067 R3Obj->SetLineNo(G->getLine());\r
2068 R3Obj->SetFormSetId (FSId);\r
2069 R3Obj->SetFormId (FId);\r
2070 R3Obj->SetQuestionId (QId);\r
2071 break;\r
2072 }\r
2073 case 2:\r
2074 {\r
2075 R2Obj = new CIfrRef2;\r
2076 QHObj = R2Obj;\r
0d2711a6 2077 OHObj = R2Obj;\r
30fdf114
LG
2078 R2Obj->SetLineNo(G->getLine());\r
2079 R2Obj->SetFormId (FId);\r
0d2711a6 2080 R2Obj->SetQuestionId (QId);\r
30fdf114
LG
2081 break;\r
2082 }\r
2083 case 1:\r
2084 {\r
2085 R1Obj = new CIfrRef;\r
2086 QHObj = R1Obj;\r
0d2711a6 2087 OHObj = R1Obj;\r
30fdf114
LG
2088 R1Obj->SetLineNo(G->getLine());\r
2089 R1Obj->SetFormId (FId);\r
2090 break;\r
2091 }\r
2092 default: break;\r
2093 }\r
2094 >>\r
4afd3d04
LG
2095 vfrQuestionHeader[*QHObj, QUESTION_REF] <<\r
2096 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2097 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
2098 }\r
2099 >>\r
30fdf114
LG
2100 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
2101 {\r
2102 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
2103 }\r
0d2711a6
LG
2104 {\r
2105 E:"," \r
2106 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
2107 }\r
4234283c 2108 ";" << 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
2109 ;\r
2110\r
2111vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
2112 << UINT8 HFlags = 0; >>\r
2113 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
2114 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
2115 ;\r
2116\r
2117gotoFlagsField[UINT8 & HFlags] :\r
e4ac870f 2118 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2119 | questionheaderFlagsField[HFlags]\r
2120 ;\r
2121\r
2122getStringId :\r
2123 "STRING_TOKEN" "\("\r
2124 IdVal:Number\r
2125 "\)"\r
2126 ;\r
2127\r
2128vfrStatementResetButton :\r
2129 <<\r
2130 CIfrResetButton RBObj;\r
2131 UINT16 DefaultId;\r
2132 >>\r
2133 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
2134 DefaultStore\r
2135 "=" N:StringIdentifier "," <<\r
74bbe31b 2136 _PCATCH(gCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
30fdf114
LG
2137 RBObj.SetDefaultId (DefaultId);\r
2138 >>\r
2139 vfrStatementHeader[&RBObj] ","\r
2140 { vfrStatementStatTagList "," }\r
2141 E:EndResetButton << CRT_END_OP (E); >>\r
2142 ";"\r
2143 ;\r
2144\r
2145vfrStatementBooleanType :\r
2146 vfrStatementCheckBox |\r
2147 vfrStatementAction\r
2148 ;\r
2149\r
2150//*****************************************************\r
2151// Syntax of checkbox\r
2152//\r
2153// Example:\r
2154// checkbox\r
2155// varid = MySTestData.mField1,\r
2156// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
2157// help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
2158// flags = CHECKBOX_DEFAULT | CALLBACK,\r
2159// default value = TRUE, defaultstore = MyDefaultStore,\r
2160// endcheckbox;\r
2161//\r
2162vfrStatementCheckBox :\r
2163 <<\r
2164 CIfrCheckBox CBObj;\r
2165 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
2166 CHAR8 *VarStoreName = NULL;\r
2167 UINT32 DataTypeSize;\r
4afd3d04 2168 EFI_GUID *VarStoreGuid = NULL;\r
30fdf114
LG
2169 >>\r
2170 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
2171 vfrQuestionHeader[CBObj] "," << //check data type\r
4afd3d04
LG
2172 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2173 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
2174 }\r
2175 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2176 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
2177 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2178 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
74bbe31b 2179 } else if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
4afd3d04
LG
2180 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
2181 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
2182 }\r
30fdf114
LG
2183 }\r
2184 >>\r
2185 {\r
2186 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
2187 <<\r
4afd3d04 2188 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
74bbe31b
DB
2189 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
2190 VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
4afd3d04
LG
2191 Val.b = TRUE;\r
2192 if (CBObj.GetFlags () & 0x01) {\r
2193 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
2194 _PCATCH(\r
74bbe31b 2195 gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
4afd3d04
LG
2196 EFI_HII_DEFAULT_CLASS_STANDARD,\r
2197 _GET_CURRQEST_VARTINFO(),\r
2198 VarStoreName,\r
2199 VarStoreGuid,\r
2200 _GET_CURRQEST_DATATYPE (),\r
2201 Val\r
2202 ),\r
2203 VFR_RETURN_SUCCESS,\r
2204 L,\r
2205 "No standard default storage found"\r
2206 );\r
2207 }\r
2208 if (CBObj.GetFlags () & 0x02) {\r
2209 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
2210 _PCATCH(\r
74bbe31b 2211 gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
4afd3d04
LG
2212 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
2213 _GET_CURRQEST_VARTINFO(),\r
2214 VarStoreName,\r
2215 VarStoreGuid,\r
2216 _GET_CURRQEST_DATATYPE (),\r
2217 Val\r
2218 ),\r
2219 VFR_RETURN_SUCCESS,\r
2220 L,\r
2221 "No manufacturing default storage found"\r
2222 );\r
2223 }\r
30fdf114
LG
2224 }\r
2225 >>\r
2226 }\r
2227 {\r
2228 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
2229 }\r
2230 vfrStatementQuestionOptionList\r
2231 E:EndCheckBox << CRT_END_OP (E); >>\r
2232 ";"\r
2233 ;\r
2234\r
2235vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
2236 <<\r
2237 UINT8 LFlags = 0;\r
2238 UINT8 HFlags = 0;\r
2239 >>\r
2240 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
2241 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2242 ;\r
2243\r
2244checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
2245 N:Number <<\r
2246 if (mCompatibleMode) {\r
2247 //\r
2248 // set question flag\r
2249 //\r
e4ac870f 2250 $LFlags |= _STOU8(N->getText(), N->getLine());\r
30fdf114 2251 } else {\r
e4ac870f 2252 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
30fdf114
LG
2253 }\r
2254 >>\r
2255 | D:"DEFAULT" <<\r
2256 if (mCompatibleMode) {\r
2257 //\r
2258 // set question Default flag\r
2259 //\r
2260 $LFlags |= 0x01;\r
2261 } else {\r
2262 _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
2263 }\r
2264 >>\r
2265 | M:"MANUFACTURING" <<\r
2266 if (mCompatibleMode) {\r
2267 //\r
2268 // set question MFG flag\r
2269 //\r
2270 $LFlags |= 0x02;\r
2271 } else {\r
2272 _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
2273 }\r
2274 >>\r
2275 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
2276 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r
2277 | questionheaderFlagsField[HFlags]\r
2278 ;\r
2279\r
2280//*****************************************************\r
2281// Syntax of action\r
2282//\r
2283// Example:\r
2284// action\r
2285// prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r
2286// help = STRING_TOKEN(STR_ACTION_HELP),\r
2287// flags = CALLBACK,\r
2288// config = STRING_TOKEN(STR_ACTION_CONFIG),\r
2289// endaction;\r
2290//\r
2291vfrStatementAction :\r
2292 << CIfrAction AObj; >>\r
2293 L:Action << AObj.SetLineNo(L->getLine()); >>\r
4234283c 2294 vfrQuestionHeader[AObj] ","\r
30fdf114 2295 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
e4ac870f 2296 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2297 vfrStatementQuestionTagList\r
2298 E:EndAction << CRT_END_OP (E); >>\r
2299 ";"\r
2300 ;\r
2301\r
2302vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
2303 << UINT8 HFlags = 0; >>\r
2304 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
2305 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
2306 ;\r
2307\r
2308actionFlagsField[UINT8 & HFlags] :\r
e4ac870f 2309 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2310 | questionheaderFlagsField[HFlags]\r
2311 ;\r
2312\r
2313vfrStatementDate :\r
2314 <<\r
2315 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2316 CHAR8 *VarIdStr[3] = {NULL, };\r
2317 CIfrDate DObj;\r
2318 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2319 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
30fdf114
LG
2320 >>\r
2321 L:Date << DObj.SetLineNo(L->getLine()); >>\r
2322 (\r
2323 (\r
4afd3d04
LG
2324 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<\r
2325 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2326 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
2327 }\r
2328 >>\r
30fdf114
LG
2329 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
2330 vfrStatementQuestionOptionList\r
2331 )\r
2332 |\r
2333 (\r
2334 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
2335 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
2336 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
2337 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
2338 minMaxDateStepDefault[Val.date, 0]\r
2339\r
2340 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
2341 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
2342 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2343 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2344 minMaxDateStepDefault[Val.date, 1]\r
2345\r
2346 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
2347 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
2348 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
2349 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
2350 minMaxDateStepDefault[Val.date, 2]\r
2bcc713e 2351 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
30fdf114
LG
2352 <<\r
2353 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2354 DObj.SetQuestionId (QId);\r
2355 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
e4ac870f
LG
2356 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
2357 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\r
30fdf114
LG
2358 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2359 >>\r
4afd3d04 2360 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2361 )\r
2362 ( vfrStatementInconsistentIf )*\r
2363 )\r
2364 E:EndDate << CRT_END_OP (E); >>\r
2365 ";"\r
2366 ;\r
2367\r
2368minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
fd171542 2369 Minimum "=" MinN:Number ","\r
2370 Maximum "=" MaxN:Number ","\r
30fdf114
LG
2371 { "step" "=" Number "," }\r
2372 {\r
2373 "default" "=" N:Number "," <<\r
2374 switch (KeyValue) {\r
fd171542 2375 case 0: \r
e4ac870f
LG
2376 D.Year = _STOU16(N->getText(), N->getLine());\r
2377 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
fd171542 2378 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
2379 }\r
2380 break;\r
2381 case 1: \r
e4ac870f 2382 D.Month = _STOU8(N->getText(), N->getLine()); \r
fd171542 2383 if (D.Month < 1 || D.Month > 12) {\r
2384 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
2385 }\r
2386 break;\r
2387 case 2: \r
e4ac870f 2388 D.Day = _STOU8(N->getText(), N->getLine()); \r
fd171542 2389 if (D.Day < 1 || D.Day > 31) {\r
2390 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
2391 }\r
2392 break;\r
30fdf114
LG
2393 }\r
2394 >>\r
2395 }\r
2396 ;\r
2397\r
2398vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
2399 << UINT8 LFlags = 0; >>\r
2400 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
2401 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2402 ;\r
2403\r
2404dateFlagsField [UINT8 & Flags] :\r
e4ac870f 2405 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2406 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r
2407 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r
2408 | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r
2409 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2410 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2411 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2412 ;\r
2413\r
2414vfrStatementNumericType :\r
2415 vfrStatementNumeric |\r
2416 vfrStatementOneOf\r
2417 ;\r
2418\r
2419vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
2420 <<\r
2421 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
2422 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
2423 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
2424 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
1afac950
ED
2425 BOOLEAN IntDecStyle = FALSE;\r
2426 CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
2427 if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {\r
2428 IntDecStyle = TRUE;\r
2429 }\r
2430 BOOLEAN MinNegative = FALSE;\r
2431 BOOLEAN MaxNegative = FALSE;\r
30fdf114 2432 >>\r
1afac950
ED
2433 Minimum "=" \r
2434 {\r
2435 "\-" << MinNegative = TRUE; >>\r
2436 }\r
2437 I:Number "," <<\r
2438 if (!IntDecStyle && MinNegative) {\r
2439 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
2440 }\r
a709adfa 2441 switch (_GET_CURRQEST_DATATYPE()) {\r
1afac950
ED
2442 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
2443 MinU8 = _STOU64(I->getText(), I->getLine());\r
2444 if (IntDecStyle) {\r
2445 if (MinNegative) { \r
2446 if (MinU8 > 0x8000000000000000) {\r
2447 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2448 }\r
2449 } else {\r
2450 if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
2451 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2452 }\r
2453 }\r
2454 }\r
2455 if (MinNegative) {\r
2456 MinU8 = ~MinU8 + 1;\r
2457 }\r
2458 break;\r
2459 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
2460 MinU4 = _STOU32(I->getText(), I->getLine());\r
2461 if (IntDecStyle) {\r
2462 if (MinNegative) { \r
2463 if (MinU4 > 0x80000000) {\r
2464 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2465 }\r
2466 } else {\r
2467 if (MinU4 > 0x7FFFFFFF) {\r
2468 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2469 }\r
2470 }\r
2471 }\r
2472 if (MinNegative) {\r
2473 MinU4 = ~MinU4 + 1;\r
2474 }\r
2475 break;\r
2476 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
2477 MinU2 = _STOU16(I->getText(), I->getLine());\r
2478 if (IntDecStyle) {\r
2479 if (MinNegative) { \r
2480 if (MinU2 > 0x8000) {\r
2481 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
2482 }\r
2483 } else {\r
2484 if (MinU2 > 0x7FFF) {\r
2485 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
2486 }\r
2487 }\r
2488 }\r
2489 if (MinNegative) {\r
2490 MinU2 = ~MinU2 + 1;\r
2491 }\r
2492 break;\r
2493 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
2494 MinU1 = _STOU8(I->getText(), I->getLine());\r
2495 if (IntDecStyle) {\r
2496 if (MinNegative) { \r
2497 if (MinU1 > 0x80) {\r
2498 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
2499 }\r
2500 } else {\r
2501 if (MinU1 > 0x7F) {\r
2502 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
2503 }\r
2504 }\r
2505 }\r
2506 if (MinNegative) {\r
2507 MinU1 = ~MinU1 + 1;\r
2508 }\r
2509 break;\r
30fdf114
LG
2510 }\r
2511 >>\r
1afac950
ED
2512 Maximum "=" \r
2513 { \r
2514 "\-" << MaxNegative = TRUE; >>\r
2515 }\r
2516 A:Number "," <<\r
2517 if (!IntDecStyle && MaxNegative) {\r
2518 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
2519 }\r
2520\r
a709adfa 2521 switch (_GET_CURRQEST_DATATYPE()) {\r
fd171542 2522 case EFI_IFR_TYPE_NUM_SIZE_64 : \r
e4ac870f 2523 MaxU8 = _STOU64(A->getText(), A->getLine()); \r
1afac950
ED
2524 if (IntDecStyle) {\r
2525 if (MaxNegative) {\r
2526 if (MaxU8 > 0x8000000000000000) {\r
2527 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2528 }\r
2529 } else {\r
2530 if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
2531 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2532 }\r
2533 }\r
2534 }\r
2535 if (MaxNegative) {\r
2536 MaxU8 = ~MaxU8 + 1;\r
2537 }\r
2538 if (IntDecStyle) {\r
2539 if ((INT64) MaxU8 < (INT64) MinU8) {\r
2540 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2541 }\r
2542 } else {\r
2543 if (MaxU8 < MinU8) {\r
2544 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2545 }\r
fd171542 2546 }\r
2547 break;\r
2548 case EFI_IFR_TYPE_NUM_SIZE_32 : \r
1afac950
ED
2549 MaxU4 = _STOU32(A->getText(), A->getLine());\r
2550 if (IntDecStyle) {\r
2551 if (MaxNegative) {\r
2552 if (MaxU4 > 0x80000000) {\r
2553 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2554 }\r
2555 } else {\r
2556 if (MaxU4 > 0x7FFFFFFF) {\r
2557 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2558 }\r
2559 }\r
2560 }\r
2561 if (MaxNegative) {\r
2562 MaxU4 = ~MaxU4 + 1;\r
2563 }\r
2564 if (IntDecStyle) {\r
2565 if ((INT32) MaxU4 < (INT32) MinU4) {\r
2566 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2567 }\r
2568 } else {\r
2569 if (MaxU4 < MinU4) {\r
2570 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2571 }\r
fd171542 2572 }\r
2573 break;\r
2574 case EFI_IFR_TYPE_NUM_SIZE_16 : \r
e4ac870f 2575 MaxU2 = _STOU16(A->getText(), A->getLine()); \r
1afac950
ED
2576 if (IntDecStyle) {\r
2577 if (MaxNegative) {\r
2578 if (MaxU2 > 0x8000) {\r
2579 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
2580 }\r
2581 } else {\r
2582 if (MaxU2 > 0x7FFF) {\r
2583 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
2584 }\r
2585 }\r
2586 }\r
2587 if (MaxNegative) {\r
2588 MaxU2 = ~MaxU2 + 1;\r
2589 }\r
2590 if (IntDecStyle) {\r
2591 if ((INT16) MaxU2 < (INT16) MinU2) {\r
2592 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2593 }\r
2594 } else {\r
2595 if (MaxU2 < MinU2) {\r
2596 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2597 }\r
fd171542 2598 }\r
2599 break;\r
2600 case EFI_IFR_TYPE_NUM_SIZE_8 : \r
1afac950
ED
2601 MaxU1 = _STOU8(A->getText(), A->getLine());\r
2602 if (IntDecStyle) {\r
2603 if (MaxNegative) {\r
2604 if (MaxU1 > 0x80) {\r
2605 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
2606 }\r
2607 } else {\r
2608 if (MaxU1 > 0x7F) {\r
2609 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
2610 }\r
2611 }\r
2612 }\r
2613 if (MaxNegative) {\r
2614 MaxU1 = ~MaxU1 + 1;\r
2615 }\r
2616 if (IntDecStyle) {\r
2617 if ((INT8) MaxU1 < (INT8) MinU1) {\r
2618 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2619 }\r
2620 } else {\r
2621 if (MaxU1 < MinU1) {\r
2622 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2623 }\r
fd171542 2624 }\r
2625 break;\r
30fdf114
LG
2626 }\r
2627 >>\r
2628 {\r
2629 STEP "=" S:Number ","\r
2630 <<\r
a709adfa 2631 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2632 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
2633 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
2634 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
2635 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
30fdf114
LG
2636 }\r
2637 >>\r
2638 }\r
2639 <<\r
a709adfa 2640 switch (_GET_CURRQEST_DATATYPE()) {\r
30fdf114
LG
2641 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
2642 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
2643 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
2644 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
2645 }\r
2646 >>\r
2647 ;\r
2648\r
2649vfrStatementNumeric :\r
2650 <<\r
2651 CIfrNumeric NObj;\r
4afd3d04
LG
2652 UINT32 DataTypeSize;\r
2653 BOOLEAN IsSupported = TRUE;\r
2654 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2655 >>\r
2656 L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
2657 vfrQuestionHeader[NObj] "," << // check data type\r
4afd3d04
LG
2658 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2659 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
2660 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2661 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
2662 }\r
2663 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2664 }\r
30fdf114
LG
2665 >>\r
2666 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
2667 {\r
2668 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
2669 }\r
4afd3d04 2670 vfrSetMinMaxStep[NObj] <<\r
b36d134f 2671 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2672 //\r
2673 // Base on the type to know the actual used size,shrink the buffer \r
2674 // size allocate before.\r
2675 //\r
2676 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2677 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2678 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2679 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
2680 default: \r
2681 IsSupported = FALSE;\r
b36d134f
LG
2682 break;\r
2683 }\r
4afd3d04 2684 NObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2685 if (!IsSupported) {\r
2686 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2687 }\r
4afd3d04
LG
2688 >>\r
2689 vfrStatementQuestionOptionList\r
2690 E:EndNumeric << \r
b36d134f
LG
2691 CRT_END_OP (E); \r
2692 >>\r
30fdf114
LG
2693 ";"\r
2694 ;\r
2695\r
2696vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
2697 <<\r
a709adfa 2698 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2699 UINT8 HFlags = 0;\r
a709adfa 2700 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2701 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2702 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2703 >>\r
e4ac870f 2704 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
a709adfa
LG
2705 <<\r
2706 //check data type flag\r
4afd3d04 2707 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
74bbe31b 2708 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
4afd3d04
LG
2709 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2710 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2711 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2712 }\r
2713 } else {\r
2714 // update data type for name/value store\r
2715 UINT32 DataTypeSize;\r
2716 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2717 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2718 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2719 }\r
4afd3d04 2720 } else if (IsSetType){\r
a709adfa 2721 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa 2722 }\r
e4ac870f 2723 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
a709adfa 2724 >>\r
30fdf114
LG
2725 ;\r
2726\r
e4ac870f
LG
2727numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
2728 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
4afd3d04
LG
2729 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
2730 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
2731 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
2732 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
e4ac870f
LG
2733 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
2734 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
2735 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
30fdf114
LG
2736 | questionheaderFlagsField[HFlags]\r
2737 ;\r
2738\r
2739vfrStatementOneOf :\r
2740 <<\r
2741 CIfrOneOf OObj;\r
2742 UINT32 DataTypeSize;\r
4afd3d04
LG
2743 BOOLEAN IsSupported = TRUE;\r
2744 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2745 >>\r
2746 L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
2747 vfrQuestionHeader[OObj] "," << //check data type\r
4afd3d04
LG
2748 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2749 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
2750 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2751 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
2752 }\r
2753 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2754 }\r
30fdf114
LG
2755 >>\r
2756 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
2757 {\r
2758 vfrSetMinMaxStep[OObj]\r
2759 }\r
4afd3d04 2760 <<\r
b36d134f 2761 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2762 //\r
2763 // Base on the type to know the actual used size,shrink the buffer \r
2764 // size allocate before.\r
2765 //\r
2766 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2767 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2768 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2769 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
b36d134f 2770 default:\r
4afd3d04 2771 IsSupported = FALSE;\r
b36d134f
LG
2772 break;\r
2773 }\r
4afd3d04 2774 OObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2775 if (!IsSupported) {\r
2776 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2777 }\r
4afd3d04
LG
2778 >>\r
2779 vfrStatementQuestionOptionList\r
2780 E:EndOneOf <<\r
b36d134f
LG
2781 CRT_END_OP (E); \r
2782 >>\r
30fdf114
LG
2783 ";"\r
2784 ;\r
2785\r
2786vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
2787 <<\r
a709adfa 2788 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2789 UINT8 HFlags = 0;\r
a709adfa 2790 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2791 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2792 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2793 >>\r
e4ac870f 2794 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
a709adfa
LG
2795 <<\r
2796 //check data type flag\r
4afd3d04 2797 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
74bbe31b 2798 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
4afd3d04
LG
2799 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2800 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2801 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2802 }\r
2803 } else {\r
2804 // update data type for Name/Value store\r
2805 UINT32 DataTypeSize;\r
2806 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2807 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2808 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2809 }\r
4afd3d04 2810 } else if (IsSetType){\r
a709adfa 2811 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa
LG
2812 }\r
2813 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
2814 >>\r
30fdf114
LG
2815 ;\r
2816\r
2817vfrStatementStringType :\r
2818 vfrStatementString |\r
2819 vfrStatementPassword\r
2820 ;\r
2821\r
2822vfrStatementString :\r
2823 <<\r
2824 CIfrString SObj;\r
40d841f6
LG
2825 UINT32 VarArraySize;\r
2826 UINT8 StringMinSize;\r
2827 UINT8 StringMaxSize;\r
30fdf114 2828 >>\r
2bf63b20 2829 L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>>\r
30fdf114
LG
2830 vfrQuestionHeader[SObj] ","\r
2831 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
2832 {\r
2833 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
2834 }\r
40d841f6
LG
2835 MinSize "=" MIN:Number "," << \r
2836 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2837 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());\r
2838 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {\r
40d841f6
LG
2839 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
2840 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
2841 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
2842 }\r
2843 SObj.SetMinSize (StringMinSize);\r
2844 >>\r
2845 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2846 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());\r
2847 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {\r
40d841f6
LG
2848 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
2849 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
2850 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
2851 } else if (StringMaxSize < StringMinSize) {\r
2852 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
2853 }\r
2854 SObj.SetMaxSize (StringMaxSize);\r
2855 >>\r
30fdf114 2856 vfrStatementQuestionOptionList\r
2bf63b20 2857 E:EndString << CRT_END_OP (E); gIsStringOp = FALSE;>>\r
30fdf114
LG
2858 ";"\r
2859 ;\r
2860\r
2861vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
2862 <<\r
2863 UINT8 LFlags = 0;\r
2864 UINT8 HFlags = 0;\r
2865 >>\r
2866 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
2867 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2868 ;\r
2869\r
2870stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2871 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2872 | "MULTI_LINE" << $LFlags = 0x01; >>\r
2873 | questionheaderFlagsField[HFlags]\r
2874 ;\r
2875\r
2876vfrStatementPassword :\r
2877 <<\r
2878 CIfrPassword PObj;\r
40d841f6
LG
2879 UINT32 VarArraySize;\r
2880 UINT16 PasswordMinSize;\r
2881 UINT16 PasswordMaxSize;\r
30fdf114
LG
2882 >>\r
2883 L:Password << PObj.SetLineNo(L->getLine()); >>\r
2884 vfrQuestionHeader[PObj] ","\r
2885 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
2886 {\r
2887 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
2888 }\r
40d841f6
LG
2889 MinSize "=" MIN:Number "," << \r
2890 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2891 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());\r
2892 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {\r
40d841f6
LG
2893 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
2894 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
2895 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
2896 }\r
2897 PObj.SetMinSize (PasswordMinSize);\r
2898 >>\r
2899 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2900 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());\r
2901 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {\r
40d841f6
LG
2902 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
2903 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
2904 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
2905 } else if (PasswordMaxSize < PasswordMinSize) {\r
2906 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
2907 }\r
2908 PObj.SetMaxSize (PasswordMaxSize);\r
2909 >>\r
30fdf114
LG
2910 { Encoding "=" Number "," }\r
2911 vfrStatementQuestionOptionList\r
2912 E:EndPassword << CRT_END_OP (E); >>\r
2913 ";"\r
2914 ;\r
2915\r
2916vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
2917 << UINT8 HFlags = 0; >>\r
2918 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
2919 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
2920 ;\r
2921\r
2922passwordFlagsField [UINT8 & HFlags] :\r
e4ac870f 2923 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2924 | questionheaderFlagsField[HFlags]\r
2925 ;\r
2926\r
2927vfrStatementOrderedList :\r
2928 <<\r
2929 CIfrOrderedList OLObj;\r
40d841f6 2930 UINT32 VarArraySize;\r
30fdf114 2931 >>\r
ddaf640f 2932 L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
30fdf114 2933 vfrQuestionHeader[OLObj] ","\r
40d841f6
LG
2934 << \r
2935 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
2936 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
2937 >>\r
30fdf114 2938 {\r
40d841f6 2939 MaxContainers "=" M:Number "," << \r
e4ac870f 2940 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\r
40d841f6 2941 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
e4ac870f 2942 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {\r
40d841f6
LG
2943 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
2944 }\r
e4ac870f 2945 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));\r
40d841f6 2946 >>\r
30fdf114 2947 }\r
3a8e175b 2948 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
30fdf114 2949 vfrStatementQuestionOptionList\r
ddaf640f 2950 E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
30fdf114
LG
2951 ";"\r
2952 ;\r
2953\r
2954vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
2955 <<\r
2956 UINT8 HFlags = 0;\r
2957 UINT8 LFlags = 0;\r
2958 >>\r
2959 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
2960 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2961 ;\r
2962\r
2963orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2964 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2965 | "UNIQUE" << $LFlags |= 0x01; >>\r
2966 | "NOEMPTY" << $LFlags |= 0x02; >>\r
2967 | questionheaderFlagsField[HFlags]\r
2968 ;\r
2969\r
2970vfrStatementTime :\r
2971 <<\r
2972 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2973 CHAR8 *VarIdStr[3] = {NULL, };\r
2974 CIfrTime TObj;\r
2975 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2976 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
30fdf114
LG
2977 >>\r
2978 L:Time << TObj.SetLineNo(L->getLine()); >>\r
2979 (\r
2980 (\r
4afd3d04
LG
2981 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<\r
2982 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2983 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
2984 }\r
2985 >>\r
30fdf114 2986 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
40d841f6 2987 vfrStatementQuestionOptionList\r
30fdf114
LG
2988 )\r
2989 |\r
2990 (\r
2991 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
2992 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
2993 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
2994 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
2995 minMaxTimeStepDefault[Val.time, 0]\r
2996\r
2997 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
2998 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
2999 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
3000 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
3001 minMaxTimeStepDefault[Val.time, 1]\r
3002\r
3003 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
3004 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
3005 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
3006 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
3007 minMaxTimeStepDefault[Val.time, 2]\r
2bcc713e 3008 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
30fdf114
LG
3009 <<\r
3010 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
3011 TObj.SetQuestionId (QId);\r
3012 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
e4ac870f
LG
3013 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
3014 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\r
30fdf114
LG
3015 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
3016 >>\r
4afd3d04 3017 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
3018 )\r
3019 ( vfrStatementInconsistentIf )*\r
3020 )\r
3021 E:EndTime << CRT_END_OP (E); >>\r
3022 ";"\r
3023 ;\r
3024\r
3025minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
3026 Minimum "=" Number ","\r
3027 Maximum "=" Number ","\r
3028 { "step" "=" Number "," }\r
3029 {\r
3030 "default" "=" N:Number "," <<\r
3031 switch (KeyValue) {\r
fd171542 3032 case 0: \r
e4ac870f 3033 T.Hour = _STOU8(N->getText(), N->getLine()); \r
fd171542 3034 if (T.Hour > 23) {\r
3035 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
3036 }\r
3037 break;\r
3038 case 1: \r
e4ac870f 3039 T.Minute = _STOU8(N->getText(), N->getLine()); \r
fd171542 3040 if (T.Minute > 59) {\r
3041 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
3042 }\r
3043 break;\r
3044 case 2: \r
e4ac870f 3045 T.Second = _STOU8(N->getText(), N->getLine());\r
fd171542 3046 if (T.Second > 59) {\r
3047 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
3048 }\r
3049 break;\r
30fdf114
LG
3050 }\r
3051 >>\r
3052 }\r
3053 ;\r
3054\r
3055vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
3056 << UINT8 LFlags = 0; >>\r
3057 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
3058 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
3059 ;\r
3060\r
3061timeFlagsField [UINT8 & Flags] :\r
e4ac870f 3062 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3063 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r
3064 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r
3065 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r
3066 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
3067 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
3068 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
3069 ;\r
3070\r
3071vfrStatementQuestionTag :\r
3072 vfrStatementStatTag "," |\r
3073 vfrStatementInconsistentIf |\r
3074 vfrStatementNoSubmitIf |\r
3075 vfrStatementDisableIfQuest |\r
3076 vfrStatementRefresh |\r
da92f276 3077 vfrStatementVarstoreDevice |\r
4234283c 3078 vfrStatementExtension |\r
e2a5feb9 3079 vfrStatementRefreshEvent "," |\r
ea0f6464 3080 vfrStatementWarningIf\r
30fdf114
LG
3081 ;\r
3082\r
3083vfrStatementQuestionTagList :\r
3084 ( vfrStatementQuestionTag )*\r
3085 ;\r
3086\r
3087vfrStatementQuestionOptionTag :\r
3088 vfrStatementSuppressIfQuest |\r
3089 vfrStatementGrayOutIfQuest |\r
3090 vfrStatementValue |\r
3091 vfrStatementDefault |\r
52302d4d
LG
3092 vfrStatementRead |\r
3093 vfrStatementWrite |\r
30fdf114
LG
3094 vfrStatementOptions\r
3095 ;\r
3096\r
3097vfrStatementQuestionOptionList :\r
3098 (\r
3099 vfrStatementQuestionTag |\r
3100 vfrStatementQuestionOptionTag\r
3101 )*\r
3102 ;\r
3103\r
3104vfrStatementStatList :\r
3105 vfrStatementStat |\r
3106 vfrStatementQuestions |\r
3107 vfrStatementConditionalNew |\r
3108 vfrStatementLabel |\r
da92f276 3109 vfrStatementExtension |\r
30fdf114
LG
3110 // Just for framework vfr compatibility\r
3111 vfrStatementInvalid\r
3112 ;\r
3113\r
3114vfrStatementStatListOld :\r
3115 vfrStatementStat |\r
3116 vfrStatementQuestions |\r
3117 vfrStatementLabel |\r
3118 // Just for framework vfr compatibility\r
3119 vfrStatementInvalid\r
3120 ;\r
3121\r
3122vfrStatementDisableIfStat :\r
3123 << \r
3124 CIfrDisableIf DIObj; \r
30fdf114
LG
3125 >>\r
3126 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 3127 vfrStatementExpression[0] ";" \r
30fdf114
LG
3128 ( vfrStatementStatList )*\r
3129 E:EndIf << CRT_END_OP (E); >>\r
3130 ";"\r
3131 ;\r
3132\r
3133vfrStatementInconsistentIfStat :\r
3134 << CIfrInconsistentIf IIObj; >>\r
3135 L:InconsistentIf <<\r
3136 if (!mCompatibleMode) {\r
3137 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3138 }\r
3139 IIObj.SetLineNo(L->getLine());\r
3140 >>\r
e4ac870f 3141 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3142 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3143 vfrStatementExpression[0]\r
3144 E:EndIf << CRT_END_OP (E); >>\r
3145 ";"\r
3146 ;\r
3147\r
3148//\r
3149// Compatible for framework vfr file\r
3150//\r
3151vfrStatementgrayoutIfSuppressIf:\r
3152 << CIfrSuppressIf SIObj; >>\r
3153 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3154 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3155 vfrStatementExpression[0]\r
3156 ";"\r
3157 ;\r
3158\r
3159vfrStatementsuppressIfGrayOutIf:\r
3160 << CIfrGrayOutIf GOIObj; >>\r
3161 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3162 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3163 vfrStatementExpression[0]\r
3164 ";"\r
3165 ;\r
3166\r
3167vfrStatementSuppressIfStatNew :\r
3168 << CIfrSuppressIf SIObj;>>\r
3169 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3170 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3171 vfrStatementExpression[0]\r
3172 ";"\r
3173 ( vfrStatementStatList )*\r
3174 E: EndIf ";" << CRT_END_OP (E); >>\r
3175 ;\r
3176\r
3177vfrStatementGrayOutIfStatNew :\r
3178 << CIfrGrayOutIf GOIObj;>>\r
3179 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3180 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3181 vfrStatementExpression[0]\r
3182 ";"\r
3183 ( vfrStatementStatList )*\r
3184 E: EndIf ";" << CRT_END_OP (E); >>\r
3185 ;\r
3186\r
3187vfrStatementSuppressIfStatOld :\r
3188 <<\r
3189 CIfrSuppressIf SIObj;\r
3190 BOOLEAN GrayOutExist = FALSE;\r
3191 >>\r
3192 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3193 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3194 vfrStatementExpression[0]\r
3195 ";"\r
3196 {\r
3197 vfrStatementsuppressIfGrayOutIf\r
3198 << GrayOutExist = TRUE; >>\r
3199 }\r
3200 ( vfrStatementStatListOld )*\r
3201 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
3202 ;\r
3203\r
3204vfrStatementGrayOutIfStatOld :\r
3205 <<\r
3206 CIfrGrayOutIf GOIObj;\r
3207 BOOLEAN SuppressExist = FALSE;\r
3208 >>\r
3209 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3210 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3211 vfrStatementExpression[0]\r
3212 ";"\r
3213 {\r
3214 vfrStatementgrayoutIfSuppressIf\r
3215 << SuppressExist = TRUE; >>\r
3216 }\r
3217 ( vfrStatementStatListOld )*\r
3218 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
3219 ;\r
3220\r
3221vfrImageTag :\r
3222 << CIfrImage IObj; >>\r
e4ac870f 3223 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
30fdf114
LG
3224 ;\r
3225\r
3226vfrLockedTag :\r
3227 << CIfrLocked LObj; >>\r
3228 L:Locked << LObj.SetLineNo(L->getLine()); >>\r
3229 ;\r
3230\r
4234283c
LG
3231vfrModalTag :\r
3232 << CIfrModal MObj; >>\r
3233 L:Modal << MObj.SetLineNo(L->getLine()); >>\r
3234 ;\r
3235\r
30fdf114
LG
3236vfrStatementStatTag :\r
3237 vfrImageTag |\r
3238 vfrLockedTag\r
3239 ;\r
3240\r
3241vfrStatementStatTagList :\r
3242 vfrStatementStatTag ( "," vfrStatementStatTag )*\r
3243 ;\r
3244\r
3245vfrStatementImage :\r
3246 vfrImageTag\r
3247 ";"\r
3248 ;\r
3249\r
4234283c
LG
3250vfrStatementModal :\r
3251 vfrModalTag\r
3252 ";"\r
3253 ;\r
3254\r
30fdf114
LG
3255vfrStatementLocked :\r
3256 vfrLockedTag\r
3257 ";"\r
3258 ;\r
3259\r
3260vfrStatementInconsistentIf :\r
3261 << CIfrInconsistentIf IIObj; >>\r
3262 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3263 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3264 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3265 vfrStatementExpression[0]\r
c0c300a1 3266 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3267 ;\r
3268\r
3269vfrStatementNoSubmitIf :\r
3270 << CIfrNoSubmitIf NSIObj; >>\r
3271 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3272 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3273 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3274 vfrStatementExpression[0]\r
c0c300a1 3275 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3276 ;\r
3277\r
ea0f6464
LG
3278vfrStatementWarningIf :\r
3279 << CIfrWarningIf WIObj; >>\r
3280 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>\r
e4ac870f
LG
3281 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
3282 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
ea0f6464 3283 vfrStatementExpression[0]\r
c0c300a1 3284 E:EndIf {";"} << CRT_END_OP (E); >>\r
ea0f6464
LG
3285 ;\r
3286\r
30fdf114
LG
3287vfrStatementDisableIfQuest :\r
3288 << \r
3289 CIfrDisableIf DIObj; \r
30fdf114
LG
3290 >>\r
3291 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 3292 vfrStatementExpression[0] ";"\r
30fdf114 3293 vfrStatementQuestionOptionList\r
c0c300a1 3294 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3295 ;\r
3296\r
3297vfrStatementRefresh :\r
3298 << CIfrRefresh RObj; >>\r
3299 L:Refresh << RObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3300 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\r
30fdf114
LG
3301 ;\r
3302\r
4234283c
LG
3303vfrStatementRefreshEvent :\r
3304 <<\r
3305 CIfrRefreshId RiObj;\r
3306 EFI_GUID Guid;\r
3307 >>\r
3308 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
e2a5feb9 3309 "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >>\r
4234283c
LG
3310 ;\r
3311\r
30fdf114
LG
3312vfrStatementVarstoreDevice :\r
3313 << CIfrVarStoreDevice VDObj; >>\r
3314 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3315 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3316 ;\r
3317\r
3318vfrStatementSuppressIfQuest :\r
3319 << CIfrSuppressIf SIObj; >>\r
3320 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3321 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3322 vfrStatementExpression[0] ";"\r
3323 vfrStatementQuestionOptionList\r
c0c300a1 3324 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3325 ;\r
3326\r
3327vfrStatementGrayOutIfQuest :\r
3328 << CIfrGrayOutIf GOIObj; >>\r
3329 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3330 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3331 vfrStatementExpression[0] ";"\r
3332 vfrStatementQuestionOptionList\r
c0c300a1 3333 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3334 ;\r
3335\r
3336vfrStatementOptions :\r
3337 vfrStatementOneOfOption\r
3338 ;\r
3339\r
3340vfrStatementOneOfOption :\r
3341 <<\r
ddaf640f
ED
3342 UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3343 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
30fdf114 3344 CHAR8 *VarStoreName = NULL;\r
4afd3d04
LG
3345 UINT32 Size = 0;\r
3346 BOOLEAN TypeError = FALSE;\r
3347 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
3348 EFI_GUID *VarStoreGuid = NULL;\r
ddaf640f
ED
3349 BOOLEAN ArrayType = FALSE;\r
3350 CIfrOneOfOption *OOOObj;\r
3351 UINT8 *Type8 = (UINT8 *) ValueList;\r
3352 UINT16 *Type16 = (UINT16 *) ValueList;\r
3353 UINT32 *Type32 = (UINT32 *) ValueList;\r
3354 UINT64 *Type64 = (UINT64 *) ValueList;\r
30fdf114 3355 >>\r
4afd3d04 3356 L:Option << \r
ddaf640f 3357 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
4afd3d04
LG
3358 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
3359 }\r
ddaf640f 3360\r
4afd3d04 3361 >>\r
ddaf640f
ED
3362 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," \r
3363 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
a709adfa
LG
3364 << \r
3365 if (gCurrentMinMaxData != NULL) {\r
3366 //set min/max value for oneof opcode\r
3367 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
3368 switch (_GET_CURRQEST_DATATYPE()) {\r
3369 case EFI_IFR_TYPE_NUM_SIZE_64:\r
ddaf640f 3370 gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
a709adfa
LG
3371 break;\r
3372 case EFI_IFR_TYPE_NUM_SIZE_32:\r
ddaf640f 3373 gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
a709adfa
LG
3374 break;\r
3375 case EFI_IFR_TYPE_NUM_SIZE_16:\r
ddaf640f 3376 gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
a709adfa
LG
3377 break;\r
3378 case EFI_IFR_TYPE_NUM_SIZE_8:\r
ddaf640f 3379 gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
a709adfa
LG
3380 break;\r
3381 default:\r
3382 break;\r
3383 }\r
3384 }\r
ddaf640f
ED
3385 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
3386 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
3387 } else if (ArrayType) {\r
3388 switch (_GET_CURRQEST_DATATYPE()) {\r
3389 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
3390 while (Type8[Size] != 0) {\r
3391 Size++;\r
3392 }\r
3393 break;\r
3394 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
3395 while (Type16[Size] != 0) {\r
3396 Size++;\r
3397 }\r
3398 Size *= sizeof (UINT16);\r
3399 break;\r
3400 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
3401 while (Type32[Size] != 0) {\r
3402 Size++;\r
3403 }\r
3404 Size *= sizeof (UINT32);\r
3405 break;\r
3406 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
3407 while (Type64[Size] != 0) {\r
3408 Size++;\r
3409 }\r
3410 Size *= sizeof (UINT64);\r
3411 break;\r
3412 default:\r
3413 break;\r
3414 }\r
3415 } else {\r
3416 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
3417 }\r
3418 if (ReturnCode != VFR_RETURN_SUCCESS) {\r
3419 _PCATCH (ReturnCode, L->getLine());\r
3420 }\r
3421\r
3422 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
3423 OOOObj = new CIfrOneOfOption((UINT8)Size);\r
3424 OOOObj->SetLineNo(L->getLine());\r
3425 OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
3426 if (ArrayType) {\r
3427 OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
3428 } else {\r
3429 OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
3430 }\r
3431 OOOObj->SetValue (*Val); \r
a709adfa 3432 >>\r
ddaf640f 3433 F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
30fdf114 3434 <<\r
ddaf640f
ED
3435 //\r
3436 // Array type only for default type OneOfOption.\r
3437 //\r
3438 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
3439 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
3440 }\r
3441\r
3442 //\r
3443 // Clear the default flag if the option not use array value but has default flag.\r
3444 //\r
3445 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
3446 OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
3447 }\r
3448\r
4afd3d04 3449 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
74bbe31b
DB
3450 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
3451 VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
ddaf640f 3452 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
4afd3d04 3453 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
74bbe31b 3454 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
4afd3d04
LG
3455 EFI_HII_DEFAULT_CLASS_STANDARD,\r
3456 _GET_CURRQEST_VARTINFO(),\r
3457 VarStoreName,\r
3458 VarStoreGuid,\r
3459 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3460 *Val\r
4afd3d04
LG
3461 ), L->getLine());\r
3462 }\r
ddaf640f 3463 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
4afd3d04 3464 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
74bbe31b 3465 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
4afd3d04
LG
3466 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
3467 _GET_CURRQEST_VARTINFO(),\r
3468 VarStoreName,\r
3469 VarStoreGuid,\r
3470 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3471 *Val\r
4afd3d04
LG
3472 ), L->getLine());\r
3473 }\r
30fdf114
LG
3474 }\r
3475 >>\r
3476 {\r
3477 "," Key "=" KN:Number <<\r
3478 if (!mCompatibleMode) {\r
3479 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
3480 }\r
3481 //\r
3482 // Guid Option Key\r
3483 //\r
3484 CIfrOptionKey IfrOptionKey (\r
3485 gCurrentQuestion->QUESTION_ID(),\r
ddaf640f 3486 *Val,\r
e4ac870f 3487 _STOQID(KN->getText(), KN->getLine())\r
30fdf114
LG
3488 );\r
3489 SET_LINE_INFO (IfrOptionKey, KN);\r
3490 >>\r
3491 }\r
3492 (\r
ddaf640f 3493 T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
30fdf114 3494 )*\r
ddaf640f 3495 ";" << if (OOOObj != NULL) {delete OOOObj;} >>\r
30fdf114
LG
3496 ;\r
3497\r
3498vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
3499 <<\r
3500 UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
3501 UINT8 HFlags = 0;\r
3502 >>\r
3503 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
3504 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
3505 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
3506 ;\r
3507\r
3508oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 3509 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3510 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r
3511 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
3512 | InteractiveFlag << $HFlags |= 0x04; >>\r
30fdf114 3513 | ResetRequiredFlag << $HFlags |= 0x10; >>\r
366430c7 3514 | ReconnectRequiredFlag << $HFlags |= 0x40; >>\r
30fdf114
LG
3515 | ManufacturingFlag << $LFlags |= 0x20; >>\r
3516 | DefaultFlag << $LFlags |= 0x10; >>\r
05154781
ED
3517 | A:NVAccessFlag << \r
3518 if (mCompatibleMode) {\r
3519 $HFlags |= 0x08;\r
3520 } else {\r
3521 gCVfrErrorHandle.HandleWarning (\r
3522 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3523 A->getLine(),\r
3524 A->getText()\r
3525 );\r
3526 }\r
3527 >>\r
3528 | L:LateCheckFlag << \r
3529 if (mCompatibleMode) {\r
3530 $HFlags |= 0x20;\r
3531 } else {\r
3532 gCVfrErrorHandle.HandleWarning (\r
3533 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3534 L->getLine(),\r
3535 L->getText()\r
3536 );\r
3537 }\r
3538 >>\r
30fdf114
LG
3539 ;\r
3540\r
3541vfrStatementLabel :\r
3542 L:Label\r
3543 N:Number <<\r
3544 if (mCompatibleMode) {\r
3545 //\r
3546 // Add end Label for Framework Vfr\r
3547 //\r
3548 CIfrLabel LObj1;\r
3549 LObj1.SetLineNo(L->getLine());\r
3550 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
3551 }\r
3552\r
3553 {\r
3554 CIfrLabel LObj2;\r
3555 LObj2.SetLineNo(L->getLine());\r
e4ac870f 3556 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
30fdf114
LG
3557 }\r
3558 >>\r
3559 ";"\r
3560 ;\r
3561\r
3562vfrStatementBanner :\r
3563 << CIfrBanner BObj; >>\r
3564 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r
e4ac870f 3565 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3566 (\r
3567 (\r
e4ac870f 3568 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
30fdf114
LG
3569 Align\r
3570 (\r
3571 Left << BObj.SetAlign (0); >>\r
3572 | Center << BObj.SetAlign (1); >>\r
3573 | Right << BObj.SetAlign (2); >>\r
3574 ) ";"\r
3575 )\r
3576 |\r
3577 (\r
e4ac870f 3578 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
30fdf114
LG
3579 )\r
3580 )\r
3581 ;\r
3582\r
3583//******************************************************************************\r
3584//\r
3585// keep some syntax for compatibility but not generate any IFR object\r
3586//\r
3587vfrStatementInvalidHidden :\r
3588 L:Hidden <<\r
3589 if (!mCompatibleMode) {\r
3590 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3591 }\r
3592 >>\r
3593 Value "=" Number ","\r
3594 Key "=" Number ";"\r
3595 ;\r
3596\r
3597vfrStatementInvalidInconsistentIf :\r
3598 InconsistentIf\r
3599 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
3600 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3601 vfrStatementExpression[0]\r
3602 EndIf\r
3603 ";"\r
3604 ;\r
3605\r
3606vfrStatementInvalidInventory :\r
3607 L:Inventory <<\r
3608 if (!mCompatibleMode) {\r
3609 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3610 }\r
3611 >>\r
3612 Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3613 Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3614 {\r
3615 Text "=" "STRING_TOKEN" "\(" Number "\)"\r
3616 }\r
3617 ";"\r
3618 ;\r
3619\r
3620vfrStatementInvalidSaveRestoreDefaults :\r
3621 (\r
3622 L:Save <<\r
3623 if (!mCompatibleMode) {\r
3624 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3625 }\r
3626 >>\r
3627 |\r
3628 K:Restore <<\r
3629 if (!mCompatibleMode) {\r
3630 _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
3631 }\r
3632 >>\r
3633 )\r
3634 Defaults ","\r
3635 FormId "=" Number ","\r
3636 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3637 Help "=" "STRING_TOKEN" "\(" Number "\)"\r
3638 { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
3639 { "," Key "=" Number }\r
3640 ";"\r
3641 ;\r
3642\r
3643//******************************************************************************\r
3644//\r
3645// The syntax of expression\r
3646//\r
3647#token Dup("dup") "dup"\r
3648#token VarEqVal("vareqval") "vareqval"\r
3649#token Var("var") "var"\r
3650#token IdEqVal("ideqval") "ideqval"\r
3651#token IdEqId("ideqid") "ideqid"\r
3652#token IdEqValList("ideqvallist") "ideqvallist"\r
3653#token QuestionRef("questionref") "questionref"\r
3654#token RuleRef("ruleref") "ruleref"\r
3655#token StringRef("stringref") "stringref"\r
3656#token PushThis("pushthis") "pushthis"\r
a709adfa 3657#token Security("security") "security"\r
52302d4d 3658#token Get("get") "get"\r
30fdf114
LG
3659#token True("TRUE") "TRUE"\r
3660#token False("FALSE") "FALSE"\r
3661#token One("ONE") "ONE"\r
3662#token Ones("ONES") "ONES"\r
3663#token Zero("ZERO") "ZERO"\r
3664#token Undefined("UNDEFINED") "UNDEFINED"\r
3665#token Version("VERSION") "VERSION"\r
3666#token Length("length") "length"\r
3667#token AND("AND") "AND"\r
3668#token OR("OR") "OR"\r
3669#token NOT("NOT") "NOT"\r
52302d4d 3670#token Set("set") "set"\r
30fdf114
LG
3671#token BitWiseNot("~") "\~"\r
3672#token BoolVal("boolval") "boolval"\r
3673#token StringVal("stringval") "stringval"\r
3674#token UnIntVal("unintval") "unintval"\r
3675#token ToUpper("toupper") "toupper"\r
3676#token ToLower("tolower") "tolower"\r
3677#token Match("match") "match"\r
5d377616 3678#token Match2("match2") "match2"\r
30fdf114
LG
3679#token Catenate("catenate") "catenate"\r
3680#token QuestionRefVal("questionrefval") "questionrefval"\r
3681#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3682#token Map("map") "map"\r
4234283c 3683#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3684\r
3685//\r
3686// Root expression extension function called by other function.\r
3687//\r
3688vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3689 << 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
3690 andTerm[$RootLevel, $ExpOpCount]\r
3691 (\r
3692 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3693 )*\r
3694 <<\r
3695 //\r
3696 // Extend OpCode Scope only for the root expression.\r
3697 //\r
3698 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3699 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3700 CIfrEnd EObj;\r
52302d4d
LG
3701 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3702 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3703 }\r
3704 }\r
3705 }\r
52302d4d
LG
3706 \r
3707 if ($RootLevel == 0) {\r
3708 mCIfrOpHdrIndex --;\r
3709 }\r
30fdf114
LG
3710 >>\r
3711 ;\r
3712\r
3713//\r
3714// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3715// This funciton is only called by sub expression.\r
3716//\r
3717vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3718 andTerm[$RootLevel, $ExpOpCount]\r
3719 (\r
3720 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3721 )*\r
3722 ;\r
3723\r
3724andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3725 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3726 (\r
3727 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3728 )*\r
3729 ;\r
3730\r
3731bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3732 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3733 (\r
3734 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3735 )*\r
3736 ;\r
3737\r
3738bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3739 equalTerm[$RootLevel, $ExpOpCount]\r
3740 (\r
3741 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3742 )*\r
3743 ;\r
3744\r
3745equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3746 compareTerm[$RootLevel, $ExpOpCount]\r
3747 (\r
3748 (\r
3749 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3750 )\r
3751 |\r
3752 (\r
3753 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3754 )\r
3755 )*\r
3756 ;\r
3757\r
3758compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3759 shiftTerm[$RootLevel, $ExpOpCount]\r
3760 (\r
3761 (\r
3762 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3763 )\r
3764 |\r
3765 (\r
3766 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3767 )\r
3768 |\r
3769 (\r
3770 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3771 )\r
3772 |\r
3773 (\r
3774 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3775 )\r
3776 )*\r
3777 ;\r
3778\r
3779shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3780 addMinusTerm[$RootLevel, $ExpOpCount]\r
3781 (\r
3782 (\r
3783 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3784 )\r
3785 |\r
3786 (\r
3787 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3788 )\r
3789 )*\r
3790 ;\r
3791\r
3792addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3793 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3794 (\r
3795 (\r
3796 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3797 )\r
3798 |\r
3799 (\r
3800 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3801 )\r
3802 )*\r
3803 ;\r
3804\r
3805multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3806 castTerm[$RootLevel, $ExpOpCount]\r
3807 (\r
3808 (\r
3809 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3810 )\r
3811 |\r
3812 (\r
3813 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3814 )\r
3815 |\r
3816 (\r
3817 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3818 )\r
3819 )*\r
3820 ;\r
3821\r
3822castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3823 << UINT8 CastType = 0xFF; >>\r
3824 (\r
3825 L:"\("\r
3826 (\r
3827 Boolean << CastType = 0; >>\r
3828 | Uint64 << CastType = 1; >>\r
3829 | Uint32 << CastType = 1; >>\r
3830 | Uint16 << CastType = 1; >>\r
3831 | Uint8 << CastType = 1; >>\r
3832 )\r
3833 "\)"\r
3834 )*\r
3835 atomTerm[$RootLevel, $ExpOpCount]\r
3836 <<\r
3837 switch (CastType) {\r
3838 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3839 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3840 }\r
3841 >>\r
3842 ;\r
3843\r
3844atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3845 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3846 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
5d377616 3847 | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3848 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3849 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3850 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3851 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3852 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3853 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3854 | (\r
3855 L:NOT\r
3856 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3857 )\r
3858 ;\r
3859\r
3860vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3861 L:Catenate\r
3862 "\("\r
3863 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3864 ","\r
3865 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3866 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3867 ;\r
3868\r
3869vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3870 L:Match\r
3871 "\("\r
3872 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3873 ","\r
3874 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3875 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3876 ;\r
3877\r
5d377616
ED
3878vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3879 <<\r
3880 EFI_GUID Guid;\r
3881 >>\r
3882 L:Match2\r
3883 "\("\r
3884 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3885 ","\r
3886 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3887 ","\r
3888 guidDefinition[Guid]\r
3889 "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
3890 ;\r
3891\r
30fdf114
LG
3892vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3893 "\("\r
3894 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3895 "\)"\r
3896 ;\r
3897\r
3898vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3899 dupExp[$RootLevel, $ExpOpCount]\r
3900 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3901 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3902 | ideqidExp[$RootLevel, $ExpOpCount]\r
3903 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3904 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3905 | rulerefExp[$RootLevel, $ExpOpCount]\r
3906 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3907 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3908 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3909 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3910 ;\r
3911\r
3912dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3913 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3914 ;\r
3915\r
3916vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3917 <<\r
3918 EFI_QUESTION_ID QId;\r
3919 UINT32 Mask;\r
3920 UINT16 ConstVal;\r
3921 CHAR8 *VarIdStr;\r
3922 UINT32 LineNo;\r
30fdf114 3923 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3924 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3925 >>\r
3926 L:VarEqVal <<\r
3927 if (!mCompatibleMode) {\r
3928 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3929 }\r
3930 >>\r
3931 VK:Var\r
3932 OpenParen\r
3933 VN:Number <<\r
3934 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
74bbe31b 3935 VfrReturnCode = gCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114 3936 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
74bbe31b 3937 _PCATCH (gCVfrDataStorage.DeclareEfiVarStore (\r
30fdf114
LG
3938 VarIdStr,\r
3939 &mFormsetGuid,\r
e4ac870f 3940 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3941 0x2, //default type is UINT16\r
3942 FALSE\r
3943 ), VN);\r
3944 } else {\r
3945 _PCATCH (VfrReturnCode, VN);\r
3946 }\r
3947 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3948 LineNo = GET_LINENO(VN);\r
3949 >>\r
3950 CloseParen\r
3951 (\r
3952 (\r
3953 "=="\r
e4ac870f 3954 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3955 <<\r
3956 if (Mask == 0) {\r
3957 CIfrEqIdVal EIVObj (L->getLine());\r
3958 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3959 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3960 EIVObj.SetValue (ConstVal);\r
3961 $ExpOpCount++;\r
3962 } else {\r
3963 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3964 }\r
3965 >>\r
3966 )\r
3967 |\r
3968 (\r
3969 "<="\r
e4ac870f 3970 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3971 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3972 )\r
3973 |\r
3974 (\r
3975 "<"\r
e4ac870f 3976 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3977 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3978 )\r
3979 |\r
3980 (\r
3981 ">="\r
e4ac870f 3982 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3983 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3984 )\r
3985 |\r
3986 (\r
3987 ">"\r
e4ac870f 3988 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3989 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3990 )\r
3991 )\r
3992 ;\r
3993\r
3994ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3995 <<\r
3996 EFI_QUESTION_ID QId;\r
3997 UINT32 Mask;\r
3998 UINT16 ConstVal;\r
3999 CHAR8 *VarIdStr;\r
4000 UINT32 LineNo;\r
4001 >>\r
4002 L:IdEqVal\r
4003 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
4004 (\r
4005 (\r
4006 "=="\r
e4ac870f 4007 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
4008 <<\r
4009 if (Mask == 0) {\r
4010 CIfrEqIdVal EIVObj (L->getLine());\r
4011 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
4012 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4013 EIVObj.SetValue (ConstVal);\r
4014 $ExpOpCount++;\r
4015 } else {\r
4016 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
4017 }\r
4018 >>\r
4019 )\r
4020 |\r
4021 (\r
4022 "<="\r
e4ac870f 4023 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
4024 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
4025 )\r
4026 |\r
4027 (\r
4028 "<"\r
e4ac870f 4029 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
4030 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
4031 )\r
4032 |\r
4033 (\r
4034 ">="\r
e4ac870f 4035 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
4036 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
4037 )\r
4038 |\r
4039 (\r
4040 ">"\r
e4ac870f 4041 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
4042 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
4043 )\r
4044 )\r
4045 ;\r
4046\r
4047ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4048 <<\r
4049 EFI_QUESTION_ID QId[2];\r
4050 UINT32 Mask[2];\r
4051 CHAR8 *VarIdStr[2];\r
4052 UINT32 LineNo[2];\r
4053 >>\r
4054 L:IdEqId\r
4055 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
4056 (\r
4057 (\r
4058 "=="\r
4059 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4060 <<\r
4061 if (Mask[0] & Mask[1]) {\r
4062 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
4063 } else {\r
4064 CIfrEqIdId EIIObj(L->getLine());\r
4065 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
4066 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
4067 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
4068 $ExpOpCount++;\r
4069 }\r
4070 >>\r
4071 )\r
4072 |\r
4073 (\r
4074 "<="\r
4075 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4076 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
4077 )\r
4078 |\r
4079 (\r
4080 "<"\r
4081 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4082 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
4083 )\r
4084 |\r
4085 (\r
4086 ">="\r
4087 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4088 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
4089 )\r
4090 |\r
4091 (\r
4092 ">"\r
4093 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4094 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
4095 )\r
4096 )\r
4097 ;\r
4098\r
4099ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4100 <<\r
4101 UINT16 ListLen = 0;\r
4102 EFI_QUESTION_ID QId;\r
4103 UINT32 Mask;\r
4104 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
4105 CHAR8 *VarIdStr;\r
4106 UINT32 LineNo;\r
4107 >>\r
4108 L:IdEqValList\r
4109 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
4110 "=="\r
4111 (\r
e4ac870f 4112 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
4113 )+\r
4114 <<\r
4115 if (Mask != 0) {\r
4116 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
4117 } else {\r
4118 UINT16 Index;\r
4119 CIfrEqIdList EILObj(L->getLine());\r
4120 if (QId != EFI_QUESTION_ID_INVALID) {\r
4121 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4122 }\r
4123 EILObj.SetListLength (ListLen);\r
4124 for (Index = 0; Index < ListLen; Index++) {\r
4125 EILObj.SetValueList (Index, ValueList[Index]);\r
4126 }\r
4127 \r
4128 EILObj.UpdateIfrBuffer();\r
4129 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
4130 \r
4131 if (QId == EFI_QUESTION_ID_INVALID) {\r
4132 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4133 }\r
4134 $ExpOpCount++;\r
4135 }\r
4136 >>\r
4137 ;\r
4138\r
2bcc713e 4139questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 4140 <<\r
30fdf114
LG
4141 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4142 UINT32 BitMask;\r
4143 CHAR8 *QName = NULL;\r
4144 UINT32 LineNo = 0;\r
4145 >>\r
4146 L:QuestionRef\r
2bcc713e
LG
4147 "\("\r
4148 (\r
30fdf114
LG
4149 QN:StringIdentifier <<\r
4150 QName = QN->getText();\r
2bcc713e 4151 LineNo = QN->getLine();\r
30fdf114
LG
4152 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
4153 >>\r
e4ac870f 4154 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 4155 )\r
2bcc713e 4156 "\)"\r
30fdf114 4157 <<\r
2bcc713e 4158 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
4159 ;\r
4160\r
4161rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4162 L:RuleRef\r
4163 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
4164 ;\r
4165\r
4166//******************************************************\r
4167// PARSE:\r
4168// stringref (STR_FORM_SET_TITLE)\r
4169//\r
4170stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
4171 <<\r
4172 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
4173 >>\r
30fdf114 4174 L:StringRef\r
52302d4d
LG
4175 "\("\r
4176 ( \r
4177 "STRING_TOKEN"\r
4178 "\(" \r
e4ac870f 4179 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 4180 "\)"\r
e4ac870f 4181 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
4182 )\r
4183 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
4184 ;\r
4185\r
4186pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4187 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
4188 ;\r
4189\r
a709adfa
LG
4190securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4191 <<\r
4192 EFI_GUID Guid;\r
4193 >>\r
4194 L:Security\r
4195 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
4196 ;\r
4197\r
52302d4d
LG
4198numericVarStoreType [UINT8 & VarType] :\r
4199 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
4200 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
4201 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
4202 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
4203 ;\r
4204\r
4205getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4206 <<\r
4207 EFI_VARSTORE_INFO Info;\r
4208 CHAR8 *VarIdStr = NULL;\r
4209 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4210 UINT32 Mask = 0;\r
4211 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4212 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4213 UINT32 VarSize = 0;\r
4214 Info.mVarStoreId = 0;\r
4215 >>\r
4216 L:Get\r
4217 "\(" \r
4218 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4219 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
4220 "\)" << \r
4221 {\r
4222 if (Info.mVarStoreId == 0) {\r
4223 // support Date/Time question\r
4224 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4225 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4226 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4227 }\r
4228 if (QType == QUESTION_DATE) {\r
4229 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4230 } else if (QType == QUESTION_TIME) {\r
4231 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4232 }\r
4233 switch (Mask) {\r
4234 case DATE_YEAR_BITMASK:\r
4235 Info.mInfo.mVarOffset = 0;\r
4236 break;\r
4237 case DATE_DAY_BITMASK:\r
4238 Info.mInfo.mVarOffset = 3;\r
4239 break;\r
4240 case TIME_HOUR_BITMASK:\r
4241 Info.mInfo.mVarOffset = 0;\r
4242 break;\r
4243 case TIME_MINUTE_BITMASK:\r
4244 Info.mInfo.mVarOffset = 1;\r
4245 break;\r
4246 case TIME_SECOND_BITMASK:\r
4247 Info.mInfo.mVarOffset = 2;\r
4248 break;\r
4249 default:\r
4250 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4251 break;\r
4252 }\r
4253 } else {\r
74bbe31b 4254 if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
52302d4d
LG
4255 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4256 }\r
4257 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4258 Info.mVarType = VarType;\r
4259 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4260 Info.mVarTotalSize = VarSize;\r
4261 }\r
4262 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4263 if (VarSize != Info.mVarTotalSize) {\r
4264 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4265 }\r
4266 }\r
4267 CIfrGet GObj(L->getLine()); \r
4268 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
4269 GObj.SetVarInfo (&Info); \r
4270 delete VarIdStr; \r
4271 $ExpOpCount++;\r
4272 }\r
4273 >>\r
4274 ;\r
4275\r
30fdf114
LG
4276vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4277 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
4278 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
4279 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
4280 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
4281 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
4282 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
4283 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 4284 | 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
4285 ;\r
4286\r
4287vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4288 lengthExp[$RootLevel, $ExpOpCount]\r
4289 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 4290 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4291 | stringref2Exp[$RootLevel, $ExpOpCount]\r
4292 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 4293 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4294 | unintExp[$RootLevel, $ExpOpCount]\r
4295 | toupperExp[$RootLevel, $ExpOpCount]\r
4296 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 4297 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4298 ;\r
4299\r
4300lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4301 L:Length\r
4302 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4303 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
4304 ;\r
4305\r
4306bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4307 L:BitWiseNot\r
4308 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4309 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
4310 ;\r
4311\r
2bcc713e
LG
4312question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4313 <<\r
4314 UINT8 Type = 0x1;\r
4315 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
4316 EFI_GUID Guid = {0,};\r
4317 >>\r
30fdf114 4318 L:QuestionRefVal\r
2bcc713e
LG
4319 "\("\r
4320 {\r
e4ac870f 4321 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
4322 }\r
4323 {\r
4324 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
4325 }\r
4326 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4327 "\)"\r
4328 <<\r
4329 switch (Type) {\r
4330 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
4331 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
4332 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
4333 }\r
4334 $ExpOpCount++;\r
4335 >>\r
30fdf114
LG
4336 ;\r
4337\r
4338stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4339 L:StringRefVal\r
4340 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4341 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
4342 ;\r
4343\r
4344toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4345 L:BoolVal\r
4346 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4347 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
4348 ;\r
4349\r
4350tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4351 << UINT8 Fmt = 0; >>\r
4352 L:StringVal\r
4353 {\r
e4ac870f 4354 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
4355 }\r
4356 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4357 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
4358 ;\r
4359\r
4360unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4361 L:UnIntVal\r
4362 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4363 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
4364 ;\r
4365\r
4366toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4367 L:ToUpper\r
4368 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4369 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
4370 ;\r
4371\r
4372tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4373 L:ToLower\r
4374 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4375 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
4376 ;\r
4377\r
52302d4d
LG
4378setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4379 <<\r
4380 EFI_VARSTORE_INFO Info;\r
4381 CHAR8 *VarIdStr = NULL;\r
4382 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4383 UINT32 Mask = 0;\r
4384 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4385 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4386 UINT32 VarSize = 0;\r
4387 Info.mVarStoreId = 0;\r
4388 >>\r
4389 L:Set\r
4390 "\("\r
4391 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4392 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
4393 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4394 "\)"\r
4395 << \r
4396 {\r
4397 if (Info.mVarStoreId == 0) {\r
4398 // support Date/Time question\r
4399 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4400 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4401 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4402 }\r
4403 if (QType == QUESTION_DATE) {\r
4404 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4405 } else if (QType == QUESTION_TIME) {\r
4406 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4407 }\r
4408 switch (Mask) {\r
4409 case DATE_YEAR_BITMASK:\r
4410 Info.mInfo.mVarOffset = 0;\r
4411 break;\r
4412 case DATE_DAY_BITMASK:\r
4413 Info.mInfo.mVarOffset = 3;\r
4414 break;\r
4415 case TIME_HOUR_BITMASK:\r
4416 Info.mInfo.mVarOffset = 0;\r
4417 break;\r
4418 case TIME_MINUTE_BITMASK:\r
4419 Info.mInfo.mVarOffset = 1;\r
4420 break;\r
4421 case TIME_SECOND_BITMASK:\r
4422 Info.mInfo.mVarOffset = 2;\r
4423 break;\r
4424 default:\r
4425 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4426 break;\r
4427 }\r
4428 } else {\r
74bbe31b 4429 if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
52302d4d
LG
4430 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4431 }\r
4432 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4433 Info.mVarType = VarType;\r
4434 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4435 Info.mVarTotalSize = VarSize;\r
4436 }\r
4437 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4438 if (VarSize != Info.mVarTotalSize) {\r
4439 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4440 }\r
4441 }\r
4442 CIfrSet TSObj(L->getLine()); \r
4443 TSObj.SetVarInfo (&Info); \r
4444 delete VarIdStr; \r
4445 $ExpOpCount++;\r
4446 }\r
4447 >>\r
4448 ;\r
4449\r
30fdf114
LG
4450vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4451 conditionalExp[$RootLevel, $ExpOpCount]\r
4452 | findExp[$RootLevel, $ExpOpCount]\r
4453 | midExp[$RootLevel, $ExpOpCount]\r
4454 | tokenExp[$RootLevel, $ExpOpCount]\r
4455 | spanExp[$RootLevel, $ExpOpCount]\r
4456 ;\r
4457\r
4458#token Cond("cond") "cond"\r
4459#token Find("find") "find"\r
4460#token Mid("mid") "mid"\r
4461#token Tok("token") "token"\r
4462#token Span("span") "span"\r
4463\r
4464conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4465 L:Cond "\("\r
4466 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4467 "?"\r
4468 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4469 ":"\r
4470 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4471 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
4472 ;\r
4473\r
4474findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4475 << UINT8 Format; >>\r
4476 L:Find "\("\r
4477 findFormat[Format] ( "\|" findFormat[Format] )*\r
4478 ","\r
4479 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4480 ","\r
4481 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4482 ","\r
4483 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4484 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
4485 ;\r
4486\r
4487findFormat [UINT8 & Format] :\r
4488 "SENSITIVE" << $Format = 0x00; >>\r
4489 | "INSENSITIVE" << $Format = 0x01; >>\r
4490 ;\r
4491\r
4492midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4493 L:Mid "\("\r
4494 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4495 ","\r
4496 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4497 ","\r
4498 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4499 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
4500 ;\r
4501\r
4502tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4503 L:Tok "\("\r
4504 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4505 ","\r
4506 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4507 ","\r
4508 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4509 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4510 ;\r
4511\r
4512spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4513 << UINT8 Flags = 0; >>\r
4514 S:Span "\("\r
4515 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4516 ","\r
4517 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4518 ","\r
4519 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4520 ","\r
4521 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4522 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4523 ;\r
4524\r
52302d4d
LG
4525vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4526 L:Map \r
4527 "\(" \r
4528 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4529 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4530 (\r
4531 vfrStatementExpression[0]\r
4532 ","\r
4533 vfrStatementExpression[0]\r
4534 ";"\r
4535 ) *\r
4536 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4537 ;\r
4538\r
30fdf114 4539spanFlags [UINT8 & Flags] :\r
e4ac870f 4540 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4541 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4542 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4543 ;\r
4544\r
4545#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4546#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4547\r
4548//******************************************************************************\r
4549//\r
4550// Parser class definition.\r
4551//\r
4552class EfiVfrParser {\r
4553<<\r
4554private:\r
4555 UINT8 mParserStatus;\r
4556 BOOLEAN mConstantOnlyInExpression;\r
4557\r
30fdf114
LG
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
74bbe31b 5118 pNode = gCVfrDataStorage.GetBufferVarStoreList();\r
30fdf114
LG
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
74bbe31b 5160 pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
30fdf114
LG
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
74bbe31b 5203 gCVfrDataStorage.DeclareBufferVarStore (\r
30fdf114
LG
5204 TypeNameList[Index],\r
5205 &mFormsetGuid,\r
5206 &gCVfrVarDataTypeDB,\r
5207 TypeNameList[Index],\r
5208 EFI_VARSTORE_ID_INVALID\r
5209 );\r
74bbe31b 5210 gCVfrDataStorage.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
74bbe31b 5228 gCVfrDataStorage.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
74bbe31b 5235 gCVfrDataStorage.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
74bbe31b 5249 gCVfrDataStorage.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
74bbe31b 5256 gCVfrDataStorage.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
74bbe31b 5275 gCVfrDefaultStore.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
74bbe31b 5285 gCVfrDefaultStore.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