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