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