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