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