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