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