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