]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py
BaseTools: Use absolute import in UPT
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfGuidObject.py
CommitLineData
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
16InfGuidObject\r
17'''\r
18\r
19from Library.ParserValidate import IsValidCVariableName\r
20from Library.CommentParsing import ParseComment\r
f7496d71
LG
21from Library.ExpressionValidate import IsValidFeatureFlagExp\r
22\r
4234283c 23from Library.Misc import Sdict\r
f7496d71 24from Library import DataType as DT\r
4234283c
LG
25import Logger.Log as Logger\r
26from Logger import ToolError\r
27from Logger import StringTable as ST\r
28\r
29class 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
72class 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
106def 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
225class 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