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