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