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