]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
Report warning info if an action opcode has text two statement.
[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
1d218f83
ED
1688 if (TxtTwo != EFI_STRING_ID_INVALID) {\r
1689 gCVfrErrorHandle.HandleWarning (\r
1690 VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
1691 S3->getLine(),\r
1692 S3->getText()\r
1693 );\r
1694 }\r
30fdf114
LG
1695 CIfrAction AObj;\r
1696 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
1697 AObj.SetLineNo (F->getLine());\r
1698 AObj.SetQuestionId (QId);\r
e4ac870f
LG
1699 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
1700 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
30fdf114
LG
1701 _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
1702 AssignQuestionKey (AObj, KN);\r
1703 CRT_END_OP (KN);\r
1704 } else {\r
1705 CIfrText TObj;\r
1706 TObj.SetLineNo (T->getLine());\r
e4ac870f
LG
1707 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
1708 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
1709 TObj.SetTextTwo (TxtTwo);\r
1710 }\r
1711 >>\r
1712 { "," vfrStatementStatTagList }\r
1713 ";"\r
1714 ;\r
1715\r
1716staticTextFlagsField[UINT8 & HFlags] :\r
e4ac870f 1717 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1718 | questionheaderFlagsField[HFlags]\r
1719 ;\r
1720\r
1721vfrStatementCrossReference :\r
1722 vfrStatementGoto |\r
1723 vfrStatementResetButton\r
1724 ;\r
1725\r
1726vfrStatementGoto :\r
1727 <<\r
4234283c 1728 UINT8 RefType = 5;\r
52302d4d
LG
1729 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
1730 EFI_GUID FSId = {0,};\r
30fdf114
LG
1731 EFI_FORM_ID FId;\r
1732 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1733 UINT32 BitMask;\r
1734 CIfrQuestionHeader *QHObj = NULL;\r
0d2711a6 1735 CIfrOpHeader *OHObj = NULL;\r
30fdf114
LG
1736 CIfrRef *R1Obj = NULL;\r
1737 CIfrRef2 *R2Obj = NULL;\r
1738 CIfrRef3 *R3Obj = NULL;\r
1739 CIfrRef4 *R4Obj = NULL;\r
4234283c 1740 CIfrRef5 *R5Obj = NULL;\r
30fdf114
LG
1741 >>\r
1742 G:Goto\r
4234283c 1743 {\r
30fdf114
LG
1744 (\r
1745 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
1746 FormSetGuid "=" guidDefinition[FSId] ","\r
1747 FormId "=" F1:Number ","\r
1748 Question "=" QN1:Number ","\r
1749 <<\r
1750 RefType = 4;\r
e4ac870f
LG
1751 DevPath = _STOSID(P->getText(), P->getLine());\r
1752 FId = _STOFID(F1->getText(), F1->getLine());\r
1753 QId = _STOQID(QN1->getText(), QN1->getLine());\r
30fdf114
LG
1754 >>\r
1755 )\r
1756 |\r
1757 (\r
1758 FormSetGuid "=" guidDefinition[FSId] ","\r
1759 FormId "=" F2:Number ","\r
1760 Question "=" QN2:Number ","\r
1761 <<\r
1762 RefType = 3;\r
e4ac870f
LG
1763 FId = _STOFID(F2->getText(), F2->getLine());\r
1764 QId = _STOQID(QN2->getText(), QN2->getLine());\r
30fdf114
LG
1765 >>\r
1766 )\r
1767 |\r
1768 (\r
e4ac870f 1769 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
30fdf114
LG
1770 Question "="\r
1771 (\r
0d2711a6
LG
1772 QN3:StringIdentifier "," << \r
1773 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
1774 if (QId == EFI_QUESTION_ID_INVALID) {\r
1775 _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
1776 }\r
1777 >>\r
e4ac870f 1778 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>\r
30fdf114
LG
1779 )\r
1780 )\r
1781 |\r
1782 (\r
1783 F4:Number "," <<\r
1784 RefType = 1;\r
e4ac870f 1785 FId = _STOFID(F4->getText(), F4->getLine());\r
30fdf114
LG
1786 >>\r
1787 )\r
4234283c 1788 }\r
30fdf114
LG
1789 <<\r
1790 switch (RefType) {\r
4234283c
LG
1791 case 5:\r
1792 {\r
1793 R5Obj = new CIfrRef5;\r
1794 QHObj = R5Obj;\r
0d2711a6 1795 OHObj = R5Obj;\r
4234283c
LG
1796 R5Obj->SetLineNo(G->getLine());\r
1797 break;\r
1798 }\r
30fdf114
LG
1799 case 4:\r
1800 {\r
1801 R4Obj = new CIfrRef4;\r
1802 QHObj = R4Obj;\r
0d2711a6 1803 OHObj = R4Obj;\r
30fdf114
LG
1804 R4Obj->SetLineNo(G->getLine());\r
1805 R4Obj->SetDevicePath (DevPath);\r
1806 R4Obj->SetFormSetId (FSId);\r
1807 R4Obj->SetFormId (FId);\r
1808 R4Obj->SetQuestionId (QId);\r
1809 break;\r
1810 }\r
1811 case 3:\r
1812 {\r
1813 R3Obj = new CIfrRef3;\r
1814 QHObj = R3Obj;\r
0d2711a6 1815 OHObj = R3Obj;\r
30fdf114
LG
1816 R3Obj->SetLineNo(G->getLine());\r
1817 R3Obj->SetFormSetId (FSId);\r
1818 R3Obj->SetFormId (FId);\r
1819 R3Obj->SetQuestionId (QId);\r
1820 break;\r
1821 }\r
1822 case 2:\r
1823 {\r
1824 R2Obj = new CIfrRef2;\r
1825 QHObj = R2Obj;\r
0d2711a6 1826 OHObj = R2Obj;\r
30fdf114
LG
1827 R2Obj->SetLineNo(G->getLine());\r
1828 R2Obj->SetFormId (FId);\r
0d2711a6 1829 R2Obj->SetQuestionId (QId);\r
30fdf114
LG
1830 break;\r
1831 }\r
1832 case 1:\r
1833 {\r
1834 R1Obj = new CIfrRef;\r
1835 QHObj = R1Obj;\r
0d2711a6 1836 OHObj = R1Obj;\r
30fdf114
LG
1837 R1Obj->SetLineNo(G->getLine());\r
1838 R1Obj->SetFormId (FId);\r
1839 break;\r
1840 }\r
1841 default: break;\r
1842 }\r
1843 >>\r
4afd3d04
LG
1844 vfrQuestionHeader[*QHObj, QUESTION_REF] <<\r
1845 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1846 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
1847 }\r
1848 >>\r
30fdf114
LG
1849 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
1850 {\r
1851 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
1852 }\r
0d2711a6
LG
1853 {\r
1854 E:"," \r
1855 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
1856 }\r
4234283c 1857 ";" << 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
1858 ;\r
1859\r
1860vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
1861 << UINT8 HFlags = 0; >>\r
1862 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
1863 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
1864 ;\r
1865\r
1866gotoFlagsField[UINT8 & HFlags] :\r
e4ac870f 1867 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1868 | questionheaderFlagsField[HFlags]\r
1869 ;\r
1870\r
1871getStringId :\r
1872 "STRING_TOKEN" "\("\r
1873 IdVal:Number\r
1874 "\)"\r
1875 ;\r
1876\r
1877vfrStatementResetButton :\r
1878 <<\r
1879 CIfrResetButton RBObj;\r
1880 UINT16 DefaultId;\r
1881 >>\r
1882 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
1883 DefaultStore\r
1884 "=" N:StringIdentifier "," <<\r
1885 _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
1886 RBObj.SetDefaultId (DefaultId);\r
1887 >>\r
1888 vfrStatementHeader[&RBObj] ","\r
1889 { vfrStatementStatTagList "," }\r
1890 E:EndResetButton << CRT_END_OP (E); >>\r
1891 ";"\r
1892 ;\r
1893\r
1894vfrStatementBooleanType :\r
1895 vfrStatementCheckBox |\r
1896 vfrStatementAction\r
1897 ;\r
1898\r
1899//*****************************************************\r
1900// Syntax of checkbox\r
1901//\r
1902// Example:\r
1903// checkbox\r
1904// varid = MySTestData.mField1,\r
1905// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
1906// help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
1907// flags = CHECKBOX_DEFAULT | CALLBACK,\r
1908// default value = TRUE, defaultstore = MyDefaultStore,\r
1909// endcheckbox;\r
1910//\r
1911vfrStatementCheckBox :\r
1912 <<\r
1913 CIfrCheckBox CBObj;\r
1914 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
1915 CHAR8 *VarStoreName = NULL;\r
1916 UINT32 DataTypeSize;\r
4afd3d04 1917 EFI_GUID *VarStoreGuid = NULL;\r
30fdf114
LG
1918 >>\r
1919 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
1920 vfrQuestionHeader[CBObj] "," << //check data type\r
4afd3d04
LG
1921 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
1922 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
1923 }\r
1924 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
1925 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
1926 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
1927 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
1928 } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
1929 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
1930 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
1931 }\r
30fdf114
LG
1932 }\r
1933 >>\r
1934 {\r
1935 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
1936 <<\r
4afd3d04
LG
1937 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
1938 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
1939 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1940 Val.b = TRUE;\r
1941 if (CBObj.GetFlags () & 0x01) {\r
1942 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
1943 _PCATCH(\r
1944 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1945 EFI_HII_DEFAULT_CLASS_STANDARD,\r
1946 _GET_CURRQEST_VARTINFO(),\r
1947 VarStoreName,\r
1948 VarStoreGuid,\r
1949 _GET_CURRQEST_DATATYPE (),\r
1950 Val\r
1951 ),\r
1952 VFR_RETURN_SUCCESS,\r
1953 L,\r
1954 "No standard default storage found"\r
1955 );\r
1956 }\r
1957 if (CBObj.GetFlags () & 0x02) {\r
1958 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
1959 _PCATCH(\r
1960 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1961 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
1962 _GET_CURRQEST_VARTINFO(),\r
1963 VarStoreName,\r
1964 VarStoreGuid,\r
1965 _GET_CURRQEST_DATATYPE (),\r
1966 Val\r
1967 ),\r
1968 VFR_RETURN_SUCCESS,\r
1969 L,\r
1970 "No manufacturing default storage found"\r
1971 );\r
1972 }\r
30fdf114
LG
1973 }\r
1974 >>\r
1975 }\r
1976 {\r
1977 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
1978 }\r
1979 vfrStatementQuestionOptionList\r
1980 E:EndCheckBox << CRT_END_OP (E); >>\r
1981 ";"\r
1982 ;\r
1983\r
1984vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
1985 <<\r
1986 UINT8 LFlags = 0;\r
1987 UINT8 HFlags = 0;\r
1988 >>\r
1989 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
1990 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
1991 ;\r
1992\r
1993checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
1994 N:Number <<\r
1995 if (mCompatibleMode) {\r
1996 //\r
1997 // set question flag\r
1998 //\r
e4ac870f 1999 $LFlags |= _STOU8(N->getText(), N->getLine());\r
30fdf114 2000 } else {\r
e4ac870f 2001 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
30fdf114
LG
2002 }\r
2003 >>\r
2004 | D:"DEFAULT" <<\r
2005 if (mCompatibleMode) {\r
2006 //\r
2007 // set question Default flag\r
2008 //\r
2009 $LFlags |= 0x01;\r
2010 } else {\r
2011 _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
2012 }\r
2013 >>\r
2014 | M:"MANUFACTURING" <<\r
2015 if (mCompatibleMode) {\r
2016 //\r
2017 // set question MFG flag\r
2018 //\r
2019 $LFlags |= 0x02;\r
2020 } else {\r
2021 _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
2022 }\r
2023 >>\r
2024 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
2025 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r
2026 | questionheaderFlagsField[HFlags]\r
2027 ;\r
2028\r
2029//*****************************************************\r
2030// Syntax of action\r
2031//\r
2032// Example:\r
2033// action\r
2034// prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r
2035// help = STRING_TOKEN(STR_ACTION_HELP),\r
2036// flags = CALLBACK,\r
2037// config = STRING_TOKEN(STR_ACTION_CONFIG),\r
2038// endaction;\r
2039//\r
2040vfrStatementAction :\r
2041 << CIfrAction AObj; >>\r
2042 L:Action << AObj.SetLineNo(L->getLine()); >>\r
4234283c 2043 vfrQuestionHeader[AObj] ","\r
30fdf114 2044 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
e4ac870f 2045 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2046 vfrStatementQuestionTagList\r
2047 E:EndAction << CRT_END_OP (E); >>\r
2048 ";"\r
2049 ;\r
2050\r
2051vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
2052 << UINT8 HFlags = 0; >>\r
2053 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
2054 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
2055 ;\r
2056\r
2057actionFlagsField[UINT8 & HFlags] :\r
e4ac870f 2058 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2059 | questionheaderFlagsField[HFlags]\r
2060 ;\r
2061\r
2062vfrStatementDate :\r
2063 <<\r
2064 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2065 CHAR8 *VarIdStr[3] = {NULL, };\r
2066 CIfrDate DObj;\r
2067 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2068 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
30fdf114
LG
2069 >>\r
2070 L:Date << DObj.SetLineNo(L->getLine()); >>\r
2071 (\r
2072 (\r
4afd3d04
LG
2073 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<\r
2074 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2075 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
2076 }\r
2077 >>\r
30fdf114
LG
2078 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
2079 vfrStatementQuestionOptionList\r
2080 )\r
2081 |\r
2082 (\r
2083 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
2084 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
2085 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
2086 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
2087 minMaxDateStepDefault[Val.date, 0]\r
2088\r
2089 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
2090 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
2091 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2092 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2093 minMaxDateStepDefault[Val.date, 1]\r
2094\r
2095 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
2096 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
2097 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
2098 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
2099 minMaxDateStepDefault[Val.date, 2]\r
2bcc713e 2100 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
30fdf114
LG
2101 <<\r
2102 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2103 DObj.SetQuestionId (QId);\r
2104 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
e4ac870f
LG
2105 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
2106 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\r
30fdf114
LG
2107 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2108 >>\r
4afd3d04 2109 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2110 )\r
2111 ( vfrStatementInconsistentIf )*\r
2112 )\r
2113 E:EndDate << CRT_END_OP (E); >>\r
2114 ";"\r
2115 ;\r
2116\r
2117minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
fd171542 2118 Minimum "=" MinN:Number ","\r
2119 Maximum "=" MaxN:Number ","\r
30fdf114
LG
2120 { "step" "=" Number "," }\r
2121 {\r
2122 "default" "=" N:Number "," <<\r
2123 switch (KeyValue) {\r
fd171542 2124 case 0: \r
e4ac870f
LG
2125 D.Year = _STOU16(N->getText(), N->getLine());\r
2126 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
fd171542 2127 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
2128 }\r
2129 break;\r
2130 case 1: \r
e4ac870f 2131 D.Month = _STOU8(N->getText(), N->getLine()); \r
fd171542 2132 if (D.Month < 1 || D.Month > 12) {\r
2133 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
2134 }\r
2135 break;\r
2136 case 2: \r
e4ac870f 2137 D.Day = _STOU8(N->getText(), N->getLine()); \r
fd171542 2138 if (D.Day < 1 || D.Day > 31) {\r
2139 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
2140 }\r
2141 break;\r
30fdf114
LG
2142 }\r
2143 >>\r
2144 }\r
2145 ;\r
2146\r
2147vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
2148 << UINT8 LFlags = 0; >>\r
2149 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
2150 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2151 ;\r
2152\r
2153dateFlagsField [UINT8 & Flags] :\r
e4ac870f 2154 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2155 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r
2156 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r
2157 | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r
2158 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2159 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2160 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2161 ;\r
2162\r
2163vfrStatementNumericType :\r
2164 vfrStatementNumeric |\r
2165 vfrStatementOneOf\r
2166 ;\r
2167\r
2168vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
2169 <<\r
2170 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
2171 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
2172 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
2173 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
2174 >>\r
2175 Minimum "=" I:Number ","\r
2176 <<\r
a709adfa 2177 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2178 case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
2179 case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
2180 case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
2181 case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText(), I->getLine()); break;\r
30fdf114
LG
2182 }\r
2183 >>\r
2184 Maximum "=" A:Number ","\r
2185 <<\r
a709adfa 2186 switch (_GET_CURRQEST_DATATYPE()) {\r
fd171542 2187 case EFI_IFR_TYPE_NUM_SIZE_64 : \r
e4ac870f 2188 MaxU8 = _STOU64(A->getText(), A->getLine()); \r
fd171542 2189 if (MaxU8 < MinU8) {\r
2190 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2191 }\r
2192 break;\r
2193 case EFI_IFR_TYPE_NUM_SIZE_32 : \r
e4ac870f 2194 MaxU4 = _STOU32(A->getText(), A->getLine()); \r
fd171542 2195 if (MaxU4 < MinU4) {\r
2196 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2197 }\r
2198 break;\r
2199 case EFI_IFR_TYPE_NUM_SIZE_16 : \r
e4ac870f 2200 MaxU2 = _STOU16(A->getText(), A->getLine()); \r
fd171542 2201 if (MaxU2 < MinU2) {\r
2202 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2203 }\r
2204 break;\r
2205 case EFI_IFR_TYPE_NUM_SIZE_8 : \r
e4ac870f 2206 MaxU1 = _STOU8(A->getText(), A->getLine()); \r
fd171542 2207 if (MaxU1 < MinU1) {\r
2208 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2209 }\r
2210 break;\r
30fdf114
LG
2211 }\r
2212 >>\r
2213 {\r
2214 STEP "=" S:Number ","\r
2215 <<\r
a709adfa 2216 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2217 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
2218 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
2219 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
2220 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
30fdf114
LG
2221 }\r
2222 >>\r
2223 }\r
2224 <<\r
a709adfa 2225 switch (_GET_CURRQEST_DATATYPE()) {\r
30fdf114
LG
2226 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
2227 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
2228 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
2229 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
2230 }\r
2231 >>\r
2232 ;\r
2233\r
2234vfrStatementNumeric :\r
2235 <<\r
2236 CIfrNumeric NObj;\r
4afd3d04
LG
2237 UINT32 DataTypeSize;\r
2238 BOOLEAN IsSupported = TRUE;\r
2239 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2240 >>\r
2241 L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
2242 vfrQuestionHeader[NObj] "," << // check data type\r
4afd3d04
LG
2243 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2244 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
2245 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2246 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
2247 }\r
2248 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2249 }\r
30fdf114
LG
2250 >>\r
2251 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
2252 {\r
2253 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
2254 }\r
4afd3d04 2255 vfrSetMinMaxStep[NObj] <<\r
b36d134f 2256 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2257 //\r
2258 // Base on the type to know the actual used size,shrink the buffer \r
2259 // size allocate before.\r
2260 //\r
2261 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2262 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2263 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2264 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
2265 default: \r
2266 IsSupported = FALSE;\r
b36d134f
LG
2267 break;\r
2268 }\r
4afd3d04 2269 NObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2270 if (!IsSupported) {\r
2271 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2272 }\r
4afd3d04
LG
2273 >>\r
2274 vfrStatementQuestionOptionList\r
2275 E:EndNumeric << \r
b36d134f
LG
2276 CRT_END_OP (E); \r
2277 >>\r
30fdf114
LG
2278 ";"\r
2279 ;\r
2280\r
2281vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
2282 <<\r
a709adfa 2283 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2284 UINT8 HFlags = 0;\r
a709adfa 2285 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2286 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2287 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2288 >>\r
e4ac870f 2289 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
a709adfa
LG
2290 <<\r
2291 //check data type flag\r
4afd3d04
LG
2292 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2293 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2294 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2295 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2296 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2297 }\r
2298 } else {\r
2299 // update data type for name/value store\r
2300 UINT32 DataTypeSize;\r
2301 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2302 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2303 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2304 }\r
4afd3d04 2305 } else if (IsSetType){\r
a709adfa 2306 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa 2307 }\r
e4ac870f 2308 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
a709adfa 2309 >>\r
30fdf114
LG
2310 ;\r
2311\r
e4ac870f
LG
2312numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
2313 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
4afd3d04
LG
2314 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
2315 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
2316 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
2317 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
e4ac870f
LG
2318 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
2319 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
2320 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
30fdf114
LG
2321 | questionheaderFlagsField[HFlags]\r
2322 ;\r
2323\r
2324vfrStatementOneOf :\r
2325 <<\r
2326 CIfrOneOf OObj;\r
2327 UINT32 DataTypeSize;\r
4afd3d04
LG
2328 BOOLEAN IsSupported = TRUE;\r
2329 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2330 >>\r
2331 L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
2332 vfrQuestionHeader[OObj] "," << //check data type\r
4afd3d04
LG
2333 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2334 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
2335 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2336 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
2337 }\r
2338 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2339 }\r
30fdf114
LG
2340 >>\r
2341 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
2342 {\r
2343 vfrSetMinMaxStep[OObj]\r
2344 }\r
4afd3d04 2345 <<\r
b36d134f 2346 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2347 //\r
2348 // Base on the type to know the actual used size,shrink the buffer \r
2349 // size allocate before.\r
2350 //\r
2351 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2352 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2353 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2354 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
b36d134f 2355 default:\r
4afd3d04 2356 IsSupported = FALSE;\r
b36d134f
LG
2357 break;\r
2358 }\r
4afd3d04 2359 OObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2360 if (!IsSupported) {\r
2361 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2362 }\r
4afd3d04
LG
2363 >>\r
2364 vfrStatementQuestionOptionList\r
2365 E:EndOneOf <<\r
b36d134f
LG
2366 CRT_END_OP (E); \r
2367 >>\r
30fdf114
LG
2368 ";"\r
2369 ;\r
2370\r
2371vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
2372 <<\r
a709adfa 2373 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2374 UINT8 HFlags = 0;\r
a709adfa 2375 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2376 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2377 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2378 >>\r
e4ac870f 2379 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
a709adfa
LG
2380 <<\r
2381 //check data type flag\r
4afd3d04
LG
2382 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2383 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2384 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2385 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2386 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2387 }\r
2388 } else {\r
2389 // update data type for Name/Value store\r
2390 UINT32 DataTypeSize;\r
2391 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2392 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2393 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2394 }\r
4afd3d04 2395 } else if (IsSetType){\r
a709adfa 2396 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa
LG
2397 }\r
2398 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
2399 >>\r
30fdf114
LG
2400 ;\r
2401\r
2402vfrStatementStringType :\r
2403 vfrStatementString |\r
2404 vfrStatementPassword\r
2405 ;\r
2406\r
2407vfrStatementString :\r
2408 <<\r
2409 CIfrString SObj;\r
40d841f6
LG
2410 UINT32 VarArraySize;\r
2411 UINT8 StringMinSize;\r
2412 UINT8 StringMaxSize;\r
30fdf114
LG
2413 >>\r
2414 L:String << SObj.SetLineNo(L->getLine()); >>\r
2415 vfrQuestionHeader[SObj] ","\r
2416 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
2417 {\r
2418 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
2419 }\r
40d841f6
LG
2420 MinSize "=" MIN:Number "," << \r
2421 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2422 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());\r
2423 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {\r
40d841f6
LG
2424 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
2425 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
2426 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
2427 }\r
2428 SObj.SetMinSize (StringMinSize);\r
2429 >>\r
2430 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2431 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());\r
2432 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {\r
40d841f6
LG
2433 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
2434 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
2435 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
2436 } else if (StringMaxSize < StringMinSize) {\r
2437 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
2438 }\r
2439 SObj.SetMaxSize (StringMaxSize);\r
2440 >>\r
30fdf114
LG
2441 vfrStatementQuestionOptionList\r
2442 E:EndString << CRT_END_OP (E); >>\r
2443 ";"\r
2444 ;\r
2445\r
2446vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
2447 <<\r
2448 UINT8 LFlags = 0;\r
2449 UINT8 HFlags = 0;\r
2450 >>\r
2451 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
2452 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2453 ;\r
2454\r
2455stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2456 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2457 | "MULTI_LINE" << $LFlags = 0x01; >>\r
2458 | questionheaderFlagsField[HFlags]\r
2459 ;\r
2460\r
2461vfrStatementPassword :\r
2462 <<\r
2463 CIfrPassword PObj;\r
40d841f6
LG
2464 UINT32 VarArraySize;\r
2465 UINT16 PasswordMinSize;\r
2466 UINT16 PasswordMaxSize;\r
30fdf114
LG
2467 >>\r
2468 L:Password << PObj.SetLineNo(L->getLine()); >>\r
2469 vfrQuestionHeader[PObj] ","\r
2470 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
2471 {\r
2472 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
2473 }\r
40d841f6
LG
2474 MinSize "=" MIN:Number "," << \r
2475 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2476 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());\r
2477 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {\r
40d841f6
LG
2478 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
2479 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
2480 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
2481 }\r
2482 PObj.SetMinSize (PasswordMinSize);\r
2483 >>\r
2484 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2485 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());\r
2486 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {\r
40d841f6
LG
2487 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
2488 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
2489 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
2490 } else if (PasswordMaxSize < PasswordMinSize) {\r
2491 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
2492 }\r
2493 PObj.SetMaxSize (PasswordMaxSize);\r
2494 >>\r
30fdf114
LG
2495 { Encoding "=" Number "," }\r
2496 vfrStatementQuestionOptionList\r
2497 E:EndPassword << CRT_END_OP (E); >>\r
2498 ";"\r
2499 ;\r
2500\r
2501vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
2502 << UINT8 HFlags = 0; >>\r
2503 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
2504 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
2505 ;\r
2506\r
2507passwordFlagsField [UINT8 & HFlags] :\r
e4ac870f 2508 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2509 | questionheaderFlagsField[HFlags]\r
2510 ;\r
2511\r
2512vfrStatementOrderedList :\r
2513 <<\r
2514 CIfrOrderedList OLObj;\r
40d841f6 2515 UINT32 VarArraySize;\r
30fdf114
LG
2516 >>\r
2517 L:OrderedList << OLObj.SetLineNo(L->getLine()); >>\r
2518 vfrQuestionHeader[OLObj] ","\r
40d841f6
LG
2519 << \r
2520 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
2521 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
2522 >>\r
30fdf114 2523 {\r
40d841f6 2524 MaxContainers "=" M:Number "," << \r
e4ac870f 2525 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\r
40d841f6 2526 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
e4ac870f 2527 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {\r
40d841f6
LG
2528 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
2529 }\r
e4ac870f 2530 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));\r
40d841f6 2531 >>\r
30fdf114
LG
2532 }\r
2533 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
2534 vfrStatementQuestionOptionList\r
2535 E:EndList << CRT_END_OP (E); >>\r
2536 ";"\r
2537 ;\r
2538\r
2539vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
2540 <<\r
2541 UINT8 HFlags = 0;\r
2542 UINT8 LFlags = 0;\r
2543 >>\r
2544 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
2545 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2546 ;\r
2547\r
2548orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2549 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2550 | "UNIQUE" << $LFlags |= 0x01; >>\r
2551 | "NOEMPTY" << $LFlags |= 0x02; >>\r
2552 | questionheaderFlagsField[HFlags]\r
2553 ;\r
2554\r
2555vfrStatementTime :\r
2556 <<\r
2557 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2558 CHAR8 *VarIdStr[3] = {NULL, };\r
2559 CIfrTime TObj;\r
2560 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2561 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
30fdf114
LG
2562 >>\r
2563 L:Time << TObj.SetLineNo(L->getLine()); >>\r
2564 (\r
2565 (\r
4afd3d04
LG
2566 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<\r
2567 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2568 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
2569 }\r
2570 >>\r
30fdf114 2571 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
40d841f6 2572 vfrStatementQuestionOptionList\r
30fdf114
LG
2573 )\r
2574 |\r
2575 (\r
2576 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
2577 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
2578 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
2579 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
2580 minMaxTimeStepDefault[Val.time, 0]\r
2581\r
2582 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
2583 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
2584 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2585 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2586 minMaxTimeStepDefault[Val.time, 1]\r
2587\r
2588 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
2589 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
2590 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
2591 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
2592 minMaxTimeStepDefault[Val.time, 2]\r
2bcc713e 2593 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
30fdf114
LG
2594 <<\r
2595 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2596 TObj.SetQuestionId (QId);\r
2597 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
e4ac870f
LG
2598 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
2599 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\r
30fdf114
LG
2600 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2601 >>\r
4afd3d04 2602 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2603 )\r
2604 ( vfrStatementInconsistentIf )*\r
2605 )\r
2606 E:EndTime << CRT_END_OP (E); >>\r
2607 ";"\r
2608 ;\r
2609\r
2610minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
2611 Minimum "=" Number ","\r
2612 Maximum "=" Number ","\r
2613 { "step" "=" Number "," }\r
2614 {\r
2615 "default" "=" N:Number "," <<\r
2616 switch (KeyValue) {\r
fd171542 2617 case 0: \r
e4ac870f 2618 T.Hour = _STOU8(N->getText(), N->getLine()); \r
fd171542 2619 if (T.Hour > 23) {\r
2620 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
2621 }\r
2622 break;\r
2623 case 1: \r
e4ac870f 2624 T.Minute = _STOU8(N->getText(), N->getLine()); \r
fd171542 2625 if (T.Minute > 59) {\r
2626 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
2627 }\r
2628 break;\r
2629 case 2: \r
e4ac870f 2630 T.Second = _STOU8(N->getText(), N->getLine());\r
fd171542 2631 if (T.Second > 59) {\r
2632 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
2633 }\r
2634 break;\r
30fdf114
LG
2635 }\r
2636 >>\r
2637 }\r
2638 ;\r
2639\r
2640vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
2641 << UINT8 LFlags = 0; >>\r
2642 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
2643 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2644 ;\r
2645\r
2646timeFlagsField [UINT8 & Flags] :\r
e4ac870f 2647 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2648 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r
2649 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r
2650 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r
2651 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2652 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2653 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2654 ;\r
2655\r
2656vfrStatementQuestionTag :\r
2657 vfrStatementStatTag "," |\r
2658 vfrStatementInconsistentIf |\r
2659 vfrStatementNoSubmitIf |\r
2660 vfrStatementDisableIfQuest |\r
2661 vfrStatementRefresh |\r
da92f276 2662 vfrStatementVarstoreDevice |\r
4234283c 2663 vfrStatementExtension |\r
ea0f6464
LG
2664 vfrStatementRefreshEvent |\r
2665 vfrStatementWarningIf\r
30fdf114
LG
2666 ;\r
2667\r
2668vfrStatementQuestionTagList :\r
2669 ( vfrStatementQuestionTag )*\r
2670 ;\r
2671\r
2672vfrStatementQuestionOptionTag :\r
2673 vfrStatementSuppressIfQuest |\r
2674 vfrStatementGrayOutIfQuest |\r
2675 vfrStatementValue |\r
2676 vfrStatementDefault |\r
52302d4d
LG
2677 vfrStatementRead |\r
2678 vfrStatementWrite |\r
30fdf114
LG
2679 vfrStatementOptions\r
2680 ;\r
2681\r
2682vfrStatementQuestionOptionList :\r
2683 (\r
2684 vfrStatementQuestionTag |\r
2685 vfrStatementQuestionOptionTag\r
2686 )*\r
2687 ;\r
2688\r
2689vfrStatementStatList :\r
2690 vfrStatementStat |\r
2691 vfrStatementQuestions |\r
2692 vfrStatementConditionalNew |\r
2693 vfrStatementLabel |\r
da92f276 2694 vfrStatementExtension |\r
30fdf114
LG
2695 // Just for framework vfr compatibility\r
2696 vfrStatementInvalid\r
2697 ;\r
2698\r
2699vfrStatementStatListOld :\r
2700 vfrStatementStat |\r
2701 vfrStatementQuestions |\r
2702 vfrStatementLabel |\r
2703 // Just for framework vfr compatibility\r
2704 vfrStatementInvalid\r
2705 ;\r
2706\r
2707vfrStatementDisableIfStat :\r
2708 << \r
2709 CIfrDisableIf DIObj; \r
30fdf114
LG
2710 >>\r
2711 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 2712 vfrStatementExpression[0] ";" \r
30fdf114
LG
2713 ( vfrStatementStatList )*\r
2714 E:EndIf << CRT_END_OP (E); >>\r
2715 ";"\r
2716 ;\r
2717\r
2718vfrStatementInconsistentIfStat :\r
2719 << CIfrInconsistentIf IIObj; >>\r
2720 L:InconsistentIf <<\r
2721 if (!mCompatibleMode) {\r
2722 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
2723 }\r
2724 IIObj.SetLineNo(L->getLine());\r
2725 >>\r
e4ac870f 2726 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2727 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2728 vfrStatementExpression[0]\r
2729 E:EndIf << CRT_END_OP (E); >>\r
2730 ";"\r
2731 ;\r
2732\r
2733//\r
2734// Compatible for framework vfr file\r
2735//\r
2736vfrStatementgrayoutIfSuppressIf:\r
2737 << CIfrSuppressIf SIObj; >>\r
2738 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2739 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2740 vfrStatementExpression[0]\r
2741 ";"\r
2742 ;\r
2743\r
2744vfrStatementsuppressIfGrayOutIf:\r
2745 << CIfrGrayOutIf GOIObj; >>\r
2746 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2747 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2748 vfrStatementExpression[0]\r
2749 ";"\r
2750 ;\r
2751\r
2752vfrStatementSuppressIfStatNew :\r
2753 << CIfrSuppressIf SIObj;>>\r
2754 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2755 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2756 vfrStatementExpression[0]\r
2757 ";"\r
2758 ( vfrStatementStatList )*\r
2759 E: EndIf ";" << CRT_END_OP (E); >>\r
2760 ;\r
2761\r
2762vfrStatementGrayOutIfStatNew :\r
2763 << CIfrGrayOutIf GOIObj;>>\r
2764 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2765 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2766 vfrStatementExpression[0]\r
2767 ";"\r
2768 ( vfrStatementStatList )*\r
2769 E: EndIf ";" << CRT_END_OP (E); >>\r
2770 ;\r
2771\r
2772vfrStatementSuppressIfStatOld :\r
2773 <<\r
2774 CIfrSuppressIf SIObj;\r
2775 BOOLEAN GrayOutExist = FALSE;\r
2776 >>\r
2777 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2778 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2779 vfrStatementExpression[0]\r
2780 ";"\r
2781 {\r
2782 vfrStatementsuppressIfGrayOutIf\r
2783 << GrayOutExist = TRUE; >>\r
2784 }\r
2785 ( vfrStatementStatListOld )*\r
2786 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
2787 ;\r
2788\r
2789vfrStatementGrayOutIfStatOld :\r
2790 <<\r
2791 CIfrGrayOutIf GOIObj;\r
2792 BOOLEAN SuppressExist = FALSE;\r
2793 >>\r
2794 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2795 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2796 vfrStatementExpression[0]\r
2797 ";"\r
2798 {\r
2799 vfrStatementgrayoutIfSuppressIf\r
2800 << SuppressExist = TRUE; >>\r
2801 }\r
2802 ( vfrStatementStatListOld )*\r
2803 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
2804 ;\r
2805\r
2806vfrImageTag :\r
2807 << CIfrImage IObj; >>\r
e4ac870f 2808 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
30fdf114
LG
2809 ;\r
2810\r
2811vfrLockedTag :\r
2812 << CIfrLocked LObj; >>\r
2813 L:Locked << LObj.SetLineNo(L->getLine()); >>\r
2814 ;\r
2815\r
4234283c
LG
2816vfrModalTag :\r
2817 << CIfrModal MObj; >>\r
2818 L:Modal << MObj.SetLineNo(L->getLine()); >>\r
2819 ;\r
2820\r
30fdf114
LG
2821vfrStatementStatTag :\r
2822 vfrImageTag |\r
2823 vfrLockedTag\r
2824 ;\r
2825\r
2826vfrStatementStatTagList :\r
2827 vfrStatementStatTag ( "," vfrStatementStatTag )*\r
2828 ;\r
2829\r
2830vfrStatementImage :\r
2831 vfrImageTag\r
2832 ";"\r
2833 ;\r
2834\r
4234283c
LG
2835vfrStatementModal :\r
2836 vfrModalTag\r
2837 ";"\r
2838 ;\r
2839\r
30fdf114
LG
2840vfrStatementLocked :\r
2841 vfrLockedTag\r
2842 ";"\r
2843 ;\r
2844\r
2845vfrStatementInconsistentIf :\r
2846 << CIfrInconsistentIf IIObj; >>\r
2847 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2848 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2849 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2850 vfrStatementExpression[0]\r
2851 E:EndIf << CRT_END_OP (E); >>\r
2852 ;\r
2853\r
2854vfrStatementNoSubmitIf :\r
2855 << CIfrNoSubmitIf NSIObj; >>\r
2856 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2857 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2858 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2859 vfrStatementExpression[0]\r
2860 E:EndIf << CRT_END_OP (E); >>\r
2861 ;\r
2862\r
ea0f6464
LG
2863vfrStatementWarningIf :\r
2864 << CIfrWarningIf WIObj; >>\r
2865 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>\r
e4ac870f
LG
2866 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
2867 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
ea0f6464
LG
2868 vfrStatementExpression[0]\r
2869 E:EndIf << CRT_END_OP (E); >>\r
2870 ;\r
2871\r
30fdf114
LG
2872vfrStatementDisableIfQuest :\r
2873 << \r
2874 CIfrDisableIf DIObj; \r
30fdf114
LG
2875 >>\r
2876 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 2877 vfrStatementExpression[0] ";"\r
30fdf114
LG
2878 vfrStatementQuestionOptionList\r
2879 E:EndIf << CRT_END_OP (E); >>\r
2880 ;\r
2881\r
2882vfrStatementRefresh :\r
2883 << CIfrRefresh RObj; >>\r
2884 L:Refresh << RObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2885 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\r
30fdf114
LG
2886 ;\r
2887\r
4234283c
LG
2888vfrStatementRefreshEvent :\r
2889 <<\r
2890 CIfrRefreshId RiObj;\r
2891 EFI_GUID Guid;\r
2892 >>\r
2893 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
2894 "=" guidDefinition[Guid] "," << RiObj.SetRefreshEventGroutId (&Guid); >>\r
2895 ;\r
2896\r
30fdf114
LG
2897vfrStatementVarstoreDevice :\r
2898 << CIfrVarStoreDevice VDObj; >>\r
2899 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
e4ac870f 2900 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2901 ;\r
2902\r
2903vfrStatementSuppressIfQuest :\r
2904 << CIfrSuppressIf SIObj; >>\r
2905 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
2906 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2907 vfrStatementExpression[0] ";"\r
2908 vfrStatementQuestionOptionList\r
2909 E:EndIf << CRT_END_OP (E); >>\r
2910 ;\r
2911\r
2912vfrStatementGrayOutIfQuest :\r
2913 << CIfrGrayOutIf GOIObj; >>\r
2914 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
2915 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
2916 vfrStatementExpression[0] ";"\r
2917 vfrStatementQuestionOptionList\r
2918 E:EndIf << CRT_END_OP (E); >>\r
2919 ;\r
2920\r
2921vfrStatementOptions :\r
2922 vfrStatementOneOfOption\r
2923 ;\r
2924\r
2925vfrStatementOneOfOption :\r
2926 <<\r
4afd3d04 2927 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
30fdf114 2928 CHAR8 *VarStoreName = NULL;\r
4afd3d04
LG
2929 UINT32 Size = 0;\r
2930 BOOLEAN TypeError = FALSE;\r
2931 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
2932 EFI_GUID *VarStoreGuid = NULL;\r
2933 \r
2934 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2935 TypeError = TRUE;\r
2936 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
2937 } else {\r
2938 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
2939 }\r
2940\r
2941 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
2942 CIfrOneOfOption OOOObj ((UINT8)Size);\r
30fdf114 2943 >>\r
4afd3d04
LG
2944 L:Option << \r
2945 OOOObj.SetLineNo(L->getLine());\r
2946 if (TypeError) {\r
2947 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
2948 }\r
2949 if (ReturnCode != VFR_RETURN_SUCCESS) {\r
2950 _PCATCH (ReturnCode, L->getLine());\r
2951 }\r
2952 >>\r
e4ac870f 2953 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
a709adfa
LG
2954 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," \r
2955 << \r
2956 if (gCurrentMinMaxData != NULL) {\r
2957 //set min/max value for oneof opcode\r
2958 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
2959 switch (_GET_CURRQEST_DATATYPE()) {\r
2960 case EFI_IFR_TYPE_NUM_SIZE_64:\r
2961 gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
2962 break;\r
2963 case EFI_IFR_TYPE_NUM_SIZE_32:\r
2964 gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
2965 break;\r
2966 case EFI_IFR_TYPE_NUM_SIZE_16:\r
2967 gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
2968 break;\r
2969 case EFI_IFR_TYPE_NUM_SIZE_8:\r
2970 gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
2971 break;\r
2972 default:\r
2973 break;\r
2974 }\r
2975 }\r
2976 OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
2977 OOOObj.SetValue (Val); \r
2978 >>\r
30fdf114
LG
2979 F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
2980 <<\r
4afd3d04
LG
2981 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2982 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
2983 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2984 if (OOOObj.GetFlags () & 0x10) {\r
2985 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
2986 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2987 EFI_HII_DEFAULT_CLASS_STANDARD,\r
2988 _GET_CURRQEST_VARTINFO(),\r
2989 VarStoreName,\r
2990 VarStoreGuid,\r
2991 _GET_CURRQEST_DATATYPE (),\r
2992 Val\r
2993 ), L->getLine());\r
2994 }\r
2995 if (OOOObj.GetFlags () & 0x20) {\r
2996 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
2997 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2998 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
2999 _GET_CURRQEST_VARTINFO(),\r
3000 VarStoreName,\r
3001 VarStoreGuid,\r
3002 _GET_CURRQEST_DATATYPE (),\r
3003 Val\r
3004 ), L->getLine());\r
3005 }\r
30fdf114
LG
3006 }\r
3007 >>\r
3008 {\r
3009 "," Key "=" KN:Number <<\r
3010 if (!mCompatibleMode) {\r
3011 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
3012 }\r
3013 //\r
3014 // Guid Option Key\r
3015 //\r
3016 CIfrOptionKey IfrOptionKey (\r
3017 gCurrentQuestion->QUESTION_ID(),\r
3018 Val,\r
e4ac870f 3019 _STOQID(KN->getText(), KN->getLine())\r
30fdf114
LG
3020 );\r
3021 SET_LINE_INFO (IfrOptionKey, KN);\r
3022 >>\r
3023 }\r
3024 (\r
3025 T:"," vfrImageTag << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
3026 )*\r
3027 ";"\r
3028 ;\r
3029\r
3030vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
3031 <<\r
3032 UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
3033 UINT8 HFlags = 0;\r
3034 >>\r
3035 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
3036 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
3037 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
3038 ;\r
3039\r
3040oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 3041 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3042 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r
3043 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
3044 | InteractiveFlag << $HFlags |= 0x04; >>\r
3045 | NVAccessFlag << $HFlags |= 0x08; >>\r
3046 | ResetRequiredFlag << $HFlags |= 0x10; >>\r
3047 | LateCheckFlag << $HFlags |= 0x20; >>\r
3048 | ManufacturingFlag << $LFlags |= 0x20; >>\r
3049 | DefaultFlag << $LFlags |= 0x10; >>\r
3050 ;\r
3051\r
3052vfrStatementLabel :\r
3053 L:Label\r
3054 N:Number <<\r
3055 if (mCompatibleMode) {\r
3056 //\r
3057 // Add end Label for Framework Vfr\r
3058 //\r
3059 CIfrLabel LObj1;\r
3060 LObj1.SetLineNo(L->getLine());\r
3061 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
3062 }\r
3063\r
3064 {\r
3065 CIfrLabel LObj2;\r
3066 LObj2.SetLineNo(L->getLine());\r
e4ac870f 3067 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
30fdf114
LG
3068 }\r
3069 >>\r
3070 ";"\r
3071 ;\r
3072\r
3073vfrStatementBanner :\r
3074 << CIfrBanner BObj; >>\r
3075 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r
e4ac870f 3076 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3077 (\r
3078 (\r
e4ac870f 3079 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
30fdf114
LG
3080 Align\r
3081 (\r
3082 Left << BObj.SetAlign (0); >>\r
3083 | Center << BObj.SetAlign (1); >>\r
3084 | Right << BObj.SetAlign (2); >>\r
3085 ) ";"\r
3086 )\r
3087 |\r
3088 (\r
e4ac870f 3089 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
30fdf114
LG
3090 )\r
3091 )\r
3092 ;\r
3093\r
3094//******************************************************************************\r
3095//\r
3096// keep some syntax for compatibility but not generate any IFR object\r
3097//\r
3098vfrStatementInvalidHidden :\r
3099 L:Hidden <<\r
3100 if (!mCompatibleMode) {\r
3101 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3102 }\r
3103 >>\r
3104 Value "=" Number ","\r
3105 Key "=" Number ";"\r
3106 ;\r
3107\r
3108vfrStatementInvalidInconsistentIf :\r
3109 InconsistentIf\r
3110 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
3111 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3112 vfrStatementExpression[0]\r
3113 EndIf\r
3114 ";"\r
3115 ;\r
3116\r
3117vfrStatementInvalidInventory :\r
3118 L:Inventory <<\r
3119 if (!mCompatibleMode) {\r
3120 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3121 }\r
3122 >>\r
3123 Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3124 Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3125 {\r
3126 Text "=" "STRING_TOKEN" "\(" Number "\)"\r
3127 }\r
3128 ";"\r
3129 ;\r
3130\r
3131vfrStatementInvalidSaveRestoreDefaults :\r
3132 (\r
3133 L:Save <<\r
3134 if (!mCompatibleMode) {\r
3135 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3136 }\r
3137 >>\r
3138 |\r
3139 K:Restore <<\r
3140 if (!mCompatibleMode) {\r
3141 _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
3142 }\r
3143 >>\r
3144 )\r
3145 Defaults ","\r
3146 FormId "=" Number ","\r
3147 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3148 Help "=" "STRING_TOKEN" "\(" Number "\)"\r
3149 { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
3150 { "," Key "=" Number }\r
3151 ";"\r
3152 ;\r
3153\r
3154//******************************************************************************\r
3155//\r
3156// The syntax of expression\r
3157//\r
3158#token Dup("dup") "dup"\r
3159#token VarEqVal("vareqval") "vareqval"\r
3160#token Var("var") "var"\r
3161#token IdEqVal("ideqval") "ideqval"\r
3162#token IdEqId("ideqid") "ideqid"\r
3163#token IdEqValList("ideqvallist") "ideqvallist"\r
3164#token QuestionRef("questionref") "questionref"\r
3165#token RuleRef("ruleref") "ruleref"\r
3166#token StringRef("stringref") "stringref"\r
3167#token PushThis("pushthis") "pushthis"\r
a709adfa 3168#token Security("security") "security"\r
52302d4d 3169#token Get("get") "get"\r
30fdf114
LG
3170#token True("TRUE") "TRUE"\r
3171#token False("FALSE") "FALSE"\r
3172#token One("ONE") "ONE"\r
3173#token Ones("ONES") "ONES"\r
3174#token Zero("ZERO") "ZERO"\r
3175#token Undefined("UNDEFINED") "UNDEFINED"\r
3176#token Version("VERSION") "VERSION"\r
3177#token Length("length") "length"\r
3178#token AND("AND") "AND"\r
3179#token OR("OR") "OR"\r
3180#token NOT("NOT") "NOT"\r
52302d4d 3181#token Set("set") "set"\r
30fdf114
LG
3182#token BitWiseNot("~") "\~"\r
3183#token BoolVal("boolval") "boolval"\r
3184#token StringVal("stringval") "stringval"\r
3185#token UnIntVal("unintval") "unintval"\r
3186#token ToUpper("toupper") "toupper"\r
3187#token ToLower("tolower") "tolower"\r
3188#token Match("match") "match"\r
3189#token Catenate("catenate") "catenate"\r
3190#token QuestionRefVal("questionrefval") "questionrefval"\r
3191#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3192#token Map("map") "map"\r
4234283c 3193#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3194\r
3195//\r
3196// Root expression extension function called by other function.\r
3197//\r
3198vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3199 << 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
3200 andTerm[$RootLevel, $ExpOpCount]\r
3201 (\r
3202 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3203 )*\r
3204 <<\r
3205 //\r
3206 // Extend OpCode Scope only for the root expression.\r
3207 //\r
3208 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3209 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3210 CIfrEnd EObj;\r
52302d4d
LG
3211 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3212 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3213 }\r
3214 }\r
3215 }\r
52302d4d
LG
3216 \r
3217 if ($RootLevel == 0) {\r
3218 mCIfrOpHdrIndex --;\r
3219 }\r
30fdf114
LG
3220 >>\r
3221 ;\r
3222\r
3223//\r
3224// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3225// This funciton is only called by sub expression.\r
3226//\r
3227vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3228 andTerm[$RootLevel, $ExpOpCount]\r
3229 (\r
3230 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3231 )*\r
3232 ;\r
3233\r
3234andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3235 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3236 (\r
3237 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3238 )*\r
3239 ;\r
3240\r
3241bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3242 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3243 (\r
3244 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3245 )*\r
3246 ;\r
3247\r
3248bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3249 equalTerm[$RootLevel, $ExpOpCount]\r
3250 (\r
3251 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3252 )*\r
3253 ;\r
3254\r
3255equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3256 compareTerm[$RootLevel, $ExpOpCount]\r
3257 (\r
3258 (\r
3259 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3260 )\r
3261 |\r
3262 (\r
3263 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3264 )\r
3265 )*\r
3266 ;\r
3267\r
3268compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3269 shiftTerm[$RootLevel, $ExpOpCount]\r
3270 (\r
3271 (\r
3272 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3273 )\r
3274 |\r
3275 (\r
3276 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3277 )\r
3278 |\r
3279 (\r
3280 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3281 )\r
3282 |\r
3283 (\r
3284 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3285 )\r
3286 )*\r
3287 ;\r
3288\r
3289shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3290 addMinusTerm[$RootLevel, $ExpOpCount]\r
3291 (\r
3292 (\r
3293 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3294 )\r
3295 |\r
3296 (\r
3297 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3298 )\r
3299 )*\r
3300 ;\r
3301\r
3302addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3303 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3304 (\r
3305 (\r
3306 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3307 )\r
3308 |\r
3309 (\r
3310 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3311 )\r
3312 )*\r
3313 ;\r
3314\r
3315multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3316 castTerm[$RootLevel, $ExpOpCount]\r
3317 (\r
3318 (\r
3319 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3320 )\r
3321 |\r
3322 (\r
3323 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3324 )\r
3325 |\r
3326 (\r
3327 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3328 )\r
3329 )*\r
3330 ;\r
3331\r
3332castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3333 << UINT8 CastType = 0xFF; >>\r
3334 (\r
3335 L:"\("\r
3336 (\r
3337 Boolean << CastType = 0; >>\r
3338 | Uint64 << CastType = 1; >>\r
3339 | Uint32 << CastType = 1; >>\r
3340 | Uint16 << CastType = 1; >>\r
3341 | Uint8 << CastType = 1; >>\r
3342 )\r
3343 "\)"\r
3344 )*\r
3345 atomTerm[$RootLevel, $ExpOpCount]\r
3346 <<\r
3347 switch (CastType) {\r
3348 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3349 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3350 }\r
3351 >>\r
3352 ;\r
3353\r
3354atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3355 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3356 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
3357 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3358 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3359 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3360 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3361 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3362 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3363 | (\r
3364 L:NOT\r
3365 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3366 )\r
3367 ;\r
3368\r
3369vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3370 L:Catenate\r
3371 "\("\r
3372 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3373 ","\r
3374 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3375 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3376 ;\r
3377\r
3378vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3379 L:Match\r
3380 "\("\r
3381 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3382 ","\r
3383 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3384 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3385 ;\r
3386\r
3387vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3388 "\("\r
3389 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3390 "\)"\r
3391 ;\r
3392\r
3393vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3394 dupExp[$RootLevel, $ExpOpCount]\r
3395 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3396 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3397 | ideqidExp[$RootLevel, $ExpOpCount]\r
3398 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3399 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3400 | rulerefExp[$RootLevel, $ExpOpCount]\r
3401 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3402 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3403 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3404 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3405 ;\r
3406\r
3407dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3408 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3409 ;\r
3410\r
3411vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3412 <<\r
3413 EFI_QUESTION_ID QId;\r
3414 UINT32 Mask;\r
3415 UINT16 ConstVal;\r
3416 CHAR8 *VarIdStr;\r
3417 UINT32 LineNo;\r
30fdf114 3418 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3419 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3420 >>\r
3421 L:VarEqVal <<\r
3422 if (!mCompatibleMode) {\r
3423 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3424 }\r
3425 >>\r
3426 VK:Var\r
3427 OpenParen\r
3428 VN:Number <<\r
3429 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
4afd3d04 3430 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114
LG
3431 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
3432 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
3433 VarIdStr,\r
3434 &mFormsetGuid,\r
e4ac870f 3435 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3436 0x2, //default type is UINT16\r
3437 FALSE\r
3438 ), VN);\r
3439 } else {\r
3440 _PCATCH (VfrReturnCode, VN);\r
3441 }\r
3442 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3443 LineNo = GET_LINENO(VN);\r
3444 >>\r
3445 CloseParen\r
3446 (\r
3447 (\r
3448 "=="\r
e4ac870f 3449 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3450 <<\r
3451 if (Mask == 0) {\r
3452 CIfrEqIdVal EIVObj (L->getLine());\r
3453 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3454 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3455 EIVObj.SetValue (ConstVal);\r
3456 $ExpOpCount++;\r
3457 } else {\r
3458 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3459 }\r
3460 >>\r
3461 )\r
3462 |\r
3463 (\r
3464 "<="\r
e4ac870f 3465 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3466 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3467 )\r
3468 |\r
3469 (\r
3470 "<"\r
e4ac870f 3471 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3472 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3473 )\r
3474 |\r
3475 (\r
3476 ">="\r
e4ac870f 3477 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3478 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3479 )\r
3480 |\r
3481 (\r
3482 ">"\r
e4ac870f 3483 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3484 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3485 )\r
3486 )\r
3487 ;\r
3488\r
3489ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3490 <<\r
3491 EFI_QUESTION_ID QId;\r
3492 UINT32 Mask;\r
3493 UINT16 ConstVal;\r
3494 CHAR8 *VarIdStr;\r
3495 UINT32 LineNo;\r
3496 >>\r
3497 L:IdEqVal\r
3498 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3499 (\r
3500 (\r
3501 "=="\r
e4ac870f 3502 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3503 <<\r
3504 if (Mask == 0) {\r
3505 CIfrEqIdVal EIVObj (L->getLine());\r
3506 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3507 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3508 EIVObj.SetValue (ConstVal);\r
3509 $ExpOpCount++;\r
3510 } else {\r
3511 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3512 }\r
3513 >>\r
3514 )\r
3515 |\r
3516 (\r
3517 "<="\r
e4ac870f 3518 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3519 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3520 )\r
3521 |\r
3522 (\r
3523 "<"\r
e4ac870f 3524 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3525 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3526 )\r
3527 |\r
3528 (\r
3529 ">="\r
e4ac870f 3530 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3531 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3532 )\r
3533 |\r
3534 (\r
3535 ">"\r
e4ac870f 3536 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3537 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3538 )\r
3539 )\r
3540 ;\r
3541\r
3542ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3543 <<\r
3544 EFI_QUESTION_ID QId[2];\r
3545 UINT32 Mask[2];\r
3546 CHAR8 *VarIdStr[2];\r
3547 UINT32 LineNo[2];\r
3548 >>\r
3549 L:IdEqId\r
3550 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
3551 (\r
3552 (\r
3553 "=="\r
3554 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3555 <<\r
3556 if (Mask[0] & Mask[1]) {\r
3557 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
3558 } else {\r
3559 CIfrEqIdId EIIObj(L->getLine());\r
3560 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
3561 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
3562 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
3563 $ExpOpCount++;\r
3564 }\r
3565 >>\r
3566 )\r
3567 |\r
3568 (\r
3569 "<="\r
3570 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3571 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
3572 )\r
3573 |\r
3574 (\r
3575 "<"\r
3576 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3577 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
3578 )\r
3579 |\r
3580 (\r
3581 ">="\r
3582 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3583 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
3584 )\r
3585 |\r
3586 (\r
3587 ">"\r
3588 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
3589 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
3590 )\r
3591 )\r
3592 ;\r
3593\r
3594ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3595 <<\r
3596 UINT16 ListLen = 0;\r
3597 EFI_QUESTION_ID QId;\r
3598 UINT32 Mask;\r
3599 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3600 CHAR8 *VarIdStr;\r
3601 UINT32 LineNo;\r
3602 >>\r
3603 L:IdEqValList\r
3604 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3605 "=="\r
3606 (\r
e4ac870f 3607 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
3608 )+\r
3609 <<\r
3610 if (Mask != 0) {\r
3611 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
3612 } else {\r
3613 UINT16 Index;\r
3614 CIfrEqIdList EILObj(L->getLine());\r
3615 if (QId != EFI_QUESTION_ID_INVALID) {\r
3616 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3617 }\r
3618 EILObj.SetListLength (ListLen);\r
3619 for (Index = 0; Index < ListLen; Index++) {\r
3620 EILObj.SetValueList (Index, ValueList[Index]);\r
3621 }\r
3622 \r
3623 EILObj.UpdateIfrBuffer();\r
3624 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
3625 \r
3626 if (QId == EFI_QUESTION_ID_INVALID) {\r
3627 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3628 }\r
3629 $ExpOpCount++;\r
3630 }\r
3631 >>\r
3632 ;\r
3633\r
2bcc713e 3634questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 3635 <<\r
30fdf114
LG
3636 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3637 UINT32 BitMask;\r
3638 CHAR8 *QName = NULL;\r
3639 UINT32 LineNo = 0;\r
3640 >>\r
3641 L:QuestionRef\r
2bcc713e
LG
3642 "\("\r
3643 (\r
30fdf114
LG
3644 QN:StringIdentifier <<\r
3645 QName = QN->getText();\r
2bcc713e 3646 LineNo = QN->getLine();\r
30fdf114
LG
3647 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
3648 >>\r
e4ac870f 3649 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 3650 )\r
2bcc713e 3651 "\)"\r
30fdf114 3652 <<\r
2bcc713e 3653 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
3654 ;\r
3655\r
3656rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3657 L:RuleRef\r
3658 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
3659 ;\r
3660\r
3661//******************************************************\r
3662// PARSE:\r
3663// stringref (STR_FORM_SET_TITLE)\r
3664//\r
3665stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
3666 <<\r
3667 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
3668 >>\r
30fdf114 3669 L:StringRef\r
52302d4d
LG
3670 "\("\r
3671 ( \r
3672 "STRING_TOKEN"\r
3673 "\(" \r
e4ac870f 3674 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 3675 "\)"\r
e4ac870f 3676 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
3677 )\r
3678 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
3679 ;\r
3680\r
3681pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3682 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3683 ;\r
3684\r
a709adfa
LG
3685securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3686 <<\r
3687 EFI_GUID Guid;\r
3688 >>\r
3689 L:Security\r
3690 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
3691 ;\r
3692\r
52302d4d
LG
3693numericVarStoreType [UINT8 & VarType] :\r
3694 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
3695 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
3696 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
3697 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
3698 ;\r
3699\r
3700getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3701 <<\r
3702 EFI_VARSTORE_INFO Info;\r
3703 CHAR8 *VarIdStr = NULL;\r
3704 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3705 UINT32 Mask = 0;\r
3706 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3707 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3708 UINT32 VarSize = 0;\r
3709 Info.mVarStoreId = 0;\r
3710 >>\r
3711 L:Get\r
3712 "\(" \r
3713 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3714 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
3715 "\)" << \r
3716 {\r
3717 if (Info.mVarStoreId == 0) {\r
3718 // support Date/Time question\r
3719 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3720 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3721 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3722 }\r
3723 if (QType == QUESTION_DATE) {\r
3724 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3725 } else if (QType == QUESTION_TIME) {\r
3726 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3727 }\r
3728 switch (Mask) {\r
3729 case DATE_YEAR_BITMASK:\r
3730 Info.mInfo.mVarOffset = 0;\r
3731 break;\r
3732 case DATE_DAY_BITMASK:\r
3733 Info.mInfo.mVarOffset = 3;\r
3734 break;\r
3735 case TIME_HOUR_BITMASK:\r
3736 Info.mInfo.mVarOffset = 0;\r
3737 break;\r
3738 case TIME_MINUTE_BITMASK:\r
3739 Info.mInfo.mVarOffset = 1;\r
3740 break;\r
3741 case TIME_SECOND_BITMASK:\r
3742 Info.mInfo.mVarOffset = 2;\r
3743 break;\r
3744 default:\r
3745 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3746 break;\r
3747 }\r
3748 } else {\r
3749 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3750 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3751 }\r
3752 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3753 Info.mVarType = VarType;\r
3754 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3755 Info.mVarTotalSize = VarSize;\r
3756 }\r
3757 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3758 if (VarSize != Info.mVarTotalSize) {\r
3759 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
3760 }\r
3761 }\r
3762 CIfrGet GObj(L->getLine()); \r
3763 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
3764 GObj.SetVarInfo (&Info); \r
3765 delete VarIdStr; \r
3766 $ExpOpCount++;\r
3767 }\r
3768 >>\r
3769 ;\r
3770\r
30fdf114
LG
3771vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3772 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
3773 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
3774 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
3775 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
3776 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
3777 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
3778 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 3779 | 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
3780 ;\r
3781\r
3782vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3783 lengthExp[$RootLevel, $ExpOpCount]\r
3784 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3785 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3786 | stringref2Exp[$RootLevel, $ExpOpCount]\r
3787 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 3788 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3789 | unintExp[$RootLevel, $ExpOpCount]\r
3790 | toupperExp[$RootLevel, $ExpOpCount]\r
3791 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 3792 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3793 ;\r
3794\r
3795lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3796 L:Length\r
3797 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3798 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
3799 ;\r
3800\r
3801bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3802 L:BitWiseNot\r
3803 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3804 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
3805 ;\r
3806\r
2bcc713e
LG
3807question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3808 <<\r
3809 UINT8 Type = 0x1;\r
3810 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
3811 EFI_GUID Guid = {0,};\r
3812 >>\r
30fdf114 3813 L:QuestionRefVal\r
2bcc713e
LG
3814 "\("\r
3815 {\r
e4ac870f 3816 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
3817 }\r
3818 {\r
3819 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
3820 }\r
3821 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
3822 "\)"\r
3823 <<\r
3824 switch (Type) {\r
3825 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
3826 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
3827 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
3828 }\r
3829 $ExpOpCount++;\r
3830 >>\r
30fdf114
LG
3831 ;\r
3832\r
3833stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3834 L:StringRefVal\r
3835 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3836 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
3837 ;\r
3838\r
3839toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3840 L:BoolVal\r
3841 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3842 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
3843 ;\r
3844\r
3845tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3846 << UINT8 Fmt = 0; >>\r
3847 L:StringVal\r
3848 {\r
e4ac870f 3849 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
3850 }\r
3851 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3852 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
3853 ;\r
3854\r
3855unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3856 L:UnIntVal\r
3857 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3858 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
3859 ;\r
3860\r
3861toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3862 L:ToUpper\r
3863 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3864 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
3865 ;\r
3866\r
3867tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3868 L:ToLower\r
3869 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
3870 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
3871 ;\r
3872\r
52302d4d
LG
3873setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3874 <<\r
3875 EFI_VARSTORE_INFO Info;\r
3876 CHAR8 *VarIdStr = NULL;\r
3877 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
3878 UINT32 Mask = 0;\r
3879 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
3880 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
3881 UINT32 VarSize = 0;\r
3882 Info.mVarStoreId = 0;\r
3883 >>\r
3884 L:Set\r
3885 "\("\r
3886 vfrStorageVarId[Info, VarIdStr, FALSE]\r
3887 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
3888 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
3889 "\)"\r
3890 << \r
3891 {\r
3892 if (Info.mVarStoreId == 0) {\r
3893 // support Date/Time question\r
3894 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
3895 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
3896 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3897 }\r
3898 if (QType == QUESTION_DATE) {\r
3899 Info.mVarType = EFI_IFR_TYPE_DATE;\r
3900 } else if (QType == QUESTION_TIME) {\r
3901 Info.mVarType = EFI_IFR_TYPE_TIME;\r
3902 }\r
3903 switch (Mask) {\r
3904 case DATE_YEAR_BITMASK:\r
3905 Info.mInfo.mVarOffset = 0;\r
3906 break;\r
3907 case DATE_DAY_BITMASK:\r
3908 Info.mInfo.mVarOffset = 3;\r
3909 break;\r
3910 case TIME_HOUR_BITMASK:\r
3911 Info.mInfo.mVarOffset = 0;\r
3912 break;\r
3913 case TIME_MINUTE_BITMASK:\r
3914 Info.mInfo.mVarOffset = 1;\r
3915 break;\r
3916 case TIME_SECOND_BITMASK:\r
3917 Info.mInfo.mVarOffset = 2;\r
3918 break;\r
3919 default:\r
3920 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
3921 break;\r
3922 }\r
3923 } else {\r
3924 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
3925 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
3926 }\r
3927 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
3928 Info.mVarType = VarType;\r
3929 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3930 Info.mVarTotalSize = VarSize;\r
3931 }\r
3932 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
3933 if (VarSize != Info.mVarTotalSize) {\r
3934 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
3935 }\r
3936 }\r
3937 CIfrSet TSObj(L->getLine()); \r
3938 TSObj.SetVarInfo (&Info); \r
3939 delete VarIdStr; \r
3940 $ExpOpCount++;\r
3941 }\r
3942 >>\r
3943 ;\r
3944\r
30fdf114
LG
3945vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3946 conditionalExp[$RootLevel, $ExpOpCount]\r
3947 | findExp[$RootLevel, $ExpOpCount]\r
3948 | midExp[$RootLevel, $ExpOpCount]\r
3949 | tokenExp[$RootLevel, $ExpOpCount]\r
3950 | spanExp[$RootLevel, $ExpOpCount]\r
3951 ;\r
3952\r
3953#token Cond("cond") "cond"\r
3954#token Find("find") "find"\r
3955#token Mid("mid") "mid"\r
3956#token Tok("token") "token"\r
3957#token Span("span") "span"\r
3958\r
3959conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3960 L:Cond "\("\r
3961 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3962 "?"\r
3963 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3964 ":"\r
3965 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3966 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
3967 ;\r
3968\r
3969findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3970 << UINT8 Format; >>\r
3971 L:Find "\("\r
3972 findFormat[Format] ( "\|" findFormat[Format] )*\r
3973 ","\r
3974 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3975 ","\r
3976 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3977 ","\r
3978 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3979 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
3980 ;\r
3981\r
3982findFormat [UINT8 & Format] :\r
3983 "SENSITIVE" << $Format = 0x00; >>\r
3984 | "INSENSITIVE" << $Format = 0x01; >>\r
3985 ;\r
3986\r
3987midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3988 L:Mid "\("\r
3989 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3990 ","\r
3991 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3992 ","\r
3993 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3994 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
3995 ;\r
3996\r
3997tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3998 L:Tok "\("\r
3999 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4000 ","\r
4001 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4002 ","\r
4003 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4004 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4005 ;\r
4006\r
4007spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4008 << UINT8 Flags = 0; >>\r
4009 S:Span "\("\r
4010 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4011 ","\r
4012 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4013 ","\r
4014 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4015 ","\r
4016 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4017 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4018 ;\r
4019\r
52302d4d
LG
4020vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4021 L:Map \r
4022 "\(" \r
4023 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4024 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4025 (\r
4026 vfrStatementExpression[0]\r
4027 ","\r
4028 vfrStatementExpression[0]\r
4029 ";"\r
4030 ) *\r
4031 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4032 ;\r
4033\r
30fdf114 4034spanFlags [UINT8 & Flags] :\r
e4ac870f 4035 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4036 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4037 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4038 ;\r
4039\r
4040#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4041#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4042\r
4043//******************************************************************************\r
4044//\r
4045// Parser class definition.\r
4046//\r
4047class EfiVfrParser {\r
4048<<\r
4049private:\r
4050 UINT8 mParserStatus;\r
4051 BOOLEAN mConstantOnlyInExpression;\r
4052\r
4053 CVfrDefaultStore mCVfrDefaultStore;\r
4054 CVfrDataStorage mCVfrDataStorage;\r
4055 CVfrQuestionDB mCVfrQuestionDB;\r
4056 CVfrRulesDB mCVfrRulesDB;\r
4057\r
52302d4d
LG
4058 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
4059 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
4060 UINT8 mCIfrOpHdrIndex;\r
30fdf114
LG
4061 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
4062 VOID _CLEAR_SAVED_OPHDR (VOID);\r
4063 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
4064\r
4065\r
4066 EFI_VARSTORE_INFO mCurrQestVarInfo;\r
4234283c 4067 EFI_GUID *mOverrideClassGuid;\r
4afd3d04
LG
4068 CHAR8* mLastFormEndAddr;\r
4069\r
4070//\r
4071// Whether the question already has default value.\r
4072//\r
4073 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
4074 UINT16 mUsedDefaultCount;\r
30fdf114
LG
4075\r
4076//\r
4077// For framework vfr compatibility\r
4078//\r
4079 BOOLEAN mCompatibleMode;\r
4080 EFI_GUID mFormsetGuid;\r
4081\r
4082 VOID _CRT_OP (IN BOOLEAN);\r
4083\r
4084 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
4085 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
4086\r
4087 UINT8 _GET_CURRQEST_DATATYPE ();\r
4088 UINT32 _GET_CURRQEST_VARSIZE ();\r
b303ea72 4089 UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
4afd3d04 4090 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
30fdf114
LG
4091\r
4092public:\r
52302d4d 4093 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
30fdf114
LG
4094 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
4095 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
4096 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
52302d4d 4097 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
30fdf114
LG
4098\r
4099 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
4100\r
4101 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
4102 CHAR8* _U32TOS (IN UINT32);\r
e4ac870f
LG
4103 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);\r
4104 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);\r
4105 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);\r
4106 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);\r
4107 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4108 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4109 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
4110\r
4111 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);\r
4112 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);\r
4113 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);\r
30fdf114 4114\r
52302d4d 4115 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
30fdf114 4116\r
30fdf114
LG
4117 VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
4118 VOID _DeclareStandardDefaultStorage (IN UINT32);\r
4119 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
4120\r
4121 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
4122\r
4123 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r
4124 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
4125 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
4126 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
4234283c 4127 VOID SetOverrideClassGuid (IN EFI_GUID *);\r
30fdf114
LG
4128//\r
4129// For framework vfr compatibility\r
4130//\r
4131 VOID SetCompatibleMode (IN BOOLEAN);\r
4132>>\r
4133}\r
4134\r
4135<<\r
4136VOID\r
4137EfiVfrParser::_SAVE_OPHDR_COND (\r
4138 IN CIfrOpHeader &OpHdr,\r
4139 IN BOOLEAN Cond,\r
4140 IN UINT32 LineNo\r
4141 )\r
4142{\r
4143 if (Cond == TRUE) {\r
52302d4d 4144 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
30fdf114
LG
4145 return ;\r
4146 }\r
52302d4d
LG
4147 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
4148 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
30fdf114
LG
4149 }\r
4150}\r
4151\r
4152VOID\r
4153EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
4154 VOID\r
4155 )\r
4156{\r
52302d4d
LG
4157 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
4158 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
30fdf114
LG
4159}\r
4160\r
4161BOOLEAN\r
4162EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
4163 VOID\r
4164 )\r
4165{\r
52302d4d
LG
4166 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
4167 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
30fdf114
LG
4168 return TRUE;\r
4169 }\r
52302d4d 4170\r
30fdf114
LG
4171 //\r
4172 // IfrOpHdr is not set, FALSE is return.\r
4173 //\r
4174 return FALSE;\r
4175}\r
4176\r
4177VOID\r
4178EfiVfrParser::_CRT_OP (\r
4179 IN BOOLEAN Crt\r
4180 )\r
4181{\r
4182 gCreateOp = Crt;\r
4183}\r
4184\r
4185VOID\r
4186EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
4187 IN EFI_VARSTORE_INFO &Info\r
4188 )\r
4189{\r
4190 mCurrQestVarInfo = Info;\r
4191}\r
4192\r
4193EFI_VARSTORE_INFO &\r
4194EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
4195 VOID\r
4196 )\r
4197{\r
4198 return mCurrQestVarInfo;\r
4199}\r
4200\r
b303ea72
LG
4201UINT32\r
4202EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
4203 VOID\r
4204 )\r
4205{\r
4206 UINT8 Size = 1;\r
4207\r
4208 switch (mCurrQestVarInfo.mVarType) {\r
4209 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4210 Size = 1;\r
4211 break;\r
4212\r
4213 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4214 Size = 2;\r
4215 break;\r
4216\r
4217 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4218 Size = 4;\r
4219 break;\r
4220\r
4221 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4222 Size = 8;\r
4223 break;\r
4224\r
4225 default:\r
4226 break;\r
4227 }\r
4228\r
4229 return (mCurrQestVarInfo.mVarTotalSize / Size);\r
4230}\r
4231\r
30fdf114
LG
4232UINT8\r
4233EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
4234 VOID\r
4235 )\r
4236{\r
4237 return mCurrQestVarInfo.mVarType;\r
4238}\r
4239\r
4240UINT32\r
4241EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
4242 VOID\r
4243 )\r
4244{\r
4245 return mCurrQestVarInfo.mVarTotalSize;\r
4246}\r
4247\r
4248VOID\r
4249EfiVfrParser::_PCATCH (\r
4250 IN INTN ReturnCode,\r
4251 IN INTN ExpectCode,\r
4252 IN ANTLRTokenPtr Tok,\r
52302d4d 4253 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4254 )\r
4255{\r
4256 if (ReturnCode != ExpectCode) {\r
4257 mParserStatus++;\r
4258 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r
4259 }\r
4260}\r
4261\r
4262VOID\r
4263EfiVfrParser::_PCATCH (\r
4264 IN EFI_VFR_RETURN_CODE ReturnCode\r
4265 )\r
4266{\r
52302d4d 4267 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
30fdf114
LG
4268}\r
4269\r
4270VOID\r
4271EfiVfrParser::_PCATCH (\r
4272 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4273 IN ANTLRTokenPtr Tok\r
4274 )\r
4275{\r
52302d4d 4276 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
30fdf114
LG
4277}\r
4278\r
4279VOID\r
4280EfiVfrParser::_PCATCH (\r
4281 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4282 IN UINT32 LineNum\r
4283 )\r
4284{\r
52302d4d 4285 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
30fdf114
LG
4286}\r
4287\r
4288VOID\r
4289EfiVfrParser::_PCATCH (\r
4290 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4291 IN UINT32 LineNum,\r
52302d4d 4292 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4293 )\r
4294{\r
52302d4d 4295 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
30fdf114
LG
4296}\r
4297\r
4298VOID\r
4299EfiVfrParser::syn (\r
4300 ANTLRAbstractToken *Tok,\r
4301 ANTLRChar *Egroup,\r
4302 SetWordType *Eset,\r
4303 ANTLRTokenType ETok,\r
4304 INT32 Huh\r
4305 )\r
4306{\r
4307 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
4308\r
4309 mParserStatus += 1;\r
4310}\r
4311\r
4312CHAR8 *\r
4313EfiVfrParser::TrimHex (\r
4314 IN CHAR8 *Str,\r
4315 OUT BOOLEAN *IsHex\r
4316 )\r
4317{\r
4318 *IsHex = FALSE;\r
4319\r
4320 while (*Str && *Str == ' ') {\r
4321 Str++;\r
4322 }\r
4323 while (*Str && *Str == '0') {\r
4324 Str++;\r
4325 }\r
4326 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
4327 Str++;\r
4328 *IsHex = TRUE;\r
4329 }\r
4330\r
4331 return Str;\r
4332}\r
4333\r
4334CHAR8 *\r
4335EfiVfrParser::_U32TOS (\r
4336 IN UINT32 Value\r
4337 )\r
4338{\r
4339 CHAR8 *Str;\r
4340 Str = new CHAR8[20];\r
4341 sprintf (Str, "%d", Value);\r
4342 return Str;\r
4343}\r
4344\r
4345UINT8\r
4346EfiVfrParser::_STOU8 (\r
e4ac870f
LG
4347 IN CHAR8 *Str,\r
4348 IN UINT32 LineNum\r
30fdf114
LG
4349 )\r
4350{\r
4351 BOOLEAN IsHex;\r
4352 UINT8 Value;\r
4353 CHAR8 c;\r
4354\r
e4ac870f
LG
4355 UINT8 PreviousValue;\r
4356 CHAR8 *OrigString = Str;\r
4357 CHAR8 ErrorMsg[100];\r
4358\r
30fdf114
LG
4359 Str = TrimHex (Str, &IsHex);\r
4360 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4361 PreviousValue = Value;\r
30fdf114
LG
4362 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4363\r
4364 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4365 Value += (c - 'a' + 10);\r
4366 }\r
4367 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4368 Value += (c - 'A' + 10);\r
4369 }\r
4370 if (c >= '0' && c <= '9') {\r
4371 Value += (c - '0');\r
4372 }\r
e4ac870f
LG
4373 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4374 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
4375 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4376 }\r
30fdf114
LG
4377 }\r
4378\r
4379 return Value;\r
4380}\r
4381\r
4382UINT16\r
4383EfiVfrParser::_STOU16 (\r
e4ac870f
LG
4384 IN CHAR8 *Str,\r
4385 IN UINT32 LineNum\r
30fdf114
LG
4386 )\r
4387{\r
4388 BOOLEAN IsHex;\r
4389 UINT16 Value;\r
4390 CHAR8 c;\r
4391\r
e4ac870f
LG
4392 UINT16 PreviousValue;\r
4393 CHAR8 *OrigString = Str;\r
4394 CHAR8 ErrorMsg[100];\r
4395\r
30fdf114
LG
4396 Str = TrimHex (Str, &IsHex);\r
4397 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4398 PreviousValue = Value;\r
30fdf114
LG
4399 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4400\r
4401 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4402 Value += (c - 'a' + 10);\r
4403 }\r
4404 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4405 Value += (c - 'A' + 10);\r
4406 }\r
4407 if (c >= '0' && c <= '9') {\r
4408 Value += (c - '0');\r
4409 }\r
e4ac870f
LG
4410 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4411 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
4412 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4413 }\r
30fdf114
LG
4414 }\r
4415\r
4416 return Value;\r
4417}\r
4418\r
4419UINT32\r
4420EfiVfrParser::_STOU32 (\r
e4ac870f
LG
4421 IN CHAR8 *Str,\r
4422 IN UINT32 LineNum\r
30fdf114
LG
4423 )\r
4424{\r
4425 BOOLEAN IsHex;\r
4426 UINT32 Value;\r
4427 CHAR8 c;\r
4428\r
e4ac870f
LG
4429 UINT32 PreviousValue;\r
4430 CHAR8 *OrigString = Str;\r
4431 CHAR8 ErrorMsg[100];\r
4432\r
30fdf114
LG
4433 Str = TrimHex (Str, &IsHex);\r
4434 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4435 PreviousValue = Value;\r
30fdf114
LG
4436 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4437\r
4438 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4439 Value += (c - 'a' + 10);\r
4440 }\r
4441 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4442 Value += (c - 'A' + 10);\r
4443 }\r
4444 if (c >= '0' && c <= '9') {\r
4445 Value += (c - '0');\r
4446 }\r
e4ac870f
LG
4447 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
4448 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
4449 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4450 }\r
30fdf114
LG
4451 }\r
4452\r
4453 return Value;\r
4454}\r
4455\r
4456UINT64\r
4457EfiVfrParser::_STOU64 (\r
e4ac870f
LG
4458 IN CHAR8 *Str,\r
4459 IN UINT32 LineNum\r
30fdf114
LG
4460 )\r
4461{\r
4462 BOOLEAN IsHex;\r
4463 UINT64 Value;\r
4464 CHAR8 c;\r
e4ac870f
LG
4465 UINT64 PreviousValue;\r
4466 CHAR8 *OrigString = Str;\r
4467 CHAR8 ErrorMsg[100];\r
30fdf114
LG
4468\r
4469 Str = TrimHex (Str, &IsHex);\r
4470 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4471 PreviousValue = Value;\r
30fdf114
LG
4472 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4473\r
4474 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4475 Value += (c - 'a' + 10);\r
4476 }\r
4477 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4478 Value += (c - 'A' + 10);\r
4479 }\r
4480 if (c >= '0' && c <= '9') {\r
4481 Value += (c - '0');\r
4482 }\r
e4ac870f
LG
4483 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
4484 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
4485 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4486 }\r
30fdf114
LG
4487 }\r
4488\r
4489 return Value;\r
4490}\r
4491\r
4492EFI_HII_DATE\r
4493EfiVfrParser::_STOD (\r
4494 IN CHAR8 *Year,\r
4495 IN CHAR8 *Month,\r
e4ac870f
LG
4496 IN CHAR8 *Day,\r
4497 IN UINT32 LineNum\r
30fdf114
LG
4498 )\r
4499{\r
4500 EFI_HII_DATE Date;\r
4501\r
e4ac870f
LG
4502 Date.Year = _STOU16 (Year, LineNum);\r
4503 Date.Month = _STOU8 (Month, LineNum);\r
4504 Date.Day = _STOU8 (Day, LineNum);\r
30fdf114
LG
4505\r
4506 return Date;\r
4507}\r
4508\r
4509EFI_HII_TIME\r
4510EfiVfrParser::_STOT (\r
4511 IN CHAR8 *Hour,\r
4512 IN CHAR8 *Minute,\r
e4ac870f
LG
4513 IN CHAR8 *Second,\r
4514 IN UINT32 LineNum\r
30fdf114
LG
4515 )\r
4516{\r
4517 EFI_HII_TIME Time;\r
4518\r
e4ac870f
LG
4519 Time.Hour = _STOU8 (Hour, LineNum);\r
4520 Time.Minute = _STOU8 (Minute, LineNum);\r
4521 Time.Second = _STOU8 (Second, LineNum);\r
30fdf114
LG
4522\r
4523 return Time;\r
4524}\r
4525\r
4526EFI_STRING_ID\r
4527EfiVfrParser::_STOSID (\r
e4ac870f
LG
4528 IN CHAR8 *Str,\r
4529 IN UINT32 LineNum\r
30fdf114
LG
4530 )\r
4531{\r
e4ac870f 4532 return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4533}\r
4534\r
4535EFI_FORM_ID\r
4536EfiVfrParser::_STOFID (\r
e4ac870f
LG
4537 IN CHAR8 *Str,\r
4538 IN UINT32 LineNum\r
30fdf114
LG
4539 )\r
4540{\r
e4ac870f 4541 return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4542}\r
4543\r
4544EFI_QUESTION_ID\r
4545EfiVfrParser::_STOQID (\r
e4ac870f
LG
4546 IN CHAR8 *Str,\r
4547 IN UINT32 LineNum\r
30fdf114
LG
4548 )\r
4549{\r
e4ac870f 4550 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
4551}\r
4552\r
4553VOID\r
4554EfiVfrParser::_STRCAT (\r
4555 IN OUT CHAR8 **Dest,\r
52302d4d 4556 IN CONST CHAR8 *Src\r
30fdf114
LG
4557 )\r
4558{\r
4559 CHAR8 *NewStr;\r
4560 UINT32 Len;\r
4561\r
4562 if ((Dest == NULL) || (Src == NULL)) {\r
4563 return;\r
4564 }\r
4565\r
4566 Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
4567 Len += strlen (Src);\r
4568 if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r
4569 return;\r
4570 }\r
4571 NewStr[0] = '\0';\r
4572 if (*Dest != NULL) {\r
4573 strcpy (NewStr, *Dest);\r
4574 delete *Dest;\r
4575 }\r
4576 strcat (NewStr, Src);\r
4577\r
4578 *Dest = NewStr;\r
4579}\r
4580\r
4234283c
LG
4581EFI_HII_REF\r
4582EfiVfrParser::_STOR (\r
4583 IN CHAR8 *QuestionId,\r
4584 IN CHAR8 *FormId,\r
4585 IN EFI_GUID *FormSetGuid,\r
e4ac870f
LG
4586 IN CHAR8 *DevicePath,\r
4587 IN UINT32 LineNum\r
4234283c
LG
4588 )\r
4589{\r
4590 EFI_HII_REF Ref;\r
4591 UINT32 Index;\r
4592\r
4593 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
e4ac870f
LG
4594 Ref.QuestionId = _STOQID (QuestionId, LineNum);\r
4595 Ref.FormId = _STOFID (FormId, LineNum);\r
4596 Ref.DevicePath = _STOSID (DevicePath, LineNum);\r
4234283c
LG
4597\r
4598 return Ref;\r
4599}\r
4600\r
30fdf114
LG
4601//\r
4602// framework vfr to default declare varstore for each structure\r
4603//\r
4604VOID\r
4605EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
4606 IN UINT32 LineNo\r
4607 )\r
4608{\r
4609 SVfrVarStorageNode *pNode;\r
4610 UINT32 TypeSize;\r
4611 BOOLEAN FirstNode;\r
52302d4d 4612 CONST CHAR8 VarName[] = "Setup";\r
30fdf114
LG
4613\r
4614 FirstNode = TRUE;\r
4615 pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
4616 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
4617 //\r
4618 // Create the default Buffer Var Store when no VarStore is defined.\r
4619 // its name should be "Setup"\r
4620 //\r
4621 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
4622 CIfrVarStore VSObj;\r
4623 VSObj.SetLineNo (LineNo);\r
4624 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
52302d4d 4625 VSObj.SetSize ((UINT16) TypeSize);\r
30fdf114 4626 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
52302d4d 4627 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4628 VSObj.SetGuid (&mFormsetGuid);\r
4629#ifdef VFREXP_DEBUG\r
4630 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
4631#endif\r
4632 } else {\r
4633 for (; pNode != NULL; pNode = pNode->mNext) {\r
4634 //\r
4635 // create the default varstore opcode for not declared varstore\r
4636 // the first varstore name should be "Setup"\r
4637 //\r
4638 if (!pNode->mAssignedFlag) {\r
4639 CIfrVarStore VSObj;\r
4640 VSObj.SetLineNo (LineNo);\r
4641 VSObj.SetVarStoreId (pNode->mVarStoreId);\r
52302d4d 4642 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
30fdf114 4643 if (FirstNode) {\r
52302d4d 4644 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
4645 FirstNode = FALSE;\r
4646 } else {\r
4647 VSObj.SetName (pNode->mVarStoreName);\r
4648 }\r
4649 VSObj.SetGuid (&pNode->mGuid);\r
4650#ifdef VFREXP_DEBUG\r
4651 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4652#endif\r
4653 }\r
4654 }\r
4655 }\r
4656\r
4657 pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
4658 for (; pNode != NULL; pNode = pNode->mNext) {\r
4659 //\r
4660 // create the default efi varstore opcode for not exist varstore\r
4661 //\r
4662 if (!pNode->mAssignedFlag) {\r
4663 CIfrVarStoreEfi VSEObj;\r
4664 VSEObj.SetLineNo (LineNo);\r
4665 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
4666 VSEObj.SetGuid (&pNode->mGuid);\r
4667 VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
4234283c
LG
4668 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
4669 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
4670 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
30fdf114
LG
4671#ifdef VFREXP_DEBUG\r
4672 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
4673#endif\r
4674 }\r
4675 }\r
4676\r
4677}\r
4678\r
4679VOID\r
4680EfiVfrParser::_DeclareDefaultLinearVarStore (\r
4681 IN UINT32 LineNo\r
4682 )\r
4683{\r
4684 UINT32 Index;\r
4685 CHAR8 **TypeNameList;\r
4686 UINT32 ListSize;\r
52302d4d
LG
4687 CONST CHAR8 DateName[] = "Date";\r
4688 CONST CHAR8 TimeName[] = "Time";\r
4689 CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
4690 CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
30fdf114
LG
4691\r
4692 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
4693\r
4694 for (Index = 0; Index < ListSize; Index++) {\r
4695 UINT32 Size;\r
4696 EFI_VARSTORE_ID VarStoreId;\r
4697 CIfrVarStore VSObj;\r
4698\r
4699 VSObj.SetLineNo (LineNo);\r
4700 mCVfrDataStorage.DeclareBufferVarStore (\r
4701 TypeNameList[Index],\r
4702 &mFormsetGuid,\r
4703 &gCVfrVarDataTypeDB,\r
4704 TypeNameList[Index],\r
4705 EFI_VARSTORE_ID_INVALID\r
4706 );\r
4afd3d04 4707 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
30fdf114
LG
4708 VSObj.SetVarStoreId (VarStoreId);\r
4709 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
52302d4d 4710 VSObj.SetSize ((UINT16) Size);\r
30fdf114
LG
4711 VSObj.SetName (TypeNameList[Index]);\r
4712 VSObj.SetGuid (&mFormsetGuid);\r
4713 }\r
4714\r
4715//\r
4716// not required to declare Date and Time VarStore,\r
4717// because code to support old format Data and Time\r
4718//\r
52302d4d 4719 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
30fdf114
LG
4720 UINT32 Size;\r
4721 EFI_VARSTORE_ID VarStoreId;\r
4722 CIfrVarStore VSObj;\r
4723\r
4724 VSObj.SetLineNo (LineNo);\r
4725 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4726 (CHAR8 *) DateName,\r
30fdf114
LG
4727 &mFormsetGuid,\r
4728 &gCVfrVarDataTypeDB,\r
52302d4d 4729 (CHAR8 *) DateType,\r
30fdf114
LG
4730 EFI_VARSTORE_ID_INVALID\r
4731 );\r
4afd3d04 4732 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4733 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4734 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
4735 VSObj.SetSize ((UINT16) Size);\r
4736 VSObj.SetName ((CHAR8 *) DateName);\r
30fdf114
LG
4737 VSObj.SetGuid (&mFormsetGuid);\r
4738 }\r
4739\r
52302d4d 4740 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
30fdf114
LG
4741 UINT32 Size;\r
4742 EFI_VARSTORE_ID VarStoreId;\r
4743 CIfrVarStore VSObj;\r
4744\r
4745 VSObj.SetLineNo (LineNo);\r
4746 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 4747 (CHAR8 *) TimeName,\r
30fdf114
LG
4748 &mFormsetGuid,\r
4749 &gCVfrVarDataTypeDB,\r
52302d4d 4750 (CHAR8 *) TimeType,\r
30fdf114
LG
4751 EFI_VARSTORE_ID_INVALID\r
4752 );\r
4afd3d04 4753 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
30fdf114 4754 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
4755 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
4756 VSObj.SetSize ((UINT16) Size);\r
4757 VSObj.SetName ((CHAR8 *) TimeName);\r
30fdf114
LG
4758 VSObj.SetGuid (&mFormsetGuid);\r
4759 }\r
4760}\r
4761\r
4762VOID\r
4763EfiVfrParser::_DeclareStandardDefaultStorage (\r
4764 IN UINT32 LineNo\r
4765 )\r
4766{\r
4767 //\r
4768 // Default Store is declared.\r
4769 //\r
4770 CIfrDefaultStore DSObj;\r
4771\r
52302d4d 4772 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
30fdf114
LG
4773 DSObj.SetLineNo (LineNo);\r
4774 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
4775 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
4776\r
4777 //\r
4778 // Default MANUFACTURING Store is declared.\r
4779 //\r
4780 CIfrDefaultStore DSObjMF;\r
4781\r
52302d4d 4782 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
30fdf114
LG
4783 DSObjMF.SetLineNo (LineNo);\r
4784 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
4785 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
4786}\r
4787\r
4788VOID\r
4789EfiVfrParser::AssignQuestionKey (\r
4790 IN CIfrQuestionHeader &QHObj,\r
4791 IN ANTLRTokenPtr KeyTok\r
4792 )\r
4793{\r
4794 UINT16 KeyValue;\r
4795\r
4796 if (KeyTok == NULL) {\r
4797 return;\r
4798 }\r
4799\r
e4ac870f 4800 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
30fdf114
LG
4801\r
4802 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
4803 /*\r
4804 * if the question is not CALLBACK ignore the key.\r
4805 */\r
4806 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
4807 QHObj.SetQuestionId (KeyValue);\r
4808 }\r
4809}\r
4810\r
4811VOID\r
4812EfiVfrParser::ConvertIdExpr (\r
4813 IN UINT32 &ExpOpCount,\r
4814 IN UINT32 LineNo,\r
4815 IN EFI_QUESTION_ID QId,\r
4816 IN CHAR8 *VarIdStr,\r
4817 IN UINT32 BitMask\r
4818 )\r
4819{\r
4820 CIfrQuestionRef1 QR1Obj(LineNo);\r
4821 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
4822 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
4823\r
4824 if (BitMask != 0) {\r
4825 CIfrUint32 U32Obj(LineNo);\r
4826 U32Obj.SetValue (BitMask);\r
4827\r
4828 CIfrBitWiseAnd BWAObj(LineNo);\r
4829\r
4830 CIfrUint8 U8Obj(LineNo);\r
4831 switch (BitMask) {\r
4832 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r
4833 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
4834 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r
4835 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r
4836 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
4837 }\r
4838\r
4839 CIfrShiftRight SRObj(LineNo);\r
4840 }\r
4841\r
4842 ExpOpCount += 4;\r
4843}\r
4844\r
4845VOID\r
4846EfiVfrParser::IdEqValDoSpecial (\r
4847 IN UINT32 &ExpOpCount,\r
4848 IN UINT32 LineNo,\r
4849 IN EFI_QUESTION_ID QId,\r
4850 IN CHAR8 *VarIdStr,\r
4851 IN UINT32 BitMask,\r
4852 IN UINT16 ConstVal,\r
4853 IN EFI_COMPARE_TYPE CompareType\r
4854 )\r
4855{\r
4856 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
4857\r
4858 if (ConstVal > 0xFF) {\r
4859 CIfrUint16 U16Obj(LineNo);\r
4860 U16Obj.SetValue (ConstVal);\r
4861 } else {\r
4862 CIfrUint8 U8Obj(LineNo);\r
4863 U8Obj.SetValue ((UINT8)ConstVal);\r
4864 }\r
4865\r
4866 switch (CompareType) {\r
4867 case EQUAL :\r
4868 {\r
4869 CIfrEqual EObj(LineNo);\r
4870 break;\r
4871 }\r
4872 case LESS_EQUAL :\r
4873 {\r
4874 CIfrLessEqual LEObj(LineNo);\r
4875 break;\r
4876 }\r
4877 case LESS_THAN :\r
4878 {\r
4879 CIfrLessThan LTObj(LineNo);\r
4880 break;\r
4881 }\r
4882 case GREATER_EQUAL :\r
4883 {\r
4884 CIfrGreaterEqual GEObj(LineNo);\r
4885 break;\r
4886 }\r
4887 case GREATER_THAN :\r
4888 {\r
4889 CIfrGreaterThan GTObj(LineNo);\r
4890 break;\r
4891 }\r
4892 }\r
4893\r
4894 ExpOpCount += 2;\r
4895}\r
4896\r
4897VOID\r
4898EfiVfrParser::IdEqIdDoSpecial (\r
4899 IN UINT32 &ExpOpCount,\r
4900 IN UINT32 LineNo,\r
4901 IN EFI_QUESTION_ID QId1,\r
4902 IN CHAR8 *VarId1Str,\r
4903 IN UINT32 BitMask1,\r
4904 IN EFI_QUESTION_ID QId2,\r
4905 IN CHAR8 *VarId2Str,\r
4906 IN UINT32 BitMask2,\r
4907 IN EFI_COMPARE_TYPE CompareType\r
4908 )\r
4909{\r
4910 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
4911 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
4912\r
4913 switch (CompareType) {\r
4914 case EQUAL :\r
4915 {\r
4916 CIfrEqual EObj(LineNo);\r
4917 break;\r
4918 }\r
4919 case LESS_EQUAL :\r
4920 {\r
4921 CIfrLessEqual LEObj(LineNo);\r
4922 break;\r
4923 }\r
4924 case LESS_THAN :\r
4925 {\r
4926 CIfrLessThan LTObj(LineNo);\r
4927 break;\r
4928 }\r
4929 case GREATER_EQUAL :\r
4930 {\r
4931 CIfrGreaterEqual GEObj(LineNo);\r
4932 break;\r
4933 }\r
4934 case GREATER_THAN :\r
4935 {\r
4936 CIfrGreaterThan GTObj(LineNo);\r
4937 break;\r
4938 }\r
4939 }\r
4940\r
4941 ExpOpCount++;\r
4942}\r
4943\r
4944VOID\r
4945EfiVfrParser::IdEqListDoSpecial (\r
4946 IN UINT32 &ExpOpCount,\r
4947 IN UINT32 LineNo,\r
4948 IN EFI_QUESTION_ID QId,\r
4949 IN CHAR8 *VarIdStr,\r
4950 IN UINT32 BitMask,\r
4951 IN UINT16 ListLen,\r
4952 IN UINT16 *ValueList\r
4953 )\r
4954{\r
4955 UINT16 Index;\r
4956\r
4957 if (ListLen == 0) {\r
4958 return;\r
4959 }\r
4960\r
4961 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
4962 for (Index = 1; Index < ListLen; Index++) {\r
4963 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
4964 CIfrOr OObj (LineNo);\r
4965 ExpOpCount++;\r
4966 }\r
4967}\r
4968\r
4234283c
LG
4969VOID \r
4970EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
4971{\r
4972 mOverrideClassGuid = OverrideClassGuid;\r
4973}\r
4974\r
30fdf114
LG
4975//\r
4976// For framework vfr compatibility\r
4977//\r
4978VOID\r
4979EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
4980{\r
4981 mCompatibleMode = Mode;\r
4982 mCVfrQuestionDB.SetCompatibleMode (Mode);\r
4983}\r
4afd3d04
LG
4984\r
4985VOID\r
4986EfiVfrParser::CheckDuplicateDefaultValue (\r
4987 IN EFI_DEFAULT_ID DefaultId,\r
4988 IN ANTLRTokenPtr Tok\r
4989 )\r
4990{\r
4991 UINT16 Index;\r
4992\r
4993 for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
4994 if (mUsedDefaultArray[Index] == DefaultId) {\r
4995 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
4996 }\r
4997 }\r
4998\r
4999 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
5000 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
5001 }\r
5002\r
5003 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
5004}\r
30fdf114 5005>>\r