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