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