]>
Commit | Line | Data |
---|---|---|
4234283c | 1 | ## @file\r |
f7496d71 LG |
2 | # This file is used to define class objects of INF file [Guids] section.\r |
3 | # It will consumed by InfParser.\r | |
4234283c | 4 | #\r |
f7496d71 | 5 | # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r |
4234283c | 6 | #\r |
f7496d71 LG |
7 | # This program and the accompanying materials are licensed and made available\r |
8 | # under the terms and conditions of the BSD License which accompanies this\r | |
9 | # distribution. The full text of the license may be found at\r | |
4234283c LG |
10 | # http://opensource.org/licenses/bsd-license.php\r |
11 | #\r | |
12 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
13 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
14 | \r | |
15 | '''\r | |
16 | InfGuidObject\r | |
17 | '''\r | |
18 | \r | |
19 | from Library.ParserValidate import IsValidCVariableName\r | |
20 | from Library.CommentParsing import ParseComment\r | |
f7496d71 LG |
21 | from Library.ExpressionValidate import IsValidFeatureFlagExp\r |
22 | \r | |
4234283c | 23 | from Library.Misc import Sdict\r |
f7496d71 | 24 | from Library import DataType as DT\r |
4234283c LG |
25 | import Logger.Log as Logger\r |
26 | from Logger import ToolError\r | |
27 | from Logger import StringTable as ST\r | |
28 | \r | |
29 | class InfGuidItemCommentContent():\r | |
30 | def __init__(self):\r | |
31 | #\r | |
f7496d71 | 32 | # ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"\r |
4234283c LG |
33 | # TailString.\r |
34 | #\r | |
35 | #\r | |
36 | # SOMETIMES_CONSUMES\r | |
37 | #\r | |
38 | self.UsageItem = ''\r | |
39 | #\r | |
40 | # Variable\r | |
41 | #\r | |
42 | self.GuidTypeItem = ''\r | |
43 | #\r | |
44 | # MemoryTypeInformation\r | |
45 | #\r | |
46 | self.VariableNameItem = ''\r | |
47 | #\r | |
48 | # TailString\r | |
49 | #\r | |
50 | self.HelpStringItem = ''\r | |
f7496d71 | 51 | \r |
4234283c LG |
52 | def SetUsageItem(self, UsageItem):\r |
53 | self.UsageItem = UsageItem\r | |
54 | def GetUsageItem(self):\r | |
55 | return self.UsageItem\r | |
f7496d71 | 56 | \r |
4234283c LG |
57 | def SetGuidTypeItem(self, GuidTypeItem):\r |
58 | self.GuidTypeItem = GuidTypeItem\r | |
59 | def GetGuidTypeItem(self):\r | |
60 | return self.GuidTypeItem\r | |
f7496d71 | 61 | \r |
4234283c LG |
62 | def SetVariableNameItem(self, VariableNameItem):\r |
63 | self.VariableNameItem = VariableNameItem\r | |
64 | def GetVariableNameItem(self):\r | |
65 | return self.VariableNameItem\r | |
f7496d71 | 66 | \r |
4234283c LG |
67 | def SetHelpStringItem(self, HelpStringItem):\r |
68 | self.HelpStringItem = HelpStringItem\r | |
69 | def GetHelpStringItem(self):\r | |
70 | return self.HelpStringItem\r | |
f7496d71 | 71 | \r |
4234283c LG |
72 | class InfGuidItem():\r |
73 | def __init__(self):\r | |
74 | self.Name = ''\r | |
75 | self.FeatureFlagExp = ''\r | |
76 | #\r | |
77 | # A list contain instance of InfGuidItemCommentContent\r | |
78 | #\r | |
79 | self.CommentList = []\r | |
80 | self.SupArchList = []\r | |
f7496d71 | 81 | \r |
4234283c LG |
82 | def SetName(self, Name):\r |
83 | self.Name = Name\r | |
84 | def GetName(self):\r | |
85 | return self.Name\r | |
f7496d71 | 86 | \r |
4234283c LG |
87 | def SetFeatureFlagExp(self, FeatureFlagExp):\r |
88 | self.FeatureFlagExp = FeatureFlagExp\r | |
89 | def GetFeatureFlagExp(self):\r | |
90 | return self.FeatureFlagExp\r | |
f7496d71 | 91 | \r |
4234283c LG |
92 | def SetCommentList(self, CommentList):\r |
93 | self.CommentList = CommentList\r | |
94 | def GetCommentList(self):\r | |
95 | return self.CommentList\r | |
f7496d71 | 96 | \r |
4234283c LG |
97 | def SetSupArchList(self, SupArchList):\r |
98 | self.SupArchList = SupArchList\r | |
99 | def GetSupArchList(self):\r | |
100 | return self.SupArchList\r | |
101 | \r | |
102 | ## ParseComment\r | |
103 | #\r | |
104 | # ParseComment\r | |
105 | #\r | |
106 | def ParseGuidComment(CommentsList, InfGuidItemObj):\r | |
107 | #\r | |
108 | # Get/Set Usage and HelpString\r | |
109 | #\r | |
4231a819 | 110 | if CommentsList is not None and len(CommentsList) != 0 :\r |
4234283c LG |
111 | CommentInsList = []\r |
112 | PreUsage = None\r | |
113 | PreGuidType = None\r | |
114 | PreHelpText = ''\r | |
115 | BlockFlag = -1\r | |
116 | Count = 0\r | |
117 | for CommentItem in CommentsList:\r | |
118 | Count = Count + 1\r | |
119 | CommentItemUsage, \\r | |
120 | CommentItemGuidType, \\r | |
121 | CommentItemVarString, \\r | |
122 | CommentItemHelpText = \\r | |
f7496d71 LG |
123 | ParseComment(CommentItem,\r |
124 | DT.ALL_USAGE_TOKENS,\r | |
125 | DT.GUID_TYPE_TOKENS,\r | |
126 | [],\r | |
4234283c | 127 | True)\r |
f7496d71 | 128 | \r |
4231a819 | 129 | if CommentItemHelpText is None:\r |
4234283c LG |
130 | CommentItemHelpText = ''\r |
131 | if Count == len(CommentsList) and CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r | |
132 | CommentItemHelpText = DT.END_OF_LINE\r | |
f7496d71 | 133 | \r |
4234283c LG |
134 | if Count == len(CommentsList):\r |
135 | if BlockFlag == 1 or BlockFlag == 2:\r | |
136 | if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r | |
137 | BlockFlag = 4\r | |
138 | else:\r | |
139 | BlockFlag = 3\r | |
140 | if BlockFlag == -1:\r | |
f7496d71 | 141 | BlockFlag = 4\r |
4234283c LG |
142 | if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:\r |
143 | if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r | |
144 | if BlockFlag == -1:\r | |
145 | BlockFlag = 1\r | |
146 | elif BlockFlag == 1:\r | |
147 | BlockFlag = 2\r | |
148 | else:\r | |
149 | if BlockFlag == 1 or BlockFlag == 2:\r | |
150 | BlockFlag = 3\r | |
151 | elif BlockFlag == -1:\r | |
152 | BlockFlag = 4\r | |
f7496d71 | 153 | \r |
4234283c LG |
154 | #\r |
155 | # Combine two comment line if they are generic comment\r | |
f7496d71 | 156 | #\r |
4234283c LG |
157 | if CommentItemUsage == CommentItemGuidType == PreUsage == PreGuidType == DT.ITEM_UNDEFINED:\r |
158 | CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r | |
4234283c | 159 | PreHelpText = CommentItemHelpText\r |
f7496d71 LG |
160 | \r |
161 | if BlockFlag == 4:\r | |
4234283c LG |
162 | CommentItemIns = InfGuidItemCommentContent()\r |
163 | CommentItemIns.SetUsageItem(CommentItemUsage)\r | |
164 | CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r | |
165 | CommentItemIns.SetVariableNameItem(CommentItemVarString)\r | |
421ccda3 HC |
166 | if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE):\r |
167 | CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE)\r | |
4234283c LG |
168 | CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r |
169 | CommentInsList.append(CommentItemIns)\r | |
f7496d71 | 170 | \r |
4234283c LG |
171 | BlockFlag = -1\r |
172 | PreUsage = None\r | |
173 | PreGuidType = None\r | |
174 | PreHelpText = ''\r | |
f7496d71 | 175 | \r |
4234283c LG |
176 | elif BlockFlag == 3:\r |
177 | #\r | |
178 | # Add previous help string\r | |
f7496d71 | 179 | #\r |
4234283c LG |
180 | CommentItemIns = InfGuidItemCommentContent()\r |
181 | CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r | |
182 | CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED)\r | |
183 | if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r | |
421ccda3 | 184 | PreHelpText = PreHelpText.strip(DT.END_OF_LINE)\r |
4234283c LG |
185 | CommentItemIns.SetHelpStringItem(PreHelpText)\r |
186 | CommentInsList.append(CommentItemIns)\r | |
187 | #\r | |
188 | # Add Current help string\r | |
189 | #\r | |
190 | CommentItemIns = InfGuidItemCommentContent()\r | |
191 | CommentItemIns.SetUsageItem(CommentItemUsage)\r | |
192 | CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r | |
193 | CommentItemIns.SetVariableNameItem(CommentItemVarString)\r | |
421ccda3 HC |
194 | if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE):\r |
195 | CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE)\r | |
4234283c LG |
196 | CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r |
197 | CommentInsList.append(CommentItemIns)\r | |
f7496d71 | 198 | \r |
4234283c LG |
199 | BlockFlag = -1\r |
200 | PreUsage = None\r | |
201 | PreGuidType = None\r | |
f7496d71 LG |
202 | PreHelpText = ''\r |
203 | \r | |
4234283c LG |
204 | else:\r |
205 | PreUsage = CommentItemUsage\r | |
206 | PreGuidType = CommentItemGuidType\r | |
207 | PreHelpText = CommentItemHelpText\r | |
f7496d71 | 208 | \r |
4234283c LG |
209 | InfGuidItemObj.SetCommentList(CommentInsList)\r |
210 | else:\r | |
211 | #\r | |
212 | # Still need to set the USAGE/GUIDTYPE to undefined.\r | |
213 | #\r | |
214 | CommentItemIns = InfGuidItemCommentContent()\r | |
215 | CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r | |
216 | CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED)\r | |
217 | InfGuidItemObj.SetCommentList([CommentItemIns])\r | |
f7496d71 | 218 | \r |
4234283c LG |
219 | return InfGuidItemObj\r |
220 | \r | |
221 | ## InfGuidObject\r | |
222 | #\r | |
223 | # InfGuidObject\r | |
224 | #\r | |
225 | class InfGuidObject():\r | |
226 | def __init__(self):\r | |
227 | self.Guids = Sdict()\r | |
228 | #\r | |
229 | # Macro defined in this section should be only used in this section.\r | |
230 | #\r | |
231 | self.Macros = {}\r | |
f7496d71 | 232 | \r |
4234283c LG |
233 | def SetGuid(self, GuidList, Arch = None):\r |
234 | __SupportArchList = []\r | |
235 | for ArchItem in Arch:\r | |
236 | #\r | |
237 | # Validate Arch\r | |
f7496d71 | 238 | #\r |
4231a819 | 239 | if (ArchItem == '' or ArchItem is None):\r |
f7496d71 LG |
240 | ArchItem = 'COMMON'\r |
241 | \r | |
4234283c | 242 | __SupportArchList.append(ArchItem)\r |
f7496d71 | 243 | \r |
4234283c LG |
244 | for Item in GuidList:\r |
245 | #\r | |
246 | # Get Comment content of this protocol\r | |
247 | #\r | |
248 | CommentsList = None\r | |
249 | if len(Item) == 3:\r | |
250 | CommentsList = Item[1]\r | |
251 | CurrentLineOfItem = Item[2]\r | |
252 | Item = Item[0]\r | |
f7496d71 | 253 | InfGuidItemObj = InfGuidItem()\r |
4234283c LG |
254 | if len(Item) >= 1 and len(Item) <= 2:\r |
255 | #\r | |
256 | # Only GuildName contained\r | |
257 | #\r | |
258 | if not IsValidCVariableName(Item[0]):\r | |
f7496d71 LG |
259 | Logger.Error("InfParser",\r |
260 | ToolError.FORMAT_INVALID,\r | |
4234283c | 261 | ST.ERR_INF_PARSER_INVALID_CNAME%(Item[0]),\r |
f7496d71 LG |
262 | File=CurrentLineOfItem[2],\r |
263 | Line=CurrentLineOfItem[1],\r | |
4234283c LG |
264 | ExtraData=CurrentLineOfItem[0])\r |
265 | if (Item[0] != ''):\r | |
266 | InfGuidItemObj.SetName(Item[0])\r | |
267 | else:\r | |
f7496d71 LG |
268 | Logger.Error("InfParser",\r |
269 | ToolError.FORMAT_INVALID,\r | |
4234283c | 270 | ST.ERR_INF_PARSER_CNAME_MISSING,\r |
f7496d71 LG |
271 | File=CurrentLineOfItem[2],\r |
272 | Line=CurrentLineOfItem[1],\r | |
4234283c LG |
273 | ExtraData=CurrentLineOfItem[0])\r |
274 | if len(Item) == 2:\r | |
275 | #\r | |
276 | # Contained CName and Feature Flag Express\r | |
277 | # <statements> ::= <CName> ["|" <FeatureFlagExpress>]\r | |
f7496d71 | 278 | # For GUID entry.\r |
4234283c LG |
279 | #\r |
280 | if Item[1].strip() == '':\r | |
f7496d71 LG |
281 | Logger.Error("InfParser",\r |
282 | ToolError.FORMAT_INVALID,\r | |
4234283c | 283 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r |
f7496d71 LG |
284 | File=CurrentLineOfItem[2],\r |
285 | Line=CurrentLineOfItem[1],\r | |
4234283c LG |
286 | ExtraData=CurrentLineOfItem[0])\r |
287 | #\r | |
f7496d71 | 288 | # Validate Feature Flag Express\r |
4234283c LG |
289 | #\r |
290 | FeatureFlagRtv = IsValidFeatureFlagExp(Item[1].strip())\r | |
291 | if not FeatureFlagRtv[0]:\r | |
f7496d71 | 292 | Logger.Error("InfParser",\r |
4234283c LG |
293 | ToolError.FORMAT_INVALID,\r |
294 | ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r | |
f7496d71 LG |
295 | File=CurrentLineOfItem[2],\r |
296 | Line=CurrentLineOfItem[1],\r | |
4234283c LG |
297 | ExtraData=CurrentLineOfItem[0])\r |
298 | InfGuidItemObj.SetFeatureFlagExp(Item[1])\r | |
299 | if len(Item) != 1 and len(Item) != 2:\r | |
300 | #\r | |
f7496d71 | 301 | # Invalid format of GUID statement\r |
4234283c | 302 | #\r |
f7496d71 | 303 | Logger.Error("InfParser",\r |
4234283c LG |
304 | ToolError.FORMAT_INVALID,\r |
305 | ST.ERR_INF_PARSER_GUID_PPI_PROTOCOL_SECTION_CONTENT_ERROR,\r | |
f7496d71 LG |
306 | File=CurrentLineOfItem[2],\r |
307 | Line=CurrentLineOfItem[1],\r | |
4234283c | 308 | ExtraData=CurrentLineOfItem[0])\r |
f7496d71 | 309 | \r |
4234283c LG |
310 | InfGuidItemObj = ParseGuidComment(CommentsList, InfGuidItemObj)\r |
311 | InfGuidItemObj.SetSupArchList(__SupportArchList)\r | |
f7496d71 | 312 | \r |
4234283c LG |
313 | #\r |
314 | # Determine GUID name duplicate. Follow below rule:\r | |
315 | #\r | |
f7496d71 LG |
316 | # A GUID must not be duplicated within a [Guids] section.\r |
317 | # A GUID may appear in multiple architectural [Guids]\r | |
318 | # sections. A GUID listed in an architectural [Guids]\r | |
319 | # section must not be listed in the common architectural\r | |
4234283c | 320 | # [Guids] section.\r |
f7496d71 | 321 | #\r |
4234283c | 322 | # NOTE: This check will not report error now.\r |
f7496d71 | 323 | #\r |
4234283c LG |
324 | for Item in self.Guids:\r |
325 | if Item.GetName() == InfGuidItemObj.GetName():\r | |
326 | ItemSupArchList = Item.GetSupArchList()\r | |
327 | for ItemArch in ItemSupArchList:\r | |
328 | for GuidItemObjArch in __SupportArchList:\r | |
329 | if ItemArch == GuidItemObjArch:\r | |
330 | #\r | |
331 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r | |
332 | #\r | |
333 | pass\r | |
334 | \r | |
335 | if ItemArch.upper() == 'COMMON' or GuidItemObjArch.upper() == 'COMMON':\r | |
336 | #\r | |
337 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r | |
338 | #\r | |
339 | pass\r | |
f7496d71 | 340 | \r |
27c4ceb4 | 341 | if (InfGuidItemObj) in self.Guids:\r |
f7496d71 | 342 | GuidList = self.Guids[InfGuidItemObj]\r |
4234283c LG |
343 | GuidList.append(InfGuidItemObj)\r |
344 | self.Guids[InfGuidItemObj] = GuidList\r | |
345 | else:\r | |
346 | GuidList = []\r | |
347 | GuidList.append(InfGuidItemObj)\r | |
348 | self.Guids[InfGuidItemObj] = GuidList\r | |
f7496d71 | 349 | \r |
4234283c | 350 | return True\r |
f7496d71 | 351 | \r |
4234283c | 352 | def GetGuid(self):\r |
27c4ceb4 | 353 | return self.Guids\r |