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