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