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