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