]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools VfrCompiler: In order to keep consistent, add an optional ";" for condition...
[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
2bf63b20
DB
1749 } else if (gIsStringOp) {\r
1750 DObj->SetType (EFI_IFR_TYPE_STRING);\r
ddaf640f
ED
1751 } else {\r
1752 DObj->SetType (_GET_CURRQEST_DATATYPE());\r
1753 }\r
1754 DObj->SetValue(*Val);\r
fd171542 1755 >>\r
4afd3d04
LG
1756 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
1757 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
30fdf114
LG
1758 )\r
1759 {\r
4afd3d04
LG
1760 DefaultStore "=" SN:StringIdentifier "," << \r
1761 _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
1762 if (DObj != NULL) {\r
1763 DObj->SetDefaultId (DefaultId); \r
1764 } \r
1765\r
1766 if (DObj2 != NULL) {\r
1767 DObj2->SetDefaultId (DefaultId); \r
1768 }\r
1769 >>\r
30fdf114
LG
1770 }\r
1771 <<\r
4afd3d04
LG
1772 CheckDuplicateDefaultValue (DefaultId, D);\r
1773 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
30fdf114 1774 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
4afd3d04
LG
1775 VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
1776 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
30fdf114
LG
1777 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
1778 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
1779 DefaultId,\r
1780 _GET_CURRQEST_VARTINFO(),\r
1781 VarStoreName,\r
4afd3d04 1782 VarGuid,\r
30fdf114 1783 _GET_CURRQEST_DATATYPE (),\r
ddaf640f
ED
1784 *Val),\r
1785 D->getLine()\r
1786 );\r
4afd3d04 1787 }\r
30fdf114 1788 }\r
4afd3d04
LG
1789 if (DObj != NULL) {delete DObj;} \r
1790 if (DObj2 != NULL) {delete DObj2;} \r
30fdf114
LG
1791 >>\r
1792 )\r
1793 ;\r
1794\r
1795vfrStatementStat :\r
1796 vfrStatementSubTitle |\r
1797 vfrStatementStaticText |\r
1798 vfrStatementCrossReference\r
1799 ;\r
1800\r
1801vfrStatementQuestions :\r
1802 vfrStatementBooleanType |\r
1803 vfrStatementDate |\r
1804 vfrStatementNumericType |\r
1805 vfrStatementStringType |\r
1806 vfrStatementOrderedList |\r
1807 vfrStatementTime\r
1808 ;\r
1809\r
1810vfrStatementConditional :\r
1811 vfrStatementDisableIfStat |\r
1812 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif\r
1813 vfrStatementGrayOutIfStat |\r
1814 vfrStatementInconsistentIfStat //to be compatible for framework\r
1815 ;\r
1816\r
1817vfrStatementConditionalNew :\r
1818 vfrStatementDisableIfStat |\r
1819 vfrStatementSuppressIfStatNew |\r
1820 vfrStatementGrayOutIfStatNew |\r
1821 vfrStatementInconsistentIfStat //to be compatible for framework\r
1822 ;\r
1823\r
1824vfrStatementSuppressIfStat :\r
1825 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld\r
1826 | vfrStatementSuppressIfStatNew\r
1827 ;\r
1828\r
1829vfrStatementGrayOutIfStat :\r
1830 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld\r
1831 | vfrStatementGrayOutIfStatNew\r
1832 ;\r
1833\r
1834vfrStatementInvalid :\r
1835 (\r
1836 vfrStatementInvalidHidden |\r
1837 vfrStatementInvalidInventory |\r
1838 vfrStatementInvalidSaveRestoreDefaults\r
1839 )\r
1840 << _CRT_OP (TRUE); >>\r
1841 ;\r
1842\r
1843flagsField :\r
05154781
ED
1844 Number \r
1845 | InteractiveFlag \r
1846 | ManufacturingFlag \r
1847 | DefaultFlag \r
1848 | ResetRequiredFlag \r
366430c7 1849 | ReconnectRequiredFlag\r
05154781
ED
1850 | N:NVAccessFlag << \r
1851 if (!mCompatibleMode) {\r
1852 gCVfrErrorHandle.HandleWarning (\r
1853 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1854 N->getLine(),\r
1855 N->getText()\r
1856 );\r
1857 }\r
1858 >>\r
1859 | L:LateCheckFlag << \r
1860 if (!mCompatibleMode) {\r
1861 gCVfrErrorHandle.HandleWarning (\r
1862 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
1863 L->getLine(),\r
1864 L->getText()\r
1865 );\r
1866 }\r
1867 >> \r
30fdf114
LG
1868 ;\r
1869\r
1870vfrStatementValue :\r
1871 << CIfrValue VObj; >>\r
1872 V:Value << VObj.SetLineNo(V->getLine()); >>\r
fd171542 1873 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>\r
30fdf114
LG
1874 ;\r
1875\r
52302d4d
LG
1876vfrStatementRead :\r
1877 << CIfrRead RObj; >>\r
1878 R:Read << RObj.SetLineNo(R->getLine()); >>\r
1879 vfrStatementExpression[0] ";" \r
1880 ;\r
1881\r
1882vfrStatementWrite :\r
1883 << CIfrWrite WObj; >>\r
1884 W:Write << WObj.SetLineNo(W->getLine()); >>\r
1885 vfrStatementExpression[0] ";" \r
1886 ;\r
1887\r
30fdf114
LG
1888vfrStatementSubTitle :\r
1889 << CIfrSubtitle SObj; >>\r
1890 L:Subtitle << SObj.SetLineNo(L->getLine()); >>\r
e4ac870f 1891 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
1892 {\r
1893 "," FLAGS "=" vfrSubtitleFlags[SObj]\r
1894 }\r
e8a47801
LG
1895 (\r
1896 {vfrStatementStatTagList "," }\r
1897 E:";" << CRT_END_OP (E); >>\r
1898 |\r
1899 { "," vfrStatementStatTagList}\r
1900 { "," (vfrStatementStat | vfrStatementQuestions)*}\r
15be099a 1901 D: EndSubtitle ";" << CRT_END_OP (D); >>\r
e8a47801 1902 )\r
30fdf114
LG
1903 ;\r
1904\r
1905vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
1906 << UINT8 LFlags = 0; >>\r
1907 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r
1908 << _PCATCH(SObj.SetFlags (LFlags)); >>\r
1909 ;\r
1910\r
1911subtitleFlagsField [UINT8 & Flags] :\r
e4ac870f 1912 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
1913 | "HORIZONTAL" << $Flags |= 0x01; >>\r
1914 ;\r
1915\r
1916vfrStatementStaticText :\r
1917 <<\r
1918 UINT8 Flags = 0;\r
1919 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1920 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;\r
1921 >>\r
1922 T:Text\r
1923 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
1924 Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
1925 {\r
e4ac870f 1926 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>\r
30fdf114
LG
1927 }\r
1928 {\r
1929 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
1930 "," Key "=" KN:Number\r
1931 }\r
1932 <<\r
1933 if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
1d218f83
ED
1934 if (TxtTwo != EFI_STRING_ID_INVALID) {\r
1935 gCVfrErrorHandle.HandleWarning (\r
1936 VFR_WARNING_ACTION_WITH_TEXT_TWO,\r
1937 S3->getLine(),\r
1938 S3->getText()\r
1939 );\r
1940 }\r
30fdf114
LG
1941 CIfrAction AObj;\r
1942 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
1943 AObj.SetLineNo (F->getLine());\r
1944 AObj.SetQuestionId (QId);\r
e4ac870f
LG
1945 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
1946 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
30fdf114
LG
1947 _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
1948 AssignQuestionKey (AObj, KN);\r
1949 CRT_END_OP (KN);\r
1950 } else {\r
1951 CIfrText TObj;\r
1952 TObj.SetLineNo (T->getLine());\r
e4ac870f
LG
1953 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));\r
1954 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));\r
30fdf114
LG
1955 TObj.SetTextTwo (TxtTwo);\r
1956 }\r
1957 >>\r
1958 { "," vfrStatementStatTagList }\r
1959 ";"\r
1960 ;\r
1961\r
1962staticTextFlagsField[UINT8 & HFlags] :\r
e4ac870f 1963 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
1964 | questionheaderFlagsField[HFlags]\r
1965 ;\r
1966\r
1967vfrStatementCrossReference :\r
1968 vfrStatementGoto |\r
1969 vfrStatementResetButton\r
1970 ;\r
1971\r
1972vfrStatementGoto :\r
1973 <<\r
4234283c 1974 UINT8 RefType = 5;\r
52302d4d
LG
1975 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
1976 EFI_GUID FSId = {0,};\r
30fdf114
LG
1977 EFI_FORM_ID FId;\r
1978 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
1979 UINT32 BitMask;\r
1980 CIfrQuestionHeader *QHObj = NULL;\r
0d2711a6 1981 CIfrOpHeader *OHObj = NULL;\r
30fdf114
LG
1982 CIfrRef *R1Obj = NULL;\r
1983 CIfrRef2 *R2Obj = NULL;\r
1984 CIfrRef3 *R3Obj = NULL;\r
1985 CIfrRef4 *R4Obj = NULL;\r
4234283c 1986 CIfrRef5 *R5Obj = NULL;\r
30fdf114
LG
1987 >>\r
1988 G:Goto\r
4234283c 1989 {\r
30fdf114
LG
1990 (\r
1991 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
1992 FormSetGuid "=" guidDefinition[FSId] ","\r
1993 FormId "=" F1:Number ","\r
1994 Question "=" QN1:Number ","\r
1995 <<\r
1996 RefType = 4;\r
e4ac870f
LG
1997 DevPath = _STOSID(P->getText(), P->getLine());\r
1998 FId = _STOFID(F1->getText(), F1->getLine());\r
1999 QId = _STOQID(QN1->getText(), QN1->getLine());\r
30fdf114
LG
2000 >>\r
2001 )\r
2002 |\r
2003 (\r
2004 FormSetGuid "=" guidDefinition[FSId] ","\r
2005 FormId "=" F2:Number ","\r
2006 Question "=" QN2:Number ","\r
2007 <<\r
2008 RefType = 3;\r
e4ac870f
LG
2009 FId = _STOFID(F2->getText(), F2->getLine());\r
2010 QId = _STOQID(QN2->getText(), QN2->getLine());\r
30fdf114
LG
2011 >>\r
2012 )\r
2013 |\r
2014 (\r
e4ac870f 2015 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>\r
30fdf114
LG
2016 Question "="\r
2017 (\r
0d2711a6
LG
2018 QN3:StringIdentifier "," << \r
2019 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);\r
2020 if (QId == EFI_QUESTION_ID_INVALID) {\r
2021 _PCATCH(VFR_RETURN_UNDEFINED, QN3);\r
2022 }\r
2023 >>\r
e4ac870f 2024 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>\r
30fdf114
LG
2025 )\r
2026 )\r
2027 |\r
2028 (\r
2029 F4:Number "," <<\r
2030 RefType = 1;\r
e4ac870f 2031 FId = _STOFID(F4->getText(), F4->getLine());\r
30fdf114
LG
2032 >>\r
2033 )\r
4234283c 2034 }\r
30fdf114
LG
2035 <<\r
2036 switch (RefType) {\r
4234283c
LG
2037 case 5:\r
2038 {\r
2039 R5Obj = new CIfrRef5;\r
2040 QHObj = R5Obj;\r
0d2711a6 2041 OHObj = R5Obj;\r
4234283c
LG
2042 R5Obj->SetLineNo(G->getLine());\r
2043 break;\r
2044 }\r
30fdf114
LG
2045 case 4:\r
2046 {\r
2047 R4Obj = new CIfrRef4;\r
2048 QHObj = R4Obj;\r
0d2711a6 2049 OHObj = R4Obj;\r
30fdf114
LG
2050 R4Obj->SetLineNo(G->getLine());\r
2051 R4Obj->SetDevicePath (DevPath);\r
2052 R4Obj->SetFormSetId (FSId);\r
2053 R4Obj->SetFormId (FId);\r
2054 R4Obj->SetQuestionId (QId);\r
2055 break;\r
2056 }\r
2057 case 3:\r
2058 {\r
2059 R3Obj = new CIfrRef3;\r
2060 QHObj = R3Obj;\r
0d2711a6 2061 OHObj = R3Obj;\r
30fdf114
LG
2062 R3Obj->SetLineNo(G->getLine());\r
2063 R3Obj->SetFormSetId (FSId);\r
2064 R3Obj->SetFormId (FId);\r
2065 R3Obj->SetQuestionId (QId);\r
2066 break;\r
2067 }\r
2068 case 2:\r
2069 {\r
2070 R2Obj = new CIfrRef2;\r
2071 QHObj = R2Obj;\r
0d2711a6 2072 OHObj = R2Obj;\r
30fdf114
LG
2073 R2Obj->SetLineNo(G->getLine());\r
2074 R2Obj->SetFormId (FId);\r
0d2711a6 2075 R2Obj->SetQuestionId (QId);\r
30fdf114
LG
2076 break;\r
2077 }\r
2078 case 1:\r
2079 {\r
2080 R1Obj = new CIfrRef;\r
2081 QHObj = R1Obj;\r
0d2711a6 2082 OHObj = R1Obj;\r
30fdf114
LG
2083 R1Obj->SetLineNo(G->getLine());\r
2084 R1Obj->SetFormId (FId);\r
2085 break;\r
2086 }\r
2087 default: break;\r
2088 }\r
2089 >>\r
4afd3d04
LG
2090 vfrQuestionHeader[*QHObj, QUESTION_REF] <<\r
2091 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2092 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;\r
2093 }\r
2094 >>\r
30fdf114
LG
2095 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }\r
2096 {\r
2097 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>\r
2098 }\r
0d2711a6
LG
2099 {\r
2100 E:"," \r
2101 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>\r
2102 }\r
4234283c 2103 ";" << 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
2104 ;\r
2105\r
2106vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
2107 << UINT8 HFlags = 0; >>\r
2108 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
2109 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
2110 ;\r
2111\r
2112gotoFlagsField[UINT8 & HFlags] :\r
e4ac870f 2113 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2114 | questionheaderFlagsField[HFlags]\r
2115 ;\r
2116\r
2117getStringId :\r
2118 "STRING_TOKEN" "\("\r
2119 IdVal:Number\r
2120 "\)"\r
2121 ;\r
2122\r
2123vfrStatementResetButton :\r
2124 <<\r
2125 CIfrResetButton RBObj;\r
2126 UINT16 DefaultId;\r
2127 >>\r
2128 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>\r
2129 DefaultStore\r
2130 "=" N:StringIdentifier "," <<\r
2131 _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
2132 RBObj.SetDefaultId (DefaultId);\r
2133 >>\r
2134 vfrStatementHeader[&RBObj] ","\r
2135 { vfrStatementStatTagList "," }\r
2136 E:EndResetButton << CRT_END_OP (E); >>\r
2137 ";"\r
2138 ;\r
2139\r
2140vfrStatementBooleanType :\r
2141 vfrStatementCheckBox |\r
2142 vfrStatementAction\r
2143 ;\r
2144\r
2145//*****************************************************\r
2146// Syntax of checkbox\r
2147//\r
2148// Example:\r
2149// checkbox\r
2150// varid = MySTestData.mField1,\r
2151// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
2152// help = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
2153// flags = CHECKBOX_DEFAULT | CALLBACK,\r
2154// default value = TRUE, defaultstore = MyDefaultStore,\r
2155// endcheckbox;\r
2156//\r
2157vfrStatementCheckBox :\r
2158 <<\r
2159 CIfrCheckBox CBObj;\r
2160 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
2161 CHAR8 *VarStoreName = NULL;\r
2162 UINT32 DataTypeSize;\r
4afd3d04 2163 EFI_GUID *VarStoreGuid = NULL;\r
30fdf114
LG
2164 >>\r
2165 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>\r
2166 vfrQuestionHeader[CBObj] "," << //check data type\r
4afd3d04
LG
2167 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2168 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;\r
2169 }\r
2170 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2171 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
2172 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2173 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
2174 } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
2175 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
2176 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
2177 }\r
30fdf114
LG
2178 }\r
2179 >>\r
2180 {\r
2181 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
2182 <<\r
4afd3d04
LG
2183 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2184 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
2185 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2186 Val.b = TRUE;\r
2187 if (CBObj.GetFlags () & 0x01) {\r
2188 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
2189 _PCATCH(\r
2190 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2191 EFI_HII_DEFAULT_CLASS_STANDARD,\r
2192 _GET_CURRQEST_VARTINFO(),\r
2193 VarStoreName,\r
2194 VarStoreGuid,\r
2195 _GET_CURRQEST_DATATYPE (),\r
2196 Val\r
2197 ),\r
2198 VFR_RETURN_SUCCESS,\r
2199 L,\r
2200 "No standard default storage found"\r
2201 );\r
2202 }\r
2203 if (CBObj.GetFlags () & 0x02) {\r
2204 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
2205 _PCATCH(\r
2206 mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
2207 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
2208 _GET_CURRQEST_VARTINFO(),\r
2209 VarStoreName,\r
2210 VarStoreGuid,\r
2211 _GET_CURRQEST_DATATYPE (),\r
2212 Val\r
2213 ),\r
2214 VFR_RETURN_SUCCESS,\r
2215 L,\r
2216 "No manufacturing default storage found"\r
2217 );\r
2218 }\r
30fdf114
LG
2219 }\r
2220 >>\r
2221 }\r
2222 {\r
2223 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>\r
2224 }\r
2225 vfrStatementQuestionOptionList\r
2226 E:EndCheckBox << CRT_END_OP (E); >>\r
2227 ";"\r
2228 ;\r
2229\r
2230vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
2231 <<\r
2232 UINT8 LFlags = 0;\r
2233 UINT8 HFlags = 0;\r
2234 >>\r
2235 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
2236 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2237 ;\r
2238\r
2239checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
2240 N:Number <<\r
2241 if (mCompatibleMode) {\r
2242 //\r
2243 // set question flag\r
2244 //\r
e4ac870f 2245 $LFlags |= _STOU8(N->getText(), N->getLine());\r
30fdf114 2246 } else {\r
e4ac870f 2247 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());\r
30fdf114
LG
2248 }\r
2249 >>\r
2250 | D:"DEFAULT" <<\r
2251 if (mCompatibleMode) {\r
2252 //\r
2253 // set question Default flag\r
2254 //\r
2255 $LFlags |= 0x01;\r
2256 } else {\r
2257 _PCATCH (VFR_RETURN_UNSUPPORTED, D);\r
2258 }\r
2259 >>\r
2260 | M:"MANUFACTURING" <<\r
2261 if (mCompatibleMode) {\r
2262 //\r
2263 // set question MFG flag\r
2264 //\r
2265 $LFlags |= 0x02;\r
2266 } else {\r
2267 _PCATCH (VFR_RETURN_UNSUPPORTED, M);\r
2268 }\r
2269 >>\r
2270 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>\r
2271 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>\r
2272 | questionheaderFlagsField[HFlags]\r
2273 ;\r
2274\r
2275//*****************************************************\r
2276// Syntax of action\r
2277//\r
2278// Example:\r
2279// action\r
2280// prompt = STRING_TOKEN(STR_ACTION_PROMPT),\r
2281// help = STRING_TOKEN(STR_ACTION_HELP),\r
2282// flags = CALLBACK,\r
2283// config = STRING_TOKEN(STR_ACTION_CONFIG),\r
2284// endaction;\r
2285//\r
2286vfrStatementAction :\r
2287 << CIfrAction AObj; >>\r
2288 L:Action << AObj.SetLineNo(L->getLine()); >>\r
4234283c 2289 vfrQuestionHeader[AObj] ","\r
30fdf114 2290 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
e4ac870f 2291 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
2292 vfrStatementQuestionTagList\r
2293 E:EndAction << CRT_END_OP (E); >>\r
2294 ";"\r
2295 ;\r
2296\r
2297vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
2298 << UINT8 HFlags = 0; >>\r
2299 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
2300 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
2301 ;\r
2302\r
2303actionFlagsField[UINT8 & HFlags] :\r
e4ac870f 2304 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2305 | questionheaderFlagsField[HFlags]\r
2306 ;\r
2307\r
2308vfrStatementDate :\r
2309 <<\r
2310 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2311 CHAR8 *VarIdStr[3] = {NULL, };\r
2312 CIfrDate DObj;\r
2313 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2314 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);\r
30fdf114
LG
2315 >>\r
2316 L:Date << DObj.SetLineNo(L->getLine()); >>\r
2317 (\r
2318 (\r
4afd3d04
LG
2319 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<\r
2320 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2321 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;\r
2322 }\r
2323 >>\r
30fdf114
LG
2324 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
2325 vfrStatementQuestionOptionList\r
2326 )\r
2327 |\r
2328 (\r
2329 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
2330 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
2331 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
2332 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
2333 minMaxDateStepDefault[Val.date, 0]\r
2334\r
2335 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
2336 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
2337 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2338 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2339 minMaxDateStepDefault[Val.date, 1]\r
2340\r
2341 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
2342 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
2343 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
2344 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
2345 minMaxDateStepDefault[Val.date, 2]\r
2bcc713e 2346 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }\r
30fdf114
LG
2347 <<\r
2348 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
2349 DObj.SetQuestionId (QId);\r
2350 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
e4ac870f
LG
2351 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));\r
2352 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));\r
30fdf114
LG
2353 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
2354 >>\r
4afd3d04 2355 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
2356 )\r
2357 ( vfrStatementInconsistentIf )*\r
2358 )\r
2359 E:EndDate << CRT_END_OP (E); >>\r
2360 ";"\r
2361 ;\r
2362\r
2363minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
fd171542 2364 Minimum "=" MinN:Number ","\r
2365 Maximum "=" MaxN:Number ","\r
30fdf114
LG
2366 { "step" "=" Number "," }\r
2367 {\r
2368 "default" "=" N:Number "," <<\r
2369 switch (KeyValue) {\r
fd171542 2370 case 0: \r
e4ac870f
LG
2371 D.Year = _STOU16(N->getText(), N->getLine());\r
2372 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {\r
fd171542 2373 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");\r
2374 }\r
2375 break;\r
2376 case 1: \r
e4ac870f 2377 D.Month = _STOU8(N->getText(), N->getLine()); \r
fd171542 2378 if (D.Month < 1 || D.Month > 12) {\r
2379 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");\r
2380 }\r
2381 break;\r
2382 case 2: \r
e4ac870f 2383 D.Day = _STOU8(N->getText(), N->getLine()); \r
fd171542 2384 if (D.Day < 1 || D.Day > 31) {\r
2385 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");\r
2386 }\r
2387 break;\r
30fdf114
LG
2388 }\r
2389 >>\r
2390 }\r
2391 ;\r
2392\r
2393vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
2394 << UINT8 LFlags = 0; >>\r
2395 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
2396 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
2397 ;\r
2398\r
2399dateFlagsField [UINT8 & Flags] :\r
e4ac870f 2400 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
2401 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>\r
2402 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>\r
2403 | "DAY_SUPPRESS" << $Flags |= 0x04; >>\r
2404 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
2405 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
2406 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
2407 ;\r
2408\r
2409vfrStatementNumericType :\r
2410 vfrStatementNumeric |\r
2411 vfrStatementOneOf\r
2412 ;\r
2413\r
2414vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
2415 <<\r
2416 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
2417 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
2418 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
2419 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
1afac950
ED
2420 BOOLEAN IntDecStyle = FALSE;\r
2421 CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
2422 if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {\r
2423 IntDecStyle = TRUE;\r
2424 }\r
2425 BOOLEAN MinNegative = FALSE;\r
2426 BOOLEAN MaxNegative = FALSE;\r
30fdf114 2427 >>\r
1afac950
ED
2428 Minimum "=" \r
2429 {\r
2430 "\-" << MinNegative = TRUE; >>\r
2431 }\r
2432 I:Number "," <<\r
2433 if (!IntDecStyle && MinNegative) {\r
2434 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
2435 }\r
a709adfa 2436 switch (_GET_CURRQEST_DATATYPE()) {\r
1afac950
ED
2437 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
2438 MinU8 = _STOU64(I->getText(), I->getLine());\r
2439 if (IntDecStyle) {\r
2440 if (MinNegative) { \r
2441 if (MinU8 > 0x8000000000000000) {\r
2442 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2443 }\r
2444 } else {\r
2445 if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
2446 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2447 }\r
2448 }\r
2449 }\r
2450 if (MinNegative) {\r
2451 MinU8 = ~MinU8 + 1;\r
2452 }\r
2453 break;\r
2454 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
2455 MinU4 = _STOU32(I->getText(), I->getLine());\r
2456 if (IntDecStyle) {\r
2457 if (MinNegative) { \r
2458 if (MinU4 > 0x80000000) {\r
2459 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2460 }\r
2461 } else {\r
2462 if (MinU4 > 0x7FFFFFFF) {\r
2463 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2464 }\r
2465 }\r
2466 }\r
2467 if (MinNegative) {\r
2468 MinU4 = ~MinU4 + 1;\r
2469 }\r
2470 break;\r
2471 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
2472 MinU2 = _STOU16(I->getText(), I->getLine());\r
2473 if (IntDecStyle) {\r
2474 if (MinNegative) { \r
2475 if (MinU2 > 0x8000) {\r
2476 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
2477 }\r
2478 } else {\r
2479 if (MinU2 > 0x7FFF) {\r
2480 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
2481 }\r
2482 }\r
2483 }\r
2484 if (MinNegative) {\r
2485 MinU2 = ~MinU2 + 1;\r
2486 }\r
2487 break;\r
2488 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
2489 MinU1 = _STOU8(I->getText(), I->getLine());\r
2490 if (IntDecStyle) {\r
2491 if (MinNegative) { \r
2492 if (MinU1 > 0x80) {\r
2493 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
2494 }\r
2495 } else {\r
2496 if (MinU1 > 0x7F) {\r
2497 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
2498 }\r
2499 }\r
2500 }\r
2501 if (MinNegative) {\r
2502 MinU1 = ~MinU1 + 1;\r
2503 }\r
2504 break;\r
30fdf114
LG
2505 }\r
2506 >>\r
1afac950
ED
2507 Maximum "=" \r
2508 { \r
2509 "\-" << MaxNegative = TRUE; >>\r
2510 }\r
2511 A:Number "," <<\r
2512 if (!IntDecStyle && MaxNegative) {\r
2513 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
2514 }\r
2515\r
a709adfa 2516 switch (_GET_CURRQEST_DATATYPE()) {\r
fd171542 2517 case EFI_IFR_TYPE_NUM_SIZE_64 : \r
e4ac870f 2518 MaxU8 = _STOU64(A->getText(), A->getLine()); \r
1afac950
ED
2519 if (IntDecStyle) {\r
2520 if (MaxNegative) {\r
2521 if (MaxU8 > 0x8000000000000000) {\r
2522 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2523 }\r
2524 } else {\r
2525 if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
2526 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
2527 }\r
2528 }\r
2529 }\r
2530 if (MaxNegative) {\r
2531 MaxU8 = ~MaxU8 + 1;\r
2532 }\r
2533 if (IntDecStyle) {\r
2534 if ((INT64) MaxU8 < (INT64) MinU8) {\r
2535 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2536 }\r
2537 } else {\r
2538 if (MaxU8 < MinU8) {\r
2539 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2540 }\r
fd171542 2541 }\r
2542 break;\r
2543 case EFI_IFR_TYPE_NUM_SIZE_32 : \r
1afac950
ED
2544 MaxU4 = _STOU32(A->getText(), A->getLine());\r
2545 if (IntDecStyle) {\r
2546 if (MaxNegative) {\r
2547 if (MaxU4 > 0x80000000) {\r
2548 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2549 }\r
2550 } else {\r
2551 if (MaxU4 > 0x7FFFFFFF) {\r
2552 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
2553 }\r
2554 }\r
2555 }\r
2556 if (MaxNegative) {\r
2557 MaxU4 = ~MaxU4 + 1;\r
2558 }\r
2559 if (IntDecStyle) {\r
2560 if ((INT32) MaxU4 < (INT32) MinU4) {\r
2561 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2562 }\r
2563 } else {\r
2564 if (MaxU4 < MinU4) {\r
2565 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2566 }\r
fd171542 2567 }\r
2568 break;\r
2569 case EFI_IFR_TYPE_NUM_SIZE_16 : \r
e4ac870f 2570 MaxU2 = _STOU16(A->getText(), A->getLine()); \r
1afac950
ED
2571 if (IntDecStyle) {\r
2572 if (MaxNegative) {\r
2573 if (MaxU2 > 0x8000) {\r
2574 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
2575 }\r
2576 } else {\r
2577 if (MaxU2 > 0x7FFF) {\r
2578 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
2579 }\r
2580 }\r
2581 }\r
2582 if (MaxNegative) {\r
2583 MaxU2 = ~MaxU2 + 1;\r
2584 }\r
2585 if (IntDecStyle) {\r
2586 if ((INT16) MaxU2 < (INT16) MinU2) {\r
2587 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2588 }\r
2589 } else {\r
2590 if (MaxU2 < MinU2) {\r
2591 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2592 }\r
fd171542 2593 }\r
2594 break;\r
2595 case EFI_IFR_TYPE_NUM_SIZE_8 : \r
1afac950
ED
2596 MaxU1 = _STOU8(A->getText(), A->getLine());\r
2597 if (IntDecStyle) {\r
2598 if (MaxNegative) {\r
2599 if (MaxU1 > 0x80) {\r
2600 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
2601 }\r
2602 } else {\r
2603 if (MaxU1 > 0x7F) {\r
2604 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
2605 }\r
2606 }\r
2607 }\r
2608 if (MaxNegative) {\r
2609 MaxU1 = ~MaxU1 + 1;\r
2610 }\r
2611 if (IntDecStyle) {\r
2612 if ((INT8) MaxU1 < (INT8) MinU1) {\r
2613 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2614 }\r
2615 } else {\r
2616 if (MaxU1 < MinU1) {\r
2617 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
2618 }\r
fd171542 2619 }\r
2620 break;\r
30fdf114
LG
2621 }\r
2622 >>\r
2623 {\r
2624 STEP "=" S:Number ","\r
2625 <<\r
a709adfa 2626 switch (_GET_CURRQEST_DATATYPE()) {\r
e4ac870f
LG
2627 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;\r
2628 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;\r
2629 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;\r
2630 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;\r
30fdf114
LG
2631 }\r
2632 >>\r
2633 }\r
2634 <<\r
a709adfa 2635 switch (_GET_CURRQEST_DATATYPE()) {\r
30fdf114
LG
2636 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
2637 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
2638 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
2639 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;\r
2640 }\r
2641 >>\r
2642 ;\r
2643\r
2644vfrStatementNumeric :\r
2645 <<\r
2646 CIfrNumeric NObj;\r
4afd3d04
LG
2647 UINT32 DataTypeSize;\r
2648 BOOLEAN IsSupported = TRUE;\r
2649 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2650 >>\r
2651 L:Numeric << NObj.SetLineNo(L->getLine()); >>\r
2652 vfrQuestionHeader[NObj] "," << // check data type\r
4afd3d04
LG
2653 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2654 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
2655 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2656 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
2657 }\r
2658 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2659 }\r
30fdf114
LG
2660 >>\r
2661 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
2662 {\r
2663 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>\r
2664 }\r
4afd3d04 2665 vfrSetMinMaxStep[NObj] <<\r
b36d134f 2666 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2667 //\r
2668 // Base on the type to know the actual used size,shrink the buffer \r
2669 // size allocate before.\r
2670 //\r
2671 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2672 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2673 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2674 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
2675 default: \r
2676 IsSupported = FALSE;\r
b36d134f
LG
2677 break;\r
2678 }\r
4afd3d04 2679 NObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2680 if (!IsSupported) {\r
2681 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2682 }\r
4afd3d04
LG
2683 >>\r
2684 vfrStatementQuestionOptionList\r
2685 E:EndNumeric << \r
b36d134f
LG
2686 CRT_END_OP (E); \r
2687 >>\r
30fdf114
LG
2688 ";"\r
2689 ;\r
2690\r
2691vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
2692 <<\r
a709adfa 2693 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2694 UINT8 HFlags = 0;\r
a709adfa 2695 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2696 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2697 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2698 >>\r
e4ac870f 2699 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*\r
a709adfa
LG
2700 <<\r
2701 //check data type flag\r
4afd3d04
LG
2702 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2703 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2704 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2705 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2706 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2707 }\r
2708 } else {\r
2709 // update data type for name/value store\r
2710 UINT32 DataTypeSize;\r
2711 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2712 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2713 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2714 }\r
4afd3d04 2715 } else if (IsSetType){\r
a709adfa 2716 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa 2717 }\r
e4ac870f 2718 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);\r
a709adfa 2719 >>\r
30fdf114
LG
2720 ;\r
2721\r
e4ac870f
LG
2722numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :\r
2723 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
4afd3d04
LG
2724 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>\r
2725 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>\r
2726 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>\r
2727 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>\r
e4ac870f
LG
2728 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>\r
2729 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>\r
2730 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>\r
30fdf114
LG
2731 | questionheaderFlagsField[HFlags]\r
2732 ;\r
2733\r
2734vfrStatementOneOf :\r
2735 <<\r
2736 CIfrOneOf OObj;\r
2737 UINT32 DataTypeSize;\r
4afd3d04
LG
2738 BOOLEAN IsSupported = TRUE;\r
2739 UINT8 ShrinkSize = 0;\r
30fdf114
LG
2740 >>\r
2741 L:OneOf << OObj.SetLineNo(L->getLine()); >>\r
2742 vfrQuestionHeader[OObj] "," << //check data type\r
4afd3d04
LG
2743 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2744 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
2745 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
2746 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
2747 }\r
2748 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
30fdf114 2749 }\r
30fdf114
LG
2750 >>\r
2751 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
2752 {\r
2753 vfrSetMinMaxStep[OObj]\r
2754 }\r
4afd3d04 2755 <<\r
b36d134f 2756 switch (_GET_CURRQEST_DATATYPE()) {\r
4afd3d04
LG
2757 //\r
2758 // Base on the type to know the actual used size,shrink the buffer \r
2759 // size allocate before.\r
2760 //\r
2761 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;\r
2762 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;\r
2763 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;\r
2764 case EFI_IFR_TYPE_NUM_SIZE_64:break;\r
b36d134f 2765 default:\r
4afd3d04 2766 IsSupported = FALSE;\r
b36d134f
LG
2767 break;\r
2768 }\r
4afd3d04 2769 OObj.ShrinkBinSize (ShrinkSize);\r
b36d134f
LG
2770 if (!IsSupported) {\r
2771 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");\r
2772 }\r
4afd3d04
LG
2773 >>\r
2774 vfrStatementQuestionOptionList\r
2775 E:EndOneOf <<\r
b36d134f
LG
2776 CRT_END_OP (E); \r
2777 >>\r
30fdf114
LG
2778 ";"\r
2779 ;\r
2780\r
2781vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
2782 <<\r
a709adfa 2783 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;\r
30fdf114 2784 UINT8 HFlags = 0;\r
a709adfa 2785 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
4afd3d04 2786 BOOLEAN IsSetType = FALSE;\r
e4ac870f 2787 BOOLEAN IsDisplaySpecified = FALSE;\r
30fdf114 2788 >>\r
e4ac870f 2789 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*\r
a709adfa
LG
2790 <<\r
2791 //check data type flag\r
4afd3d04
LG
2792 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
2793 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
2794 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
2795 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
2796 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
2797 }\r
2798 } else {\r
2799 // update data type for Name/Value store\r
2800 UINT32 DataTypeSize;\r
2801 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
2802 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);\r
2803 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;\r
a709adfa 2804 }\r
4afd3d04 2805 } else if (IsSetType){\r
a709adfa 2806 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;\r
a709adfa
LG
2807 }\r
2808 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);\r
2809 >>\r
30fdf114
LG
2810 ;\r
2811\r
2812vfrStatementStringType :\r
2813 vfrStatementString |\r
2814 vfrStatementPassword\r
2815 ;\r
2816\r
2817vfrStatementString :\r
2818 <<\r
2819 CIfrString SObj;\r
40d841f6
LG
2820 UINT32 VarArraySize;\r
2821 UINT8 StringMinSize;\r
2822 UINT8 StringMaxSize;\r
30fdf114 2823 >>\r
2bf63b20 2824 L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>>\r
30fdf114
LG
2825 vfrQuestionHeader[SObj] ","\r
2826 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
2827 {\r
2828 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>\r
2829 }\r
40d841f6
LG
2830 MinSize "=" MIN:Number "," << \r
2831 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2832 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());\r
2833 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {\r
40d841f6
LG
2834 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");\r
2835 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {\r
2836 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");\r
2837 }\r
2838 SObj.SetMinSize (StringMinSize);\r
2839 >>\r
2840 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2841 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());\r
2842 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {\r
40d841f6
LG
2843 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");\r
2844 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {\r
2845 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");\r
2846 } else if (StringMaxSize < StringMinSize) {\r
2847 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");\r
2848 }\r
2849 SObj.SetMaxSize (StringMaxSize);\r
2850 >>\r
30fdf114 2851 vfrStatementQuestionOptionList\r
2bf63b20 2852 E:EndString << CRT_END_OP (E); gIsStringOp = FALSE;>>\r
30fdf114
LG
2853 ";"\r
2854 ;\r
2855\r
2856vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
2857 <<\r
2858 UINT8 LFlags = 0;\r
2859 UINT8 HFlags = 0;\r
2860 >>\r
2861 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
2862 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2863 ;\r
2864\r
2865stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2866 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2867 | "MULTI_LINE" << $LFlags = 0x01; >>\r
2868 | questionheaderFlagsField[HFlags]\r
2869 ;\r
2870\r
2871vfrStatementPassword :\r
2872 <<\r
2873 CIfrPassword PObj;\r
40d841f6
LG
2874 UINT32 VarArraySize;\r
2875 UINT16 PasswordMinSize;\r
2876 UINT16 PasswordMaxSize;\r
30fdf114
LG
2877 >>\r
2878 L:Password << PObj.SetLineNo(L->getLine()); >>\r
2879 vfrQuestionHeader[PObj] ","\r
2880 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
2881 {\r
2882 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>\r
2883 }\r
40d841f6
LG
2884 MinSize "=" MIN:Number "," << \r
2885 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
e4ac870f
LG
2886 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());\r
2887 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {\r
40d841f6
LG
2888 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");\r
2889 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {\r
2890 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");\r
2891 }\r
2892 PObj.SetMinSize (PasswordMinSize);\r
2893 >>\r
2894 MaxSize "=" MAX:Number "," << \r
e4ac870f
LG
2895 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());\r
2896 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {\r
40d841f6
LG
2897 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");\r
2898 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {\r
2899 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");\r
2900 } else if (PasswordMaxSize < PasswordMinSize) {\r
2901 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");\r
2902 }\r
2903 PObj.SetMaxSize (PasswordMaxSize);\r
2904 >>\r
30fdf114
LG
2905 { Encoding "=" Number "," }\r
2906 vfrStatementQuestionOptionList\r
2907 E:EndPassword << CRT_END_OP (E); >>\r
2908 ";"\r
2909 ;\r
2910\r
2911vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
2912 << UINT8 HFlags = 0; >>\r
2913 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
2914 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
2915 ;\r
2916\r
2917passwordFlagsField [UINT8 & HFlags] :\r
e4ac870f 2918 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2919 | questionheaderFlagsField[HFlags]\r
2920 ;\r
2921\r
2922vfrStatementOrderedList :\r
2923 <<\r
2924 CIfrOrderedList OLObj;\r
40d841f6 2925 UINT32 VarArraySize;\r
30fdf114 2926 >>\r
ddaf640f 2927 L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
30fdf114 2928 vfrQuestionHeader[OLObj] ","\r
40d841f6
LG
2929 << \r
2930 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
2931 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));\r
2932 >>\r
30fdf114 2933 {\r
40d841f6 2934 MaxContainers "=" M:Number "," << \r
e4ac870f 2935 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {\r
40d841f6 2936 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");\r
e4ac870f 2937 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {\r
40d841f6
LG
2938 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");\r
2939 }\r
e4ac870f 2940 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));\r
40d841f6 2941 >>\r
30fdf114 2942 }\r
3a8e175b 2943 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
30fdf114 2944 vfrStatementQuestionOptionList\r
ddaf640f 2945 E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
30fdf114
LG
2946 ";"\r
2947 ;\r
2948\r
2949vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
2950 <<\r
2951 UINT8 HFlags = 0;\r
2952 UINT8 LFlags = 0;\r
2953 >>\r
2954 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
2955 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
2956 ;\r
2957\r
2958orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 2959 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
30fdf114
LG
2960 | "UNIQUE" << $LFlags |= 0x01; >>\r
2961 | "NOEMPTY" << $LFlags |= 0x02; >>\r
2962 | questionheaderFlagsField[HFlags]\r
2963 ;\r
2964\r
2965vfrStatementTime :\r
2966 <<\r
2967 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
2968 CHAR8 *VarIdStr[3] = {NULL, };\r
2969 CIfrTime TObj;\r
2970 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;\r
4afd3d04 2971 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);\r
30fdf114
LG
2972 >>\r
2973 L:Time << TObj.SetLineNo(L->getLine()); >>\r
2974 (\r
2975 (\r
4afd3d04
LG
2976 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<\r
2977 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
2978 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;\r
2979 }\r
2980 >>\r
30fdf114 2981 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
40d841f6 2982 vfrStatementQuestionOptionList\r
30fdf114
LG
2983 )\r
2984 |\r
2985 (\r
2986 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
2987 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
2988 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
2989 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
2990 minMaxTimeStepDefault[Val.time, 0]\r
2991\r
2992 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
2993 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
2994 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
2995 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
2996 minMaxTimeStepDefault[Val.time, 1]\r
2997\r
2998 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
2999 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
3000 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
3001 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
3002 minMaxTimeStepDefault[Val.time, 2]\r
2bcc713e 3003 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }\r
30fdf114
LG
3004 <<\r
3005 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);\r
3006 TObj.SetQuestionId (QId);\r
3007 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
e4ac870f
LG
3008 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));\r
3009 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));\r
30fdf114
LG
3010 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
3011 >>\r
4afd3d04 3012 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>\r
30fdf114
LG
3013 )\r
3014 ( vfrStatementInconsistentIf )*\r
3015 )\r
3016 E:EndTime << CRT_END_OP (E); >>\r
3017 ";"\r
3018 ;\r
3019\r
3020minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
3021 Minimum "=" Number ","\r
3022 Maximum "=" Number ","\r
3023 { "step" "=" Number "," }\r
3024 {\r
3025 "default" "=" N:Number "," <<\r
3026 switch (KeyValue) {\r
fd171542 3027 case 0: \r
e4ac870f 3028 T.Hour = _STOU8(N->getText(), N->getLine()); \r
fd171542 3029 if (T.Hour > 23) {\r
3030 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");\r
3031 }\r
3032 break;\r
3033 case 1: \r
e4ac870f 3034 T.Minute = _STOU8(N->getText(), N->getLine()); \r
fd171542 3035 if (T.Minute > 59) {\r
3036 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");\r
3037 }\r
3038 break;\r
3039 case 2: \r
e4ac870f 3040 T.Second = _STOU8(N->getText(), N->getLine());\r
fd171542 3041 if (T.Second > 59) {\r
3042 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");\r
3043 }\r
3044 break;\r
30fdf114
LG
3045 }\r
3046 >>\r
3047 }\r
3048 ;\r
3049\r
3050vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
3051 << UINT8 LFlags = 0; >>\r
3052 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
3053 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
3054 ;\r
3055\r
3056timeFlagsField [UINT8 & Flags] :\r
e4ac870f 3057 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3058 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>\r
3059 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>\r
3060 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>\r
3061 | "STORAGE_NORMAL" << $Flags |= 0x00; >>\r
3062 | "STORAGE_TIME" << $Flags |= 0x10; >>\r
3063 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>\r
3064 ;\r
3065\r
3066vfrStatementQuestionTag :\r
3067 vfrStatementStatTag "," |\r
3068 vfrStatementInconsistentIf |\r
3069 vfrStatementNoSubmitIf |\r
3070 vfrStatementDisableIfQuest |\r
3071 vfrStatementRefresh |\r
da92f276 3072 vfrStatementVarstoreDevice |\r
4234283c 3073 vfrStatementExtension |\r
e2a5feb9 3074 vfrStatementRefreshEvent "," |\r
ea0f6464 3075 vfrStatementWarningIf\r
30fdf114
LG
3076 ;\r
3077\r
3078vfrStatementQuestionTagList :\r
3079 ( vfrStatementQuestionTag )*\r
3080 ;\r
3081\r
3082vfrStatementQuestionOptionTag :\r
3083 vfrStatementSuppressIfQuest |\r
3084 vfrStatementGrayOutIfQuest |\r
3085 vfrStatementValue |\r
3086 vfrStatementDefault |\r
52302d4d
LG
3087 vfrStatementRead |\r
3088 vfrStatementWrite |\r
30fdf114
LG
3089 vfrStatementOptions\r
3090 ;\r
3091\r
3092vfrStatementQuestionOptionList :\r
3093 (\r
3094 vfrStatementQuestionTag |\r
3095 vfrStatementQuestionOptionTag\r
3096 )*\r
3097 ;\r
3098\r
3099vfrStatementStatList :\r
3100 vfrStatementStat |\r
3101 vfrStatementQuestions |\r
3102 vfrStatementConditionalNew |\r
3103 vfrStatementLabel |\r
da92f276 3104 vfrStatementExtension |\r
30fdf114
LG
3105 // Just for framework vfr compatibility\r
3106 vfrStatementInvalid\r
3107 ;\r
3108\r
3109vfrStatementStatListOld :\r
3110 vfrStatementStat |\r
3111 vfrStatementQuestions |\r
3112 vfrStatementLabel |\r
3113 // Just for framework vfr compatibility\r
3114 vfrStatementInvalid\r
3115 ;\r
3116\r
3117vfrStatementDisableIfStat :\r
3118 << \r
3119 CIfrDisableIf DIObj; \r
30fdf114
LG
3120 >>\r
3121 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 3122 vfrStatementExpression[0] ";" \r
30fdf114
LG
3123 ( vfrStatementStatList )*\r
3124 E:EndIf << CRT_END_OP (E); >>\r
3125 ";"\r
3126 ;\r
3127\r
3128vfrStatementInconsistentIfStat :\r
3129 << CIfrInconsistentIf IIObj; >>\r
3130 L:InconsistentIf <<\r
3131 if (!mCompatibleMode) {\r
3132 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3133 }\r
3134 IIObj.SetLineNo(L->getLine());\r
3135 >>\r
e4ac870f 3136 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3137 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3138 vfrStatementExpression[0]\r
3139 E:EndIf << CRT_END_OP (E); >>\r
3140 ";"\r
3141 ;\r
3142\r
3143//\r
3144// Compatible for framework vfr file\r
3145//\r
3146vfrStatementgrayoutIfSuppressIf:\r
3147 << CIfrSuppressIf SIObj; >>\r
3148 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3149 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3150 vfrStatementExpression[0]\r
3151 ";"\r
3152 ;\r
3153\r
3154vfrStatementsuppressIfGrayOutIf:\r
3155 << CIfrGrayOutIf GOIObj; >>\r
3156 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3157 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3158 vfrStatementExpression[0]\r
3159 ";"\r
3160 ;\r
3161\r
3162vfrStatementSuppressIfStatNew :\r
3163 << CIfrSuppressIf SIObj;>>\r
3164 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3165 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3166 vfrStatementExpression[0]\r
3167 ";"\r
3168 ( vfrStatementStatList )*\r
3169 E: EndIf ";" << CRT_END_OP (E); >>\r
3170 ;\r
3171\r
3172vfrStatementGrayOutIfStatNew :\r
3173 << CIfrGrayOutIf GOIObj;>>\r
3174 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3175 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3176 vfrStatementExpression[0]\r
3177 ";"\r
3178 ( vfrStatementStatList )*\r
3179 E: EndIf ";" << CRT_END_OP (E); >>\r
3180 ;\r
3181\r
3182vfrStatementSuppressIfStatOld :\r
3183 <<\r
3184 CIfrSuppressIf SIObj;\r
3185 BOOLEAN GrayOutExist = FALSE;\r
3186 >>\r
3187 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3188 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3189 vfrStatementExpression[0]\r
3190 ";"\r
3191 {\r
3192 vfrStatementsuppressIfGrayOutIf\r
3193 << GrayOutExist = TRUE; >>\r
3194 }\r
3195 ( vfrStatementStatListOld )*\r
3196 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>\r
3197 ;\r
3198\r
3199vfrStatementGrayOutIfStatOld :\r
3200 <<\r
3201 CIfrGrayOutIf GOIObj;\r
3202 BOOLEAN SuppressExist = FALSE;\r
3203 >>\r
3204 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3205 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3206 vfrStatementExpression[0]\r
3207 ";"\r
3208 {\r
3209 vfrStatementgrayoutIfSuppressIf\r
3210 << SuppressExist = TRUE; >>\r
3211 }\r
3212 ( vfrStatementStatListOld )*\r
3213 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>\r
3214 ;\r
3215\r
3216vfrImageTag :\r
3217 << CIfrImage IObj; >>\r
e4ac870f 3218 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>\r
30fdf114
LG
3219 ;\r
3220\r
3221vfrLockedTag :\r
3222 << CIfrLocked LObj; >>\r
3223 L:Locked << LObj.SetLineNo(L->getLine()); >>\r
3224 ;\r
3225\r
4234283c
LG
3226vfrModalTag :\r
3227 << CIfrModal MObj; >>\r
3228 L:Modal << MObj.SetLineNo(L->getLine()); >>\r
3229 ;\r
3230\r
30fdf114
LG
3231vfrStatementStatTag :\r
3232 vfrImageTag |\r
3233 vfrLockedTag\r
3234 ;\r
3235\r
3236vfrStatementStatTagList :\r
3237 vfrStatementStatTag ( "," vfrStatementStatTag )*\r
3238 ;\r
3239\r
3240vfrStatementImage :\r
3241 vfrImageTag\r
3242 ";"\r
3243 ;\r
3244\r
4234283c
LG
3245vfrStatementModal :\r
3246 vfrModalTag\r
3247 ";"\r
3248 ;\r
3249\r
30fdf114
LG
3250vfrStatementLocked :\r
3251 vfrLockedTag\r
3252 ";"\r
3253 ;\r
3254\r
3255vfrStatementInconsistentIf :\r
3256 << CIfrInconsistentIf IIObj; >>\r
3257 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3258 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3259 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3260 vfrStatementExpression[0]\r
c0c300a1 3261 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3262 ;\r
3263\r
3264vfrStatementNoSubmitIf :\r
3265 << CIfrNoSubmitIf NSIObj; >>\r
3266 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3267 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3268 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3269 vfrStatementExpression[0]\r
c0c300a1 3270 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3271 ;\r
3272\r
ea0f6464
LG
3273vfrStatementWarningIf :\r
3274 << CIfrWarningIf WIObj; >>\r
3275 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>\r
e4ac870f
LG
3276 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>\r
3277 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}\r
ea0f6464 3278 vfrStatementExpression[0]\r
c0c300a1 3279 E:EndIf {";"} << CRT_END_OP (E); >>\r
ea0f6464
LG
3280 ;\r
3281\r
30fdf114
LG
3282vfrStatementDisableIfQuest :\r
3283 << \r
3284 CIfrDisableIf DIObj; \r
30fdf114
LG
3285 >>\r
3286 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>\r
a709adfa 3287 vfrStatementExpression[0] ";"\r
30fdf114 3288 vfrStatementQuestionOptionList\r
c0c300a1 3289 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3290 ;\r
3291\r
3292vfrStatementRefresh :\r
3293 << CIfrRefresh RObj; >>\r
3294 L:Refresh << RObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3295 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>\r
30fdf114
LG
3296 ;\r
3297\r
4234283c
LG
3298vfrStatementRefreshEvent :\r
3299 <<\r
3300 CIfrRefreshId RiObj;\r
3301 EFI_GUID Guid;\r
3302 >>\r
3303 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>\r
e2a5feb9 3304 "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >>\r
4234283c
LG
3305 ;\r
3306\r
30fdf114
LG
3307vfrStatementVarstoreDevice :\r
3308 << CIfrVarStoreDevice VDObj; >>\r
3309 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>\r
e4ac870f 3310 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3311 ;\r
3312\r
3313vfrStatementSuppressIfQuest :\r
3314 << CIfrSuppressIf SIObj; >>\r
3315 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>\r
3316 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3317 vfrStatementExpression[0] ";"\r
3318 vfrStatementQuestionOptionList\r
c0c300a1 3319 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3320 ;\r
3321\r
3322vfrStatementGrayOutIfQuest :\r
3323 << CIfrGrayOutIf GOIObj; >>\r
3324 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>\r
3325 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3326 vfrStatementExpression[0] ";"\r
3327 vfrStatementQuestionOptionList\r
c0c300a1 3328 E:EndIf {";"} << CRT_END_OP (E); >>\r
30fdf114
LG
3329 ;\r
3330\r
3331vfrStatementOptions :\r
3332 vfrStatementOneOfOption\r
3333 ;\r
3334\r
3335vfrStatementOneOfOption :\r
3336 <<\r
ddaf640f
ED
3337 UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
3338 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;\r
30fdf114 3339 CHAR8 *VarStoreName = NULL;\r
4afd3d04
LG
3340 UINT32 Size = 0;\r
3341 BOOLEAN TypeError = FALSE;\r
3342 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;\r
3343 EFI_GUID *VarStoreGuid = NULL;\r
ddaf640f
ED
3344 BOOLEAN ArrayType = FALSE;\r
3345 CIfrOneOfOption *OOOObj;\r
3346 UINT8 *Type8 = (UINT8 *) ValueList;\r
3347 UINT16 *Type16 = (UINT16 *) ValueList;\r
3348 UINT32 *Type32 = (UINT32 *) ValueList;\r
3349 UINT64 *Type64 = (UINT64 *) ValueList;\r
30fdf114 3350 >>\r
4afd3d04 3351 L:Option << \r
ddaf640f 3352 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
4afd3d04
LG
3353 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
3354 }\r
ddaf640f 3355\r
4afd3d04 3356 >>\r
ddaf640f
ED
3357 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," \r
3358 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
a709adfa
LG
3359 << \r
3360 if (gCurrentMinMaxData != NULL) {\r
3361 //set min/max value for oneof opcode\r
3362 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
3363 switch (_GET_CURRQEST_DATATYPE()) {\r
3364 case EFI_IFR_TYPE_NUM_SIZE_64:\r
ddaf640f 3365 gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
a709adfa
LG
3366 break;\r
3367 case EFI_IFR_TYPE_NUM_SIZE_32:\r
ddaf640f 3368 gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
a709adfa
LG
3369 break;\r
3370 case EFI_IFR_TYPE_NUM_SIZE_16:\r
ddaf640f 3371 gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
a709adfa
LG
3372 break;\r
3373 case EFI_IFR_TYPE_NUM_SIZE_8:\r
ddaf640f 3374 gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
a709adfa
LG
3375 break;\r
3376 default:\r
3377 break;\r
3378 }\r
3379 }\r
ddaf640f
ED
3380 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
3381 Size = sizeof (EFI_IFR_TYPE_VALUE);\r
3382 } else if (ArrayType) {\r
3383 switch (_GET_CURRQEST_DATATYPE()) {\r
3384 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
3385 while (Type8[Size] != 0) {\r
3386 Size++;\r
3387 }\r
3388 break;\r
3389 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
3390 while (Type16[Size] != 0) {\r
3391 Size++;\r
3392 }\r
3393 Size *= sizeof (UINT16);\r
3394 break;\r
3395 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
3396 while (Type32[Size] != 0) {\r
3397 Size++;\r
3398 }\r
3399 Size *= sizeof (UINT32);\r
3400 break;\r
3401 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
3402 while (Type64[Size] != 0) {\r
3403 Size++;\r
3404 }\r
3405 Size *= sizeof (UINT64);\r
3406 break;\r
3407 default:\r
3408 break;\r
3409 }\r
3410 } else {\r
3411 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
3412 }\r
3413 if (ReturnCode != VFR_RETURN_SUCCESS) {\r
3414 _PCATCH (ReturnCode, L->getLine());\r
3415 }\r
3416\r
3417 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
3418 OOOObj = new CIfrOneOfOption((UINT8)Size);\r
3419 OOOObj->SetLineNo(L->getLine());\r
3420 OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
3421 if (ArrayType) {\r
3422 OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
3423 } else {\r
3424 OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
3425 }\r
3426 OOOObj->SetValue (*Val); \r
a709adfa 3427 >>\r
ddaf640f 3428 F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
30fdf114 3429 <<\r
ddaf640f
ED
3430 //\r
3431 // Array type only for default type OneOfOption.\r
3432 //\r
3433 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
3434 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
3435 }\r
3436\r
3437 //\r
3438 // Clear the default flag if the option not use array value but has default flag.\r
3439 //\r
3440 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
3441 OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
3442 }\r
3443\r
4afd3d04
LG
3444 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
3445 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
3446 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
ddaf640f 3447 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
4afd3d04
LG
3448 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
3449 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3450 EFI_HII_DEFAULT_CLASS_STANDARD,\r
3451 _GET_CURRQEST_VARTINFO(),\r
3452 VarStoreName,\r
3453 VarStoreGuid,\r
3454 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3455 *Val\r
4afd3d04
LG
3456 ), L->getLine());\r
3457 }\r
ddaf640f 3458 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
4afd3d04
LG
3459 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
3460 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
3461 EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
3462 _GET_CURRQEST_VARTINFO(),\r
3463 VarStoreName,\r
3464 VarStoreGuid,\r
3465 _GET_CURRQEST_DATATYPE (),\r
ddaf640f 3466 *Val\r
4afd3d04
LG
3467 ), L->getLine());\r
3468 }\r
30fdf114
LG
3469 }\r
3470 >>\r
3471 {\r
3472 "," Key "=" KN:Number <<\r
3473 if (!mCompatibleMode) {\r
3474 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);\r
3475 }\r
3476 //\r
3477 // Guid Option Key\r
3478 //\r
3479 CIfrOptionKey IfrOptionKey (\r
3480 gCurrentQuestion->QUESTION_ID(),\r
ddaf640f 3481 *Val,\r
e4ac870f 3482 _STOQID(KN->getText(), KN->getLine())\r
30fdf114
LG
3483 );\r
3484 SET_LINE_INFO (IfrOptionKey, KN);\r
3485 >>\r
3486 }\r
3487 (\r
ddaf640f 3488 T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
30fdf114 3489 )*\r
ddaf640f 3490 ";" << if (OOOObj != NULL) {delete OOOObj;} >>\r
30fdf114
LG
3491 ;\r
3492\r
3493vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
3494 <<\r
3495 UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
3496 UINT8 HFlags = 0;\r
3497 >>\r
3498 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
3499 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
3500 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
3501 ;\r
3502\r
3503oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
e4ac870f 3504 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
3505 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>\r
3506 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>\r
3507 | InteractiveFlag << $HFlags |= 0x04; >>\r
30fdf114 3508 | ResetRequiredFlag << $HFlags |= 0x10; >>\r
366430c7 3509 | ReconnectRequiredFlag << $HFlags |= 0x40; >>\r
30fdf114
LG
3510 | ManufacturingFlag << $LFlags |= 0x20; >>\r
3511 | DefaultFlag << $LFlags |= 0x10; >>\r
05154781
ED
3512 | A:NVAccessFlag << \r
3513 if (mCompatibleMode) {\r
3514 $HFlags |= 0x08;\r
3515 } else {\r
3516 gCVfrErrorHandle.HandleWarning (\r
3517 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3518 A->getLine(),\r
3519 A->getText()\r
3520 );\r
3521 }\r
3522 >>\r
3523 | L:LateCheckFlag << \r
3524 if (mCompatibleMode) {\r
3525 $HFlags |= 0x20;\r
3526 } else {\r
3527 gCVfrErrorHandle.HandleWarning (\r
3528 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,\r
3529 L->getLine(),\r
3530 L->getText()\r
3531 );\r
3532 }\r
3533 >>\r
30fdf114
LG
3534 ;\r
3535\r
3536vfrStatementLabel :\r
3537 L:Label\r
3538 N:Number <<\r
3539 if (mCompatibleMode) {\r
3540 //\r
3541 // Add end Label for Framework Vfr\r
3542 //\r
3543 CIfrLabel LObj1;\r
3544 LObj1.SetLineNo(L->getLine());\r
3545 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff\r
3546 }\r
3547\r
3548 {\r
3549 CIfrLabel LObj2;\r
3550 LObj2.SetLineNo(L->getLine());\r
e4ac870f 3551 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));\r
30fdf114
LG
3552 }\r
3553 >>\r
3554 ";"\r
3555 ;\r
3556\r
3557vfrStatementBanner :\r
3558 << CIfrBanner BObj; >>\r
3559 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>\r
e4ac870f 3560 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>\r
30fdf114
LG
3561 (\r
3562 (\r
e4ac870f 3563 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>\r
30fdf114
LG
3564 Align\r
3565 (\r
3566 Left << BObj.SetAlign (0); >>\r
3567 | Center << BObj.SetAlign (1); >>\r
3568 | Right << BObj.SetAlign (2); >>\r
3569 ) ";"\r
3570 )\r
3571 |\r
3572 (\r
e4ac870f 3573 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>\r
30fdf114
LG
3574 )\r
3575 )\r
3576 ;\r
3577\r
3578//******************************************************************************\r
3579//\r
3580// keep some syntax for compatibility but not generate any IFR object\r
3581//\r
3582vfrStatementInvalidHidden :\r
3583 L:Hidden <<\r
3584 if (!mCompatibleMode) {\r
3585 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3586 }\r
3587 >>\r
3588 Value "=" Number ","\r
3589 Key "=" Number ";"\r
3590 ;\r
3591\r
3592vfrStatementInvalidInconsistentIf :\r
3593 InconsistentIf\r
3594 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
3595 { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
3596 vfrStatementExpression[0]\r
3597 EndIf\r
3598 ";"\r
3599 ;\r
3600\r
3601vfrStatementInvalidInventory :\r
3602 L:Inventory <<\r
3603 if (!mCompatibleMode) {\r
3604 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3605 }\r
3606 >>\r
3607 Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3608 Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3609 {\r
3610 Text "=" "STRING_TOKEN" "\(" Number "\)"\r
3611 }\r
3612 ";"\r
3613 ;\r
3614\r
3615vfrStatementInvalidSaveRestoreDefaults :\r
3616 (\r
3617 L:Save <<\r
3618 if (!mCompatibleMode) {\r
3619 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3620 }\r
3621 >>\r
3622 |\r
3623 K:Restore <<\r
3624 if (!mCompatibleMode) {\r
3625 _PCATCH (VFR_RETURN_UNSUPPORTED, K);\r
3626 }\r
3627 >>\r
3628 )\r
3629 Defaults ","\r
3630 FormId "=" Number ","\r
3631 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
3632 Help "=" "STRING_TOKEN" "\(" Number "\)"\r
3633 { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
3634 { "," Key "=" Number }\r
3635 ";"\r
3636 ;\r
3637\r
3638//******************************************************************************\r
3639//\r
3640// The syntax of expression\r
3641//\r
3642#token Dup("dup") "dup"\r
3643#token VarEqVal("vareqval") "vareqval"\r
3644#token Var("var") "var"\r
3645#token IdEqVal("ideqval") "ideqval"\r
3646#token IdEqId("ideqid") "ideqid"\r
3647#token IdEqValList("ideqvallist") "ideqvallist"\r
3648#token QuestionRef("questionref") "questionref"\r
3649#token RuleRef("ruleref") "ruleref"\r
3650#token StringRef("stringref") "stringref"\r
3651#token PushThis("pushthis") "pushthis"\r
a709adfa 3652#token Security("security") "security"\r
52302d4d 3653#token Get("get") "get"\r
30fdf114
LG
3654#token True("TRUE") "TRUE"\r
3655#token False("FALSE") "FALSE"\r
3656#token One("ONE") "ONE"\r
3657#token Ones("ONES") "ONES"\r
3658#token Zero("ZERO") "ZERO"\r
3659#token Undefined("UNDEFINED") "UNDEFINED"\r
3660#token Version("VERSION") "VERSION"\r
3661#token Length("length") "length"\r
3662#token AND("AND") "AND"\r
3663#token OR("OR") "OR"\r
3664#token NOT("NOT") "NOT"\r
52302d4d 3665#token Set("set") "set"\r
30fdf114
LG
3666#token BitWiseNot("~") "\~"\r
3667#token BoolVal("boolval") "boolval"\r
3668#token StringVal("stringval") "stringval"\r
3669#token UnIntVal("unintval") "unintval"\r
3670#token ToUpper("toupper") "toupper"\r
3671#token ToLower("tolower") "tolower"\r
3672#token Match("match") "match"\r
5d377616 3673#token Match2("match2") "match2"\r
30fdf114
LG
3674#token Catenate("catenate") "catenate"\r
3675#token QuestionRefVal("questionrefval") "questionrefval"\r
3676#token StringRefVal("stringrefval") "stringrefval"\r
52302d4d 3677#token Map("map") "map"\r
4234283c 3678#token RefreshGuid("refreshguid") "refreshguid"\r
30fdf114
LG
3679\r
3680//\r
3681// Root expression extension function called by other function.\r
3682//\r
3683vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
52302d4d 3684 << 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
3685 andTerm[$RootLevel, $ExpOpCount]\r
3686 (\r
3687 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3688 )*\r
3689 <<\r
3690 //\r
3691 // Extend OpCode Scope only for the root expression.\r
3692 //\r
3693 if ($ExpOpCount > 1 && $RootLevel == 0) {\r
3694 if (_SET_SAVED_OPHDR_SCOPE()) {\r
3695 CIfrEnd EObj;\r
52302d4d
LG
3696 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {\r
3697 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);\r
30fdf114
LG
3698 }\r
3699 }\r
3700 }\r
52302d4d
LG
3701 \r
3702 if ($RootLevel == 0) {\r
3703 mCIfrOpHdrIndex --;\r
3704 }\r
30fdf114
LG
3705 >>\r
3706 ;\r
3707\r
3708//\r
3709// Add new sub function for the sub expression extension to remember the ExpOpCount\r
3710// This funciton is only called by sub expression.\r
3711//\r
3712vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :\r
3713 andTerm[$RootLevel, $ExpOpCount]\r
3714 (\r
3715 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
3716 )*\r
3717 ;\r
3718\r
3719andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3720 bitwiseorTerm[$RootLevel, $ExpOpCount]\r
3721 (\r
3722 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
3723 )*\r
3724 ;\r
3725\r
3726bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3727 bitwiseandTerm[$RootLevel, $ExpOpCount]\r
3728 (\r
3729 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
3730 )*\r
3731 ;\r
3732\r
3733bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3734 equalTerm[$RootLevel, $ExpOpCount]\r
3735 (\r
3736 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
3737 )*\r
3738 ;\r
3739\r
3740equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3741 compareTerm[$RootLevel, $ExpOpCount]\r
3742 (\r
3743 (\r
3744 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
3745 )\r
3746 |\r
3747 (\r
3748 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
3749 )\r
3750 )*\r
3751 ;\r
3752\r
3753compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3754 shiftTerm[$RootLevel, $ExpOpCount]\r
3755 (\r
3756 (\r
3757 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
3758 )\r
3759 |\r
3760 (\r
3761 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
3762 )\r
3763 |\r
3764 (\r
3765 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
3766 )\r
3767 |\r
3768 (\r
3769 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
3770 )\r
3771 )*\r
3772 ;\r
3773\r
3774shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3775 addMinusTerm[$RootLevel, $ExpOpCount]\r
3776 (\r
3777 (\r
3778 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
3779 )\r
3780 |\r
3781 (\r
3782 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
3783 )\r
3784 )*\r
3785 ;\r
3786\r
3787addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3788 multdivmodTerm[$RootLevel, $ExpOpCount]\r
3789 (\r
3790 (\r
3791 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
3792 )\r
3793 |\r
3794 (\r
3795 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
3796 )\r
3797 )*\r
3798 ;\r
3799\r
3800multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3801 castTerm[$RootLevel, $ExpOpCount]\r
3802 (\r
3803 (\r
3804 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
3805 )\r
3806 |\r
3807 (\r
3808 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
3809 )\r
3810 |\r
3811 (\r
3812 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
3813 )\r
3814 )*\r
3815 ;\r
3816\r
3817castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3818 << UINT8 CastType = 0xFF; >>\r
3819 (\r
3820 L:"\("\r
3821 (\r
3822 Boolean << CastType = 0; >>\r
3823 | Uint64 << CastType = 1; >>\r
3824 | Uint32 << CastType = 1; >>\r
3825 | Uint16 << CastType = 1; >>\r
3826 | Uint8 << CastType = 1; >>\r
3827 )\r
3828 "\)"\r
3829 )*\r
3830 atomTerm[$RootLevel, $ExpOpCount]\r
3831 <<\r
3832 switch (CastType) {\r
3833 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;\r
3834 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;\r
3835 }\r
3836 >>\r
3837 ;\r
3838\r
3839atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3840 vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
3841 | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
5d377616 3842 | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3843 | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
3844 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
3845 | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
3846 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
3847 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
52302d4d 3848 | vfrExpressionMap[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3849 | (\r
3850 L:NOT\r
3851 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
3852 )\r
3853 ;\r
3854\r
3855vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3856 L:Catenate\r
3857 "\("\r
3858 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3859 ","\r
3860 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3861 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
3862 ;\r
3863\r
3864vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3865 L:Match\r
3866 "\("\r
3867 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3868 ","\r
3869 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3870 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
3871 ;\r
3872\r
5d377616
ED
3873vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3874 <<\r
3875 EFI_GUID Guid;\r
3876 >>\r
3877 L:Match2\r
3878 "\("\r
3879 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3880 ","\r
3881 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3882 ","\r
3883 guidDefinition[Guid]\r
3884 "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
3885 ;\r
3886\r
30fdf114
LG
3887vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
3888 "\("\r
3889 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
3890 "\)"\r
3891 ;\r
3892\r
3893vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3894 dupExp[$RootLevel, $ExpOpCount]\r
3895 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval\r
3896 | ideqvalExp[$RootLevel, $ExpOpCount]\r
3897 | ideqidExp[$RootLevel, $ExpOpCount]\r
3898 | ideqvallistExp[$RootLevel, $ExpOpCount]\r
2bcc713e 3899 | questionref1Exp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3900 | rulerefExp[$RootLevel, $ExpOpCount]\r
3901 | stringref1Exp[$RootLevel, $ExpOpCount]\r
3902 | pushthisExp[$RootLevel, $ExpOpCount]\r
a709adfa 3903 | securityExp[$RootLevel, $ExpOpCount]\r
52302d4d 3904 | getExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
3905 ;\r
3906\r
3907dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3908 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
3909 ;\r
3910\r
3911vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3912 <<\r
3913 EFI_QUESTION_ID QId;\r
3914 UINT32 Mask;\r
3915 UINT16 ConstVal;\r
3916 CHAR8 *VarIdStr;\r
3917 UINT32 LineNo;\r
30fdf114 3918 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;\r
4afd3d04 3919 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
30fdf114
LG
3920 >>\r
3921 L:VarEqVal <<\r
3922 if (!mCompatibleMode) {\r
3923 _PCATCH (VFR_RETURN_UNSUPPORTED, L);\r
3924 }\r
3925 >>\r
3926 VK:Var\r
3927 OpenParen\r
3928 VN:Number <<\r
3929 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
4afd3d04 3930 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
30fdf114
LG
3931 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
3932 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
3933 VarIdStr,\r
3934 &mFormsetGuid,\r
e4ac870f 3935 _STOSID(VN->getText(), VN->getLine()),\r
30fdf114
LG
3936 0x2, //default type is UINT16\r
3937 FALSE\r
3938 ), VN);\r
3939 } else {\r
3940 _PCATCH (VfrReturnCode, VN);\r
3941 }\r
3942 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);\r
3943 LineNo = GET_LINENO(VN);\r
3944 >>\r
3945 CloseParen\r
3946 (\r
3947 (\r
3948 "=="\r
e4ac870f 3949 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
3950 <<\r
3951 if (Mask == 0) {\r
3952 CIfrEqIdVal EIVObj (L->getLine());\r
3953 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
3954 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
3955 EIVObj.SetValue (ConstVal);\r
3956 $ExpOpCount++;\r
3957 } else {\r
3958 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
3959 }\r
3960 >>\r
3961 )\r
3962 |\r
3963 (\r
3964 "<="\r
e4ac870f 3965 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
3966 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
3967 )\r
3968 |\r
3969 (\r
3970 "<"\r
e4ac870f 3971 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
3972 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
3973 )\r
3974 |\r
3975 (\r
3976 ">="\r
e4ac870f 3977 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
3978 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
3979 )\r
3980 |\r
3981 (\r
3982 ">"\r
e4ac870f 3983 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
3984 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
3985 )\r
3986 )\r
3987 ;\r
3988\r
3989ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
3990 <<\r
3991 EFI_QUESTION_ID QId;\r
3992 UINT32 Mask;\r
3993 UINT16 ConstVal;\r
3994 CHAR8 *VarIdStr;\r
3995 UINT32 LineNo;\r
3996 >>\r
3997 L:IdEqVal\r
3998 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
3999 (\r
4000 (\r
4001 "=="\r
e4ac870f 4002 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>\r
30fdf114
LG
4003 <<\r
4004 if (Mask == 0) {\r
4005 CIfrEqIdVal EIVObj (L->getLine());\r
4006 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());\r
4007 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4008 EIVObj.SetValue (ConstVal);\r
4009 $ExpOpCount++;\r
4010 } else {\r
4011 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
4012 }\r
4013 >>\r
4014 )\r
4015 |\r
4016 (\r
4017 "<="\r
e4ac870f 4018 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>\r
30fdf114
LG
4019 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
4020 )\r
4021 |\r
4022 (\r
4023 "<"\r
e4ac870f 4024 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>\r
30fdf114
LG
4025 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
4026 )\r
4027 |\r
4028 (\r
4029 ">="\r
e4ac870f 4030 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>\r
30fdf114
LG
4031 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
4032 )\r
4033 |\r
4034 (\r
4035 ">"\r
e4ac870f 4036 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>\r
30fdf114
LG
4037 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
4038 )\r
4039 )\r
4040 ;\r
4041\r
4042ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4043 <<\r
4044 EFI_QUESTION_ID QId[2];\r
4045 UINT32 Mask[2];\r
4046 CHAR8 *VarIdStr[2];\r
4047 UINT32 LineNo[2];\r
4048 >>\r
4049 L:IdEqId\r
4050 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
4051 (\r
4052 (\r
4053 "=="\r
4054 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4055 <<\r
4056 if (Mask[0] & Mask[1]) {\r
4057 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
4058 } else {\r
4059 CIfrEqIdId EIIObj(L->getLine());\r
4060 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());\r
4061 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
4062 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
4063 $ExpOpCount++;\r
4064 }\r
4065 >>\r
4066 )\r
4067 |\r
4068 (\r
4069 "<="\r
4070 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4071 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
4072 )\r
4073 |\r
4074 (\r
4075 "<"\r
4076 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4077 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
4078 )\r
4079 |\r
4080 (\r
4081 ">="\r
4082 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4083 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
4084 )\r
4085 |\r
4086 (\r
4087 ">"\r
4088 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
4089 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
4090 )\r
4091 )\r
4092 ;\r
4093\r
4094ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4095 <<\r
4096 UINT16 ListLen = 0;\r
4097 EFI_QUESTION_ID QId;\r
4098 UINT32 Mask;\r
4099 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
4100 CHAR8 *VarIdStr;\r
4101 UINT32 LineNo;\r
4102 >>\r
4103 L:IdEqValList\r
4104 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
4105 "=="\r
4106 (\r
e4ac870f 4107 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>\r
30fdf114
LG
4108 )+\r
4109 <<\r
4110 if (Mask != 0) {\r
4111 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
4112 } else {\r
4113 UINT16 Index;\r
4114 CIfrEqIdList EILObj(L->getLine());\r
4115 if (QId != EFI_QUESTION_ID_INVALID) {\r
4116 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4117 }\r
4118 EILObj.SetListLength (ListLen);\r
4119 for (Index = 0; Index < ListLen; Index++) {\r
4120 EILObj.SetValueList (Index, ValueList[Index]);\r
4121 }\r
4122 \r
4123 EILObj.UpdateIfrBuffer();\r
4124 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); \r
4125 \r
4126 if (QId == EFI_QUESTION_ID_INVALID) {\r
4127 EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
4128 }\r
4129 $ExpOpCount++;\r
4130 }\r
4131 >>\r
4132 ;\r
4133\r
2bcc713e 4134questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
30fdf114 4135 <<\r
30fdf114
LG
4136 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4137 UINT32 BitMask;\r
4138 CHAR8 *QName = NULL;\r
4139 UINT32 LineNo = 0;\r
4140 >>\r
4141 L:QuestionRef\r
2bcc713e
LG
4142 "\("\r
4143 (\r
30fdf114
LG
4144 QN:StringIdentifier <<\r
4145 QName = QN->getText();\r
2bcc713e 4146 LineNo = QN->getLine();\r
30fdf114
LG
4147 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
4148 >>\r
e4ac870f 4149 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>\r
30fdf114 4150 )\r
2bcc713e 4151 "\)"\r
30fdf114 4152 <<\r
2bcc713e 4153 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>\r
30fdf114
LG
4154 ;\r
4155\r
4156rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4157 L:RuleRef\r
4158 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
4159 ;\r
4160\r
4161//******************************************************\r
4162// PARSE:\r
4163// stringref (STR_FORM_SET_TITLE)\r
4164//\r
4165stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
52302d4d
LG
4166 <<\r
4167 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;\r
4168 >>\r
30fdf114 4169 L:StringRef\r
52302d4d
LG
4170 "\("\r
4171 ( \r
4172 "STRING_TOKEN"\r
4173 "\(" \r
e4ac870f 4174 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>\r
52302d4d 4175 "\)"\r
e4ac870f 4176 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>\r
52302d4d
LG
4177 )\r
4178 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>\r
30fdf114
LG
4179 ;\r
4180\r
4181pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4182 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>\r
4183 ;\r
4184\r
a709adfa
LG
4185securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4186 <<\r
4187 EFI_GUID Guid;\r
4188 >>\r
4189 L:Security\r
4190 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>\r
4191 ;\r
4192\r
52302d4d
LG
4193numericVarStoreType [UINT8 & VarType] :\r
4194 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>\r
4195 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>\r
4196 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>\r
4197 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>\r
4198 ;\r
4199\r
4200getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4201 <<\r
4202 EFI_VARSTORE_INFO Info;\r
4203 CHAR8 *VarIdStr = NULL;\r
4204 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4205 UINT32 Mask = 0;\r
4206 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4207 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4208 UINT32 VarSize = 0;\r
4209 Info.mVarStoreId = 0;\r
4210 >>\r
4211 L:Get\r
4212 "\(" \r
4213 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4214 {"\|" FLAGS "=" numericVarStoreType [VarType] }\r
4215 "\)" << \r
4216 {\r
4217 if (Info.mVarStoreId == 0) {\r
4218 // support Date/Time question\r
4219 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4220 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4221 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4222 }\r
4223 if (QType == QUESTION_DATE) {\r
4224 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4225 } else if (QType == QUESTION_TIME) {\r
4226 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4227 }\r
4228 switch (Mask) {\r
4229 case DATE_YEAR_BITMASK:\r
4230 Info.mInfo.mVarOffset = 0;\r
4231 break;\r
4232 case DATE_DAY_BITMASK:\r
4233 Info.mInfo.mVarOffset = 3;\r
4234 break;\r
4235 case TIME_HOUR_BITMASK:\r
4236 Info.mInfo.mVarOffset = 0;\r
4237 break;\r
4238 case TIME_MINUTE_BITMASK:\r
4239 Info.mInfo.mVarOffset = 1;\r
4240 break;\r
4241 case TIME_SECOND_BITMASK:\r
4242 Info.mInfo.mVarOffset = 2;\r
4243 break;\r
4244 default:\r
4245 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4246 break;\r
4247 }\r
4248 } else {\r
4249 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
4250 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4251 }\r
4252 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4253 Info.mVarType = VarType;\r
4254 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4255 Info.mVarTotalSize = VarSize;\r
4256 }\r
4257 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4258 if (VarSize != Info.mVarTotalSize) {\r
4259 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4260 }\r
4261 }\r
4262 CIfrGet GObj(L->getLine()); \r
4263 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); \r
4264 GObj.SetVarInfo (&Info); \r
4265 delete VarIdStr; \r
4266 $ExpOpCount++;\r
4267 }\r
4268 >>\r
4269 ;\r
4270\r
30fdf114
LG
4271vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4272 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>\r
4273 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>\r
4274 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>\r
4275 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>\r
4276 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>\r
4277 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>\r
4278 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>\r
e4ac870f 4279 | 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
4280 ;\r
4281\r
4282vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4283 lengthExp[$RootLevel, $ExpOpCount]\r
4284 | bitwisenotExp[$RootLevel, $ExpOpCount]\r
2bcc713e 4285 | question23refExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4286 | stringref2Exp[$RootLevel, $ExpOpCount]\r
4287 | toboolExp[$RootLevel, $ExpOpCount]\r
0d2711a6 4288 | tostringExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4289 | unintExp[$RootLevel, $ExpOpCount]\r
4290 | toupperExp[$RootLevel, $ExpOpCount]\r
4291 | tolwerExp[$RootLevel, $ExpOpCount]\r
52302d4d 4292 | setExp[$RootLevel, $ExpOpCount]\r
30fdf114
LG
4293 ;\r
4294\r
4295lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4296 L:Length\r
4297 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4298 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
4299 ;\r
4300\r
4301bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4302 L:BitWiseNot\r
4303 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4304 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
4305 ;\r
4306\r
2bcc713e
LG
4307question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4308 <<\r
4309 UINT8 Type = 0x1;\r
4310 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;\r
4311 EFI_GUID Guid = {0,};\r
4312 >>\r
30fdf114 4313 L:QuestionRefVal\r
2bcc713e
LG
4314 "\("\r
4315 {\r
e4ac870f 4316 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>\r
2bcc713e
LG
4317 }\r
4318 {\r
4319 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>\r
4320 }\r
4321 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4322 "\)"\r
4323 <<\r
4324 switch (Type) {\r
4325 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}\r
4326 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}\r
4327 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
4328 }\r
4329 $ExpOpCount++;\r
4330 >>\r
30fdf114
LG
4331 ;\r
4332\r
4333stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4334 L:StringRefVal\r
4335 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4336 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
4337 ;\r
4338\r
4339toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4340 L:BoolVal\r
4341 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4342 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
4343 ;\r
4344\r
4345tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4346 << UINT8 Fmt = 0; >>\r
4347 L:StringVal\r
4348 {\r
e4ac870f 4349 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>\r
30fdf114
LG
4350 }\r
4351 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4352 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
4353 ;\r
4354\r
4355unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4356 L:UnIntVal\r
4357 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4358 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
4359 ;\r
4360\r
4361toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4362 L:ToUpper\r
4363 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4364 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
4365 ;\r
4366\r
4367tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4368 L:ToLower\r
4369 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"\r
4370 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
4371 ;\r
4372\r
52302d4d
LG
4373setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4374 <<\r
4375 EFI_VARSTORE_INFO Info;\r
4376 CHAR8 *VarIdStr = NULL;\r
4377 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
4378 UINT32 Mask = 0;\r
4379 EFI_QUESION_TYPE QType = QUESTION_NORMAL;\r
4380 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;\r
4381 UINT32 VarSize = 0;\r
4382 Info.mVarStoreId = 0;\r
4383 >>\r
4384 L:Set\r
4385 "\("\r
4386 vfrStorageVarId[Info, VarIdStr, FALSE]\r
4387 {"\|" FLAG "=" numericVarStoreType [VarType] }\r
4388 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4389 "\)"\r
4390 << \r
4391 {\r
4392 if (Info.mVarStoreId == 0) {\r
4393 // support Date/Time question\r
4394 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);\r
4395 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {\r
4396 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4397 }\r
4398 if (QType == QUESTION_DATE) {\r
4399 Info.mVarType = EFI_IFR_TYPE_DATE;\r
4400 } else if (QType == QUESTION_TIME) {\r
4401 Info.mVarType = EFI_IFR_TYPE_TIME;\r
4402 }\r
4403 switch (Mask) {\r
4404 case DATE_YEAR_BITMASK:\r
4405 Info.mInfo.mVarOffset = 0;\r
4406 break;\r
4407 case DATE_DAY_BITMASK:\r
4408 Info.mInfo.mVarOffset = 3;\r
4409 break;\r
4410 case TIME_HOUR_BITMASK:\r
4411 Info.mInfo.mVarOffset = 0;\r
4412 break;\r
4413 case TIME_MINUTE_BITMASK:\r
4414 Info.mInfo.mVarOffset = 1;\r
4415 break;\r
4416 case TIME_SECOND_BITMASK:\r
4417 Info.mInfo.mVarOffset = 2;\r
4418 break;\r
4419 default:\r
4420 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");\r
4421 break;\r
4422 }\r
4423 } else {\r
4424 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
4425 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
4426 }\r
4427 if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
4428 Info.mVarType = VarType;\r
4429 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4430 Info.mVarTotalSize = VarSize;\r
4431 }\r
4432 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");\r
4433 if (VarSize != Info.mVarTotalSize) {\r
4434 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");\r
4435 }\r
4436 }\r
4437 CIfrSet TSObj(L->getLine()); \r
4438 TSObj.SetVarInfo (&Info); \r
4439 delete VarIdStr; \r
4440 $ExpOpCount++;\r
4441 }\r
4442 >>\r
4443 ;\r
4444\r
30fdf114
LG
4445vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4446 conditionalExp[$RootLevel, $ExpOpCount]\r
4447 | findExp[$RootLevel, $ExpOpCount]\r
4448 | midExp[$RootLevel, $ExpOpCount]\r
4449 | tokenExp[$RootLevel, $ExpOpCount]\r
4450 | spanExp[$RootLevel, $ExpOpCount]\r
4451 ;\r
4452\r
4453#token Cond("cond") "cond"\r
4454#token Find("find") "find"\r
4455#token Mid("mid") "mid"\r
4456#token Tok("token") "token"\r
4457#token Span("span") "span"\r
4458\r
4459conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4460 L:Cond "\("\r
4461 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4462 "?"\r
4463 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4464 ":"\r
4465 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4466 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
4467 ;\r
4468\r
4469findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4470 << UINT8 Format; >>\r
4471 L:Find "\("\r
4472 findFormat[Format] ( "\|" findFormat[Format] )*\r
4473 ","\r
4474 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4475 ","\r
4476 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4477 ","\r
4478 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4479 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
4480 ;\r
4481\r
4482findFormat [UINT8 & Format] :\r
4483 "SENSITIVE" << $Format = 0x00; >>\r
4484 | "INSENSITIVE" << $Format = 0x01; >>\r
4485 ;\r
4486\r
4487midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4488 L:Mid "\("\r
4489 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4490 ","\r
4491 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4492 ","\r
4493 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4494 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
4495 ;\r
4496\r
4497tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4498 L:Tok "\("\r
4499 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4500 ","\r
4501 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4502 ","\r
4503 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4504 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
4505 ;\r
4506\r
4507spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
4508 << UINT8 Flags = 0; >>\r
4509 S:Span "\("\r
4510 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
4511 ","\r
4512 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4513 ","\r
4514 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4515 ","\r
4516 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
4517 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
4518 ;\r
4519\r
52302d4d
LG
4520vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
4521 L:Map \r
4522 "\(" \r
4523 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] \r
4524 ":" << { CIfrMap MObj(L->getLine()); } >>\r
4525 (\r
4526 vfrStatementExpression[0]\r
4527 ","\r
4528 vfrStatementExpression[0]\r
4529 ";"\r
4530 ) *\r
4531 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>\r
4532 ;\r
4533\r
30fdf114 4534spanFlags [UINT8 & Flags] :\r
e4ac870f 4535 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>\r
30fdf114
LG
4536 | "LAST_NON_MATCH" << $Flags |= 0x00; >>\r
4537 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>\r
4538 ;\r
4539\r
4540#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"\r
4541#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"\r
4542\r
4543//******************************************************************************\r
4544//\r
4545// Parser class definition.\r
4546//\r
4547class EfiVfrParser {\r
4548<<\r
4549private:\r
4550 UINT8 mParserStatus;\r
4551 BOOLEAN mConstantOnlyInExpression;\r
4552\r
4553 CVfrDefaultStore mCVfrDefaultStore;\r
4554 CVfrDataStorage mCVfrDataStorage;\r
4555 CVfrQuestionDB mCVfrQuestionDB;\r
4556 CVfrRulesDB mCVfrRulesDB;\r
4557\r
52302d4d
LG
4558 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];\r
4559 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];\r
4560 UINT8 mCIfrOpHdrIndex;\r
30fdf114
LG
4561 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);\r
4562 VOID _CLEAR_SAVED_OPHDR (VOID);\r
4563 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);\r
4564\r
4565\r
4566 EFI_VARSTORE_INFO mCurrQestVarInfo;\r
4234283c 4567 EFI_GUID *mOverrideClassGuid;\r
4afd3d04
LG
4568 CHAR8* mLastFormEndAddr;\r
4569\r
4570//\r
4571// Whether the question already has default value.\r
4572//\r
4573 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];\r
4574 UINT16 mUsedDefaultCount;\r
30fdf114
LG
4575\r
4576//\r
4577// For framework vfr compatibility\r
4578//\r
4579 BOOLEAN mCompatibleMode;\r
4580 EFI_GUID mFormsetGuid;\r
4581\r
4582 VOID _CRT_OP (IN BOOLEAN);\r
4583\r
4584 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
4585 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
4586\r
4587 UINT8 _GET_CURRQEST_DATATYPE ();\r
4588 UINT32 _GET_CURRQEST_VARSIZE ();\r
b303ea72 4589 UINT32 _GET_CURRQEST_ARRAY_SIZE();\r
4afd3d04 4590 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);\r
30fdf114
LG
4591\r
4592public:\r
52302d4d 4593 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);\r
30fdf114
LG
4594 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);\r
4595 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
4596 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
52302d4d 4597 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);\r
30fdf114
LG
4598\r
4599 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
4600\r
4601 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);\r
4602 CHAR8* _U32TOS (IN UINT32);\r
e4ac870f
LG
4603 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);\r
4604 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);\r
4605 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);\r
4606 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);\r
4607 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4608 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
4609 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);\r
4610\r
4611 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);\r
4612 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);\r
4613 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);\r
30fdf114 4614\r
52302d4d 4615 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);\r
30fdf114 4616\r
30fdf114
LG
4617 VOID _DeclareDefaultLinearVarStore (IN UINT32);\r
4618 VOID _DeclareStandardDefaultStorage (IN UINT32);\r
4619 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);\r
4620\r
4621 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
4622\r
4623 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);\r
4624 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
4625 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
4626 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
4234283c 4627 VOID SetOverrideClassGuid (IN EFI_GUID *);\r
30fdf114
LG
4628//\r
4629// For framework vfr compatibility\r
4630//\r
4631 VOID SetCompatibleMode (IN BOOLEAN);\r
4632>>\r
4633}\r
4634\r
4635<<\r
4636VOID\r
4637EfiVfrParser::_SAVE_OPHDR_COND (\r
4638 IN CIfrOpHeader &OpHdr,\r
4639 IN BOOLEAN Cond,\r
4640 IN UINT32 LineNo\r
4641 )\r
4642{\r
4643 if (Cond == TRUE) {\r
52302d4d 4644 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
30fdf114
LG
4645 return ;\r
4646 }\r
52302d4d
LG
4647 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);\r
4648 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;\r
30fdf114
LG
4649 }\r
4650}\r
4651\r
4652VOID\r
4653EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
4654 VOID\r
4655 )\r
4656{\r
52302d4d
LG
4657 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;\r
4658 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
30fdf114
LG
4659}\r
4660\r
4661BOOLEAN\r
4662EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
4663 VOID\r
4664 )\r
4665{\r
52302d4d
LG
4666 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
4667 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);\r
30fdf114
LG
4668 return TRUE;\r
4669 }\r
52302d4d 4670\r
30fdf114
LG
4671 //\r
4672 // IfrOpHdr is not set, FALSE is return.\r
4673 //\r
4674 return FALSE;\r
4675}\r
4676\r
4677VOID\r
4678EfiVfrParser::_CRT_OP (\r
4679 IN BOOLEAN Crt\r
4680 )\r
4681{\r
4682 gCreateOp = Crt;\r
4683}\r
4684\r
4685VOID\r
4686EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
4687 IN EFI_VARSTORE_INFO &Info\r
4688 )\r
4689{\r
4690 mCurrQestVarInfo = Info;\r
4691}\r
4692\r
4693EFI_VARSTORE_INFO &\r
4694EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
4695 VOID\r
4696 )\r
4697{\r
4698 return mCurrQestVarInfo;\r
4699}\r
4700\r
b303ea72
LG
4701UINT32\r
4702EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (\r
4703 VOID\r
4704 )\r
4705{\r
4706 UINT8 Size = 1;\r
4707\r
4708 switch (mCurrQestVarInfo.mVarType) {\r
4709 case EFI_IFR_TYPE_NUM_SIZE_8:\r
4710 Size = 1;\r
4711 break;\r
4712\r
4713 case EFI_IFR_TYPE_NUM_SIZE_16:\r
4714 Size = 2;\r
4715 break;\r
4716\r
4717 case EFI_IFR_TYPE_NUM_SIZE_32:\r
4718 Size = 4;\r
4719 break;\r
4720\r
4721 case EFI_IFR_TYPE_NUM_SIZE_64:\r
4722 Size = 8;\r
4723 break;\r
4724\r
4725 default:\r
4726 break;\r
4727 }\r
4728\r
4729 return (mCurrQestVarInfo.mVarTotalSize / Size);\r
4730}\r
4731\r
30fdf114
LG
4732UINT8\r
4733EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
4734 VOID\r
4735 )\r
4736{\r
4737 return mCurrQestVarInfo.mVarType;\r
4738}\r
4739\r
4740UINT32\r
4741EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
4742 VOID\r
4743 )\r
4744{\r
4745 return mCurrQestVarInfo.mVarTotalSize;\r
4746}\r
4747\r
4748VOID\r
4749EfiVfrParser::_PCATCH (\r
4750 IN INTN ReturnCode,\r
4751 IN INTN ExpectCode,\r
4752 IN ANTLRTokenPtr Tok,\r
52302d4d 4753 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4754 )\r
4755{\r
4756 if (ReturnCode != ExpectCode) {\r
4757 mParserStatus++;\r
4758 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);\r
4759 }\r
4760}\r
4761\r
4762VOID\r
4763EfiVfrParser::_PCATCH (\r
4764 IN EFI_VFR_RETURN_CODE ReturnCode\r
4765 )\r
4766{\r
52302d4d 4767 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);\r
30fdf114
LG
4768}\r
4769\r
4770VOID\r
4771EfiVfrParser::_PCATCH (\r
4772 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4773 IN ANTLRTokenPtr Tok\r
4774 )\r
4775{\r
52302d4d 4776 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
30fdf114
LG
4777}\r
4778\r
4779VOID\r
4780EfiVfrParser::_PCATCH (\r
4781 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4782 IN UINT32 LineNum\r
4783 )\r
4784{\r
52302d4d 4785 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
30fdf114
LG
4786}\r
4787\r
4788VOID\r
4789EfiVfrParser::_PCATCH (\r
4790 IN EFI_VFR_RETURN_CODE ReturnCode,\r
4791 IN UINT32 LineNum,\r
52302d4d 4792 IN CONST CHAR8 *ErrorMsg\r
30fdf114
LG
4793 )\r
4794{\r
52302d4d 4795 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);\r
30fdf114
LG
4796}\r
4797\r
4798VOID\r
4799EfiVfrParser::syn (\r
4800 ANTLRAbstractToken *Tok,\r
4801 ANTLRChar *Egroup,\r
4802 SetWordType *Eset,\r
4803 ANTLRTokenType ETok,\r
4804 INT32 Huh\r
4805 )\r
4806{\r
4807 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
4808\r
4809 mParserStatus += 1;\r
4810}\r
4811\r
4812CHAR8 *\r
4813EfiVfrParser::TrimHex (\r
4814 IN CHAR8 *Str,\r
4815 OUT BOOLEAN *IsHex\r
4816 )\r
4817{\r
4818 *IsHex = FALSE;\r
4819\r
4820 while (*Str && *Str == ' ') {\r
4821 Str++;\r
4822 }\r
4823 while (*Str && *Str == '0') {\r
4824 Str++;\r
4825 }\r
4826 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
4827 Str++;\r
4828 *IsHex = TRUE;\r
4829 }\r
4830\r
4831 return Str;\r
4832}\r
4833\r
4834CHAR8 *\r
4835EfiVfrParser::_U32TOS (\r
4836 IN UINT32 Value\r
4837 )\r
4838{\r
4839 CHAR8 *Str;\r
4840 Str = new CHAR8[20];\r
4841 sprintf (Str, "%d", Value);\r
4842 return Str;\r
4843}\r
4844\r
4845UINT8\r
4846EfiVfrParser::_STOU8 (\r
e4ac870f
LG
4847 IN CHAR8 *Str,\r
4848 IN UINT32 LineNum\r
30fdf114
LG
4849 )\r
4850{\r
4851 BOOLEAN IsHex;\r
4852 UINT8 Value;\r
4853 CHAR8 c;\r
4854\r
e4ac870f
LG
4855 UINT8 PreviousValue;\r
4856 CHAR8 *OrigString = Str;\r
4857 CHAR8 ErrorMsg[100];\r
4858\r
30fdf114
LG
4859 Str = TrimHex (Str, &IsHex);\r
4860 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4861 PreviousValue = Value;\r
30fdf114
LG
4862 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4863\r
4864 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4865 Value += (c - 'a' + 10);\r
4866 }\r
4867 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4868 Value += (c - 'A' + 10);\r
4869 }\r
4870 if (c >= '0' && c <= '9') {\r
4871 Value += (c - '0');\r
4872 }\r
e4ac870f
LG
4873 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4874 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);\r
4875 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4876 }\r
30fdf114
LG
4877 }\r
4878\r
4879 return Value;\r
4880}\r
4881\r
4882UINT16\r
4883EfiVfrParser::_STOU16 (\r
e4ac870f
LG
4884 IN CHAR8 *Str,\r
4885 IN UINT32 LineNum\r
30fdf114
LG
4886 )\r
4887{\r
4888 BOOLEAN IsHex;\r
4889 UINT16 Value;\r
4890 CHAR8 c;\r
4891\r
e4ac870f
LG
4892 UINT16 PreviousValue;\r
4893 CHAR8 *OrigString = Str;\r
4894 CHAR8 ErrorMsg[100];\r
4895\r
30fdf114
LG
4896 Str = TrimHex (Str, &IsHex);\r
4897 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4898 PreviousValue = Value;\r
30fdf114
LG
4899 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4900\r
4901 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4902 Value += (c - 'a' + 10);\r
4903 }\r
4904 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4905 Value += (c - 'A' + 10);\r
4906 }\r
4907 if (c >= '0' && c <= '9') {\r
4908 Value += (c - '0');\r
4909 }\r
e4ac870f
LG
4910 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {\r
4911 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);\r
4912 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4913 }\r
30fdf114
LG
4914 }\r
4915\r
4916 return Value;\r
4917}\r
4918\r
4919UINT32\r
4920EfiVfrParser::_STOU32 (\r
e4ac870f
LG
4921 IN CHAR8 *Str,\r
4922 IN UINT32 LineNum\r
30fdf114
LG
4923 )\r
4924{\r
4925 BOOLEAN IsHex;\r
4926 UINT32 Value;\r
4927 CHAR8 c;\r
4928\r
e4ac870f
LG
4929 UINT32 PreviousValue;\r
4930 CHAR8 *OrigString = Str;\r
4931 CHAR8 ErrorMsg[100];\r
4932\r
30fdf114
LG
4933 Str = TrimHex (Str, &IsHex);\r
4934 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4935 PreviousValue = Value;\r
30fdf114
LG
4936 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4937\r
4938 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4939 Value += (c - 'a' + 10);\r
4940 }\r
4941 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4942 Value += (c - 'A' + 10);\r
4943 }\r
4944 if (c >= '0' && c <= '9') {\r
4945 Value += (c - '0');\r
4946 }\r
e4ac870f
LG
4947 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {\r
4948 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);\r
4949 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4950 }\r
30fdf114
LG
4951 }\r
4952\r
4953 return Value;\r
4954}\r
4955\r
4956UINT64\r
4957EfiVfrParser::_STOU64 (\r
e4ac870f
LG
4958 IN CHAR8 *Str,\r
4959 IN UINT32 LineNum\r
30fdf114
LG
4960 )\r
4961{\r
4962 BOOLEAN IsHex;\r
4963 UINT64 Value;\r
4964 CHAR8 c;\r
e4ac870f
LG
4965 UINT64 PreviousValue;\r
4966 CHAR8 *OrigString = Str;\r
4967 CHAR8 ErrorMsg[100];\r
30fdf114
LG
4968\r
4969 Str = TrimHex (Str, &IsHex);\r
4970 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
e4ac870f 4971 PreviousValue = Value;\r
30fdf114
LG
4972 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
4973\r
4974 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
4975 Value += (c - 'a' + 10);\r
4976 }\r
4977 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
4978 Value += (c - 'A' + 10);\r
4979 }\r
4980 if (c >= '0' && c <= '9') {\r
4981 Value += (c - '0');\r
4982 }\r
e4ac870f
LG
4983 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {\r
4984 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);\r
4985 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);\r
4986 }\r
30fdf114
LG
4987 }\r
4988\r
4989 return Value;\r
4990}\r
4991\r
4992EFI_HII_DATE\r
4993EfiVfrParser::_STOD (\r
4994 IN CHAR8 *Year,\r
4995 IN CHAR8 *Month,\r
e4ac870f
LG
4996 IN CHAR8 *Day,\r
4997 IN UINT32 LineNum\r
30fdf114
LG
4998 )\r
4999{\r
5000 EFI_HII_DATE Date;\r
5001\r
e4ac870f
LG
5002 Date.Year = _STOU16 (Year, LineNum);\r
5003 Date.Month = _STOU8 (Month, LineNum);\r
5004 Date.Day = _STOU8 (Day, LineNum);\r
30fdf114
LG
5005\r
5006 return Date;\r
5007}\r
5008\r
5009EFI_HII_TIME\r
5010EfiVfrParser::_STOT (\r
5011 IN CHAR8 *Hour,\r
5012 IN CHAR8 *Minute,\r
e4ac870f
LG
5013 IN CHAR8 *Second,\r
5014 IN UINT32 LineNum\r
30fdf114
LG
5015 )\r
5016{\r
5017 EFI_HII_TIME Time;\r
5018\r
e4ac870f
LG
5019 Time.Hour = _STOU8 (Hour, LineNum);\r
5020 Time.Minute = _STOU8 (Minute, LineNum);\r
5021 Time.Second = _STOU8 (Second, LineNum);\r
30fdf114
LG
5022\r
5023 return Time;\r
5024}\r
5025\r
5026EFI_STRING_ID\r
5027EfiVfrParser::_STOSID (\r
e4ac870f
LG
5028 IN CHAR8 *Str,\r
5029 IN UINT32 LineNum\r
30fdf114
LG
5030 )\r
5031{\r
e4ac870f 5032 return (EFI_STRING_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
5033}\r
5034\r
5035EFI_FORM_ID\r
5036EfiVfrParser::_STOFID (\r
e4ac870f
LG
5037 IN CHAR8 *Str,\r
5038 IN UINT32 LineNum\r
30fdf114
LG
5039 )\r
5040{\r
e4ac870f 5041 return (EFI_FORM_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
5042}\r
5043\r
5044EFI_QUESTION_ID\r
5045EfiVfrParser::_STOQID (\r
e4ac870f
LG
5046 IN CHAR8 *Str,\r
5047 IN UINT32 LineNum\r
30fdf114
LG
5048 )\r
5049{\r
e4ac870f 5050 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);\r
30fdf114
LG
5051}\r
5052\r
5053VOID\r
5054EfiVfrParser::_STRCAT (\r
5055 IN OUT CHAR8 **Dest,\r
52302d4d 5056 IN CONST CHAR8 *Src\r
30fdf114
LG
5057 )\r
5058{\r
5059 CHAR8 *NewStr;\r
5060 UINT32 Len;\r
5061\r
5062 if ((Dest == NULL) || (Src == NULL)) {\r
5063 return;\r
5064 }\r
5065\r
5066 Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
5067 Len += strlen (Src);\r
5068 if ((NewStr = new CHAR8[Len + 1]) == NULL) {\r
5069 return;\r
5070 }\r
5071 NewStr[0] = '\0';\r
5072 if (*Dest != NULL) {\r
5073 strcpy (NewStr, *Dest);\r
5074 delete *Dest;\r
5075 }\r
5076 strcat (NewStr, Src);\r
5077\r
5078 *Dest = NewStr;\r
5079}\r
5080\r
4234283c
LG
5081EFI_HII_REF\r
5082EfiVfrParser::_STOR (\r
5083 IN CHAR8 *QuestionId,\r
5084 IN CHAR8 *FormId,\r
5085 IN EFI_GUID *FormSetGuid,\r
e4ac870f
LG
5086 IN CHAR8 *DevicePath,\r
5087 IN UINT32 LineNum\r
4234283c
LG
5088 )\r
5089{\r
5090 EFI_HII_REF Ref;\r
5091 UINT32 Index;\r
5092\r
5093 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
e4ac870f
LG
5094 Ref.QuestionId = _STOQID (QuestionId, LineNum);\r
5095 Ref.FormId = _STOFID (FormId, LineNum);\r
5096 Ref.DevicePath = _STOSID (DevicePath, LineNum);\r
4234283c
LG
5097\r
5098 return Ref;\r
5099}\r
5100\r
30fdf114
LG
5101//\r
5102// framework vfr to default declare varstore for each structure\r
5103//\r
5104VOID\r
5105EfiVfrParser::_DeclareDefaultFrameworkVarStore (\r
5106 IN UINT32 LineNo\r
5107 )\r
5108{\r
5109 SVfrVarStorageNode *pNode;\r
5110 UINT32 TypeSize;\r
5111 BOOLEAN FirstNode;\r
52302d4d 5112 CONST CHAR8 VarName[] = "Setup";\r
30fdf114
LG
5113\r
5114 FirstNode = TRUE;\r
5115 pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
5116 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
5117 //\r
5118 // Create the default Buffer Var Store when no VarStore is defined.\r
5119 // its name should be "Setup"\r
5120 //\r
5121 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
5122 CIfrVarStore VSObj;\r
5123 VSObj.SetLineNo (LineNo);\r
5124 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
52302d4d 5125 VSObj.SetSize ((UINT16) TypeSize);\r
30fdf114 5126 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
52302d4d 5127 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
5128 VSObj.SetGuid (&mFormsetGuid);\r
5129#ifdef VFREXP_DEBUG\r
5130 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
5131#endif\r
5132 } else {\r
5133 for (; pNode != NULL; pNode = pNode->mNext) {\r
5134 //\r
5135 // create the default varstore opcode for not declared varstore\r
5136 // the first varstore name should be "Setup"\r
5137 //\r
5138 if (!pNode->mAssignedFlag) {\r
5139 CIfrVarStore VSObj;\r
5140 VSObj.SetLineNo (LineNo);\r
5141 VSObj.SetVarStoreId (pNode->mVarStoreId);\r
52302d4d 5142 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);\r
30fdf114 5143 if (FirstNode) {\r
52302d4d 5144 VSObj.SetName ((CHAR8 *) VarName);\r
30fdf114
LG
5145 FirstNode = FALSE;\r
5146 } else {\r
5147 VSObj.SetName (pNode->mVarStoreName);\r
5148 }\r
5149 VSObj.SetGuid (&pNode->mGuid);\r
5150#ifdef VFREXP_DEBUG\r
5151 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
5152#endif\r
5153 }\r
5154 }\r
5155 }\r
5156\r
5157 pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
5158 for (; pNode != NULL; pNode = pNode->mNext) {\r
5159 //\r
5160 // create the default efi varstore opcode for not exist varstore\r
5161 //\r
5162 if (!pNode->mAssignedFlag) {\r
5163 CIfrVarStoreEfi VSEObj;\r
5164 VSEObj.SetLineNo (LineNo);\r
5165 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute\r
5166 VSEObj.SetGuid (&pNode->mGuid);\r
5167 VSEObj.SetVarStoreId (pNode->mVarStoreId);\r
4234283c
LG
5168 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,\r
5169 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.\r
5170 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);\r
30fdf114
LG
5171#ifdef VFREXP_DEBUG\r
5172 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
5173#endif\r
5174 }\r
5175 }\r
5176\r
5177}\r
5178\r
5179VOID\r
5180EfiVfrParser::_DeclareDefaultLinearVarStore (\r
5181 IN UINT32 LineNo\r
5182 )\r
5183{\r
5184 UINT32 Index;\r
5185 CHAR8 **TypeNameList;\r
5186 UINT32 ListSize;\r
52302d4d
LG
5187 CONST CHAR8 DateName[] = "Date";\r
5188 CONST CHAR8 TimeName[] = "Time";\r
5189 CONST CHAR8 DateType[] = "EFI_HII_DATE";\r
5190 CONST CHAR8 TimeType[] = "EFI_HII_TIME";\r
30fdf114
LG
5191\r
5192 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
5193\r
5194 for (Index = 0; Index < ListSize; Index++) {\r
5195 UINT32 Size;\r
5196 EFI_VARSTORE_ID VarStoreId;\r
5197 CIfrVarStore VSObj;\r
5198\r
5199 VSObj.SetLineNo (LineNo);\r
5200 mCVfrDataStorage.DeclareBufferVarStore (\r
5201 TypeNameList[Index],\r
5202 &mFormsetGuid,\r
5203 &gCVfrVarDataTypeDB,\r
5204 TypeNameList[Index],\r
5205 EFI_VARSTORE_ID_INVALID\r
5206 );\r
4afd3d04 5207 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
30fdf114
LG
5208 VSObj.SetVarStoreId (VarStoreId);\r
5209 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
52302d4d 5210 VSObj.SetSize ((UINT16) Size);\r
30fdf114
LG
5211 VSObj.SetName (TypeNameList[Index]);\r
5212 VSObj.SetGuid (&mFormsetGuid);\r
5213 }\r
5214\r
5215//\r
5216// not required to declare Date and Time VarStore,\r
5217// because code to support old format Data and Time\r
5218//\r
52302d4d 5219 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {\r
30fdf114
LG
5220 UINT32 Size;\r
5221 EFI_VARSTORE_ID VarStoreId;\r
5222 CIfrVarStore VSObj;\r
5223\r
5224 VSObj.SetLineNo (LineNo);\r
5225 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 5226 (CHAR8 *) DateName,\r
30fdf114
LG
5227 &mFormsetGuid,\r
5228 &gCVfrVarDataTypeDB,\r
52302d4d 5229 (CHAR8 *) DateType,\r
30fdf114
LG
5230 EFI_VARSTORE_ID_INVALID\r
5231 );\r
4afd3d04 5232 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
30fdf114 5233 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
5234 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
5235 VSObj.SetSize ((UINT16) Size);\r
5236 VSObj.SetName ((CHAR8 *) DateName);\r
30fdf114
LG
5237 VSObj.SetGuid (&mFormsetGuid);\r
5238 }\r
5239\r
52302d4d 5240 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {\r
30fdf114
LG
5241 UINT32 Size;\r
5242 EFI_VARSTORE_ID VarStoreId;\r
5243 CIfrVarStore VSObj;\r
5244\r
5245 VSObj.SetLineNo (LineNo);\r
5246 mCVfrDataStorage.DeclareBufferVarStore (\r
52302d4d 5247 (CHAR8 *) TimeName,\r
30fdf114
LG
5248 &mFormsetGuid,\r
5249 &gCVfrVarDataTypeDB,\r
52302d4d 5250 (CHAR8 *) TimeType,\r
30fdf114
LG
5251 EFI_VARSTORE_ID_INVALID\r
5252 );\r
4afd3d04 5253 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
30fdf114 5254 VSObj.SetVarStoreId (VarStoreId);\r
52302d4d
LG
5255 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
5256 VSObj.SetSize ((UINT16) Size);\r
5257 VSObj.SetName ((CHAR8 *) TimeName);\r
30fdf114
LG
5258 VSObj.SetGuid (&mFormsetGuid);\r
5259 }\r
5260}\r
5261\r
5262VOID\r
5263EfiVfrParser::_DeclareStandardDefaultStorage (\r
5264 IN UINT32 LineNo\r
5265 )\r
5266{\r
5267 //\r
5268 // Default Store is declared.\r
5269 //\r
5270 CIfrDefaultStore DSObj;\r
5271\r
52302d4d 5272 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
30fdf114
LG
5273 DSObj.SetLineNo (LineNo);\r
5274 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
5275 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
5276\r
5277 //\r
5278 // Default MANUFACTURING Store is declared.\r
5279 //\r
5280 CIfrDefaultStore DSObjMF;\r
5281\r
52302d4d 5282 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
30fdf114
LG
5283 DSObjMF.SetLineNo (LineNo);\r
5284 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
5285 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
5286}\r
5287\r
5288VOID\r
5289EfiVfrParser::AssignQuestionKey (\r
5290 IN CIfrQuestionHeader &QHObj,\r
5291 IN ANTLRTokenPtr KeyTok\r
5292 )\r
5293{\r
5294 UINT16 KeyValue;\r
5295\r
5296 if (KeyTok == NULL) {\r
5297 return;\r
5298 }\r
5299\r
e4ac870f 5300 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());\r
30fdf114
LG
5301\r
5302 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
5303 /*\r
5304 * if the question is not CALLBACK ignore the key.\r
5305 */\r
5306 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
5307 QHObj.SetQuestionId (KeyValue);\r
5308 }\r
5309}\r
5310\r
5311VOID\r
5312EfiVfrParser::ConvertIdExpr (\r
5313 IN UINT32 &ExpOpCount,\r
5314 IN UINT32 LineNo,\r
5315 IN EFI_QUESTION_ID QId,\r
5316 IN CHAR8 *VarIdStr,\r
5317 IN UINT32 BitMask\r
5318 )\r
5319{\r
5320 CIfrQuestionRef1 QR1Obj(LineNo);\r
5321 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
5322 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
5323\r
5324 if (BitMask != 0) {\r
5325 CIfrUint32 U32Obj(LineNo);\r
5326 U32Obj.SetValue (BitMask);\r
5327\r
5328 CIfrBitWiseAnd BWAObj(LineNo);\r
5329\r
5330 CIfrUint8 U8Obj(LineNo);\r
5331 switch (BitMask) {\r
5332 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;\r
5333 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
5334 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;\r
5335 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;\r
5336 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
5337 }\r
5338\r
5339 CIfrShiftRight SRObj(LineNo);\r
5340 }\r
5341\r
5342 ExpOpCount += 4;\r
5343}\r
5344\r
5345VOID\r
5346EfiVfrParser::IdEqValDoSpecial (\r
5347 IN UINT32 &ExpOpCount,\r
5348 IN UINT32 LineNo,\r
5349 IN EFI_QUESTION_ID QId,\r
5350 IN CHAR8 *VarIdStr,\r
5351 IN UINT32 BitMask,\r
5352 IN UINT16 ConstVal,\r
5353 IN EFI_COMPARE_TYPE CompareType\r
5354 )\r
5355{\r
5356 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
5357\r
5358 if (ConstVal > 0xFF) {\r
5359 CIfrUint16 U16Obj(LineNo);\r
5360 U16Obj.SetValue (ConstVal);\r
5361 } else {\r
5362 CIfrUint8 U8Obj(LineNo);\r
5363 U8Obj.SetValue ((UINT8)ConstVal);\r
5364 }\r
5365\r
5366 switch (CompareType) {\r
5367 case EQUAL :\r
5368 {\r
5369 CIfrEqual EObj(LineNo);\r
5370 break;\r
5371 }\r
5372 case LESS_EQUAL :\r
5373 {\r
5374 CIfrLessEqual LEObj(LineNo);\r
5375 break;\r
5376 }\r
5377 case LESS_THAN :\r
5378 {\r
5379 CIfrLessThan LTObj(LineNo);\r
5380 break;\r
5381 }\r
5382 case GREATER_EQUAL :\r
5383 {\r
5384 CIfrGreaterEqual GEObj(LineNo);\r
5385 break;\r
5386 }\r
5387 case GREATER_THAN :\r
5388 {\r
5389 CIfrGreaterThan GTObj(LineNo);\r
5390 break;\r
5391 }\r
5392 }\r
5393\r
5394 ExpOpCount += 2;\r
5395}\r
5396\r
5397VOID\r
5398EfiVfrParser::IdEqIdDoSpecial (\r
5399 IN UINT32 &ExpOpCount,\r
5400 IN UINT32 LineNo,\r
5401 IN EFI_QUESTION_ID QId1,\r
5402 IN CHAR8 *VarId1Str,\r
5403 IN UINT32 BitMask1,\r
5404 IN EFI_QUESTION_ID QId2,\r
5405 IN CHAR8 *VarId2Str,\r
5406 IN UINT32 BitMask2,\r
5407 IN EFI_COMPARE_TYPE CompareType\r
5408 )\r
5409{\r
5410 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
5411 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
5412\r
5413 switch (CompareType) {\r
5414 case EQUAL :\r
5415 {\r
5416 CIfrEqual EObj(LineNo);\r
5417 break;\r
5418 }\r
5419 case LESS_EQUAL :\r
5420 {\r
5421 CIfrLessEqual LEObj(LineNo);\r
5422 break;\r
5423 }\r
5424 case LESS_THAN :\r
5425 {\r
5426 CIfrLessThan LTObj(LineNo);\r
5427 break;\r
5428 }\r
5429 case GREATER_EQUAL :\r
5430 {\r
5431 CIfrGreaterEqual GEObj(LineNo);\r
5432 break;\r
5433 }\r
5434 case GREATER_THAN :\r
5435 {\r
5436 CIfrGreaterThan GTObj(LineNo);\r
5437 break;\r
5438 }\r
5439 }\r
5440\r
5441 ExpOpCount++;\r
5442}\r
5443\r
5444VOID\r
5445EfiVfrParser::IdEqListDoSpecial (\r
5446 IN UINT32 &ExpOpCount,\r
5447 IN UINT32 LineNo,\r
5448 IN EFI_QUESTION_ID QId,\r
5449 IN CHAR8 *VarIdStr,\r
5450 IN UINT32 BitMask,\r
5451 IN UINT16 ListLen,\r
5452 IN UINT16 *ValueList\r
5453 )\r
5454{\r
5455 UINT16 Index;\r
5456\r
5457 if (ListLen == 0) {\r
5458 return;\r
5459 }\r
5460\r
5461 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
5462 for (Index = 1; Index < ListLen; Index++) {\r
5463 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
5464 CIfrOr OObj (LineNo);\r
5465 ExpOpCount++;\r
5466 }\r
5467}\r
5468\r
4234283c
LG
5469VOID \r
5470EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)\r
5471{\r
5472 mOverrideClassGuid = OverrideClassGuid;\r
5473}\r
5474\r
30fdf114
LG
5475//\r
5476// For framework vfr compatibility\r
5477//\r
5478VOID\r
5479EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)\r
5480{\r
5481 mCompatibleMode = Mode;\r
5482 mCVfrQuestionDB.SetCompatibleMode (Mode);\r
5483}\r
4afd3d04
LG
5484\r
5485VOID\r
5486EfiVfrParser::CheckDuplicateDefaultValue (\r
5487 IN EFI_DEFAULT_ID DefaultId,\r
5488 IN ANTLRTokenPtr Tok\r
5489 )\r
5490{\r
5491 UINT16 Index;\r
5492\r
5493 for(Index = 0; Index < mUsedDefaultCount; Index++) {\r
5494 if (mUsedDefaultArray[Index] == DefaultId) {\r
5495 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());\r
5496 }\r
5497 }\r
5498\r
5499 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {\r
5500 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());\r
5501 }\r
5502\r
5503 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;\r
5504}\r
30fdf114 5505>>\r