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