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