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