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