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