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