| ## @file | |
| # This file is used to define class objects of INF file [Guids] section. | |
| # It will consumed by InfParser. | |
| # | |
| # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> | |
| # | |
| # SPDX-License-Identifier: BSD-2-Clause-Patent | |
| ''' | |
| InfGuidObject | |
| ''' | |
| from Library.ParserValidate import IsValidCVariableName | |
| from Library.CommentParsing import ParseComment | |
| from Library.ExpressionValidate import IsValidFeatureFlagExp | |
| from Library.Misc import Sdict | |
| from Library import DataType as DT | |
| import Logger.Log as Logger | |
| from Logger import ToolError | |
| from Logger import StringTable as ST | |
| class InfGuidItemCommentContent(): | |
| def __init__(self): | |
| # | |
| # ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation" | |
| # TailString. | |
| # | |
| # | |
| # SOMETIMES_CONSUMES | |
| # | |
| self.UsageItem = '' | |
| # | |
| # Variable | |
| # | |
| self.GuidTypeItem = '' | |
| # | |
| # MemoryTypeInformation | |
| # | |
| self.VariableNameItem = '' | |
| # | |
| # TailString | |
| # | |
| self.HelpStringItem = '' | |
| def SetUsageItem(self, UsageItem): | |
| self.UsageItem = UsageItem | |
| def GetUsageItem(self): | |
| return self.UsageItem | |
| def SetGuidTypeItem(self, GuidTypeItem): | |
| self.GuidTypeItem = GuidTypeItem | |
| def GetGuidTypeItem(self): | |
| return self.GuidTypeItem | |
| def SetVariableNameItem(self, VariableNameItem): | |
| self.VariableNameItem = VariableNameItem | |
| def GetVariableNameItem(self): | |
| return self.VariableNameItem | |
| def SetHelpStringItem(self, HelpStringItem): | |
| self.HelpStringItem = HelpStringItem | |
| def GetHelpStringItem(self): | |
| return self.HelpStringItem | |
| class InfGuidItem(): | |
| def __init__(self): | |
| self.Name = '' | |
| self.FeatureFlagExp = '' | |
| # | |
| # A list contain instance of InfGuidItemCommentContent | |
| # | |
| self.CommentList = [] | |
| self.SupArchList = [] | |
| def SetName(self, Name): | |
| self.Name = Name | |
| def GetName(self): | |
| return self.Name | |
| def SetFeatureFlagExp(self, FeatureFlagExp): | |
| self.FeatureFlagExp = FeatureFlagExp | |
| def GetFeatureFlagExp(self): | |
| return self.FeatureFlagExp | |
| def SetCommentList(self, CommentList): | |
| self.CommentList = CommentList | |
| def GetCommentList(self): | |
| return self.CommentList | |
| def SetSupArchList(self, SupArchList): | |
| self.SupArchList = SupArchList | |
| def GetSupArchList(self): | |
| return self.SupArchList | |
| ## ParseComment | |
| # | |
| # ParseComment | |
| # | |
| def ParseGuidComment(CommentsList, InfGuidItemObj): | |
| # | |
| # Get/Set Usage and HelpString | |
| # | |
| if CommentsList is not None and len(CommentsList) != 0 : | |
| CommentInsList = [] | |
| PreUsage = None | |
| PreGuidType = None | |
| PreHelpText = '' | |
| BlockFlag = -1 | |
| Count = 0 | |
| for CommentItem in CommentsList: | |
| Count = Count + 1 | |
| CommentItemUsage, \ | |
| CommentItemGuidType, \ | |
| CommentItemVarString, \ | |
| CommentItemHelpText = \ | |
| ParseComment(CommentItem, | |
| DT.ALL_USAGE_TOKENS, | |
| DT.GUID_TYPE_TOKENS, | |
| [], | |
| True) | |
| if CommentItemHelpText is None: | |
| CommentItemHelpText = '' | |
| if Count == len(CommentsList) and CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED: | |
| CommentItemHelpText = DT.END_OF_LINE | |
| if Count == len(CommentsList): | |
| if BlockFlag == 1 or BlockFlag == 2: | |
| if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED: | |
| BlockFlag = 4 | |
| else: | |
| BlockFlag = 3 | |
| if BlockFlag == -1: | |
| BlockFlag = 4 | |
| if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2: | |
| if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED: | |
| if BlockFlag == -1: | |
| BlockFlag = 1 | |
| elif BlockFlag == 1: | |
| BlockFlag = 2 | |
| else: | |
| if BlockFlag == 1 or BlockFlag == 2: | |
| BlockFlag = 3 | |
| elif BlockFlag == -1: | |
| BlockFlag = 4 | |
| # | |
| # Combine two comment line if they are generic comment | |
| # | |
| if CommentItemUsage == CommentItemGuidType == PreUsage == PreGuidType == DT.ITEM_UNDEFINED: | |
| CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText | |
| PreHelpText = CommentItemHelpText | |
| if BlockFlag == 4: | |
| CommentItemIns = InfGuidItemCommentContent() | |
| CommentItemIns.SetUsageItem(CommentItemUsage) | |
| CommentItemIns.SetGuidTypeItem(CommentItemGuidType) | |
| CommentItemIns.SetVariableNameItem(CommentItemVarString) | |
| if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE): | |
| CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE) | |
| CommentItemIns.SetHelpStringItem(CommentItemHelpText) | |
| CommentInsList.append(CommentItemIns) | |
| BlockFlag = -1 | |
| PreUsage = None | |
| PreGuidType = None | |
| PreHelpText = '' | |
| elif BlockFlag == 3: | |
| # | |
| # Add previous help string | |
| # | |
| CommentItemIns = InfGuidItemCommentContent() | |
| CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED) | |
| CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED) | |
| if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE): | |
| PreHelpText = PreHelpText.strip(DT.END_OF_LINE) | |
| CommentItemIns.SetHelpStringItem(PreHelpText) | |
| CommentInsList.append(CommentItemIns) | |
| # | |
| # Add Current help string | |
| # | |
| CommentItemIns = InfGuidItemCommentContent() | |
| CommentItemIns.SetUsageItem(CommentItemUsage) | |
| CommentItemIns.SetGuidTypeItem(CommentItemGuidType) | |
| CommentItemIns.SetVariableNameItem(CommentItemVarString) | |
| if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE): | |
| CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE) | |
| CommentItemIns.SetHelpStringItem(CommentItemHelpText) | |
| CommentInsList.append(CommentItemIns) | |
| BlockFlag = -1 | |
| PreUsage = None | |
| PreGuidType = None | |
| PreHelpText = '' | |
| else: | |
| PreUsage = CommentItemUsage | |
| PreGuidType = CommentItemGuidType | |
| PreHelpText = CommentItemHelpText | |
| InfGuidItemObj.SetCommentList(CommentInsList) | |
| else: | |
| # | |
| # Still need to set the USAGE/GUIDTYPE to undefined. | |
| # | |
| CommentItemIns = InfGuidItemCommentContent() | |
| CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED) | |
| CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED) | |
| InfGuidItemObj.SetCommentList([CommentItemIns]) | |
| return InfGuidItemObj | |
| ## InfGuidObject | |
| # | |
| # InfGuidObject | |
| # | |
| class InfGuidObject(): | |
| def __init__(self): | |
| self.Guids = Sdict() | |
| # | |
| # Macro defined in this section should be only used in this section. | |
| # | |
| self.Macros = {} | |
| def SetGuid(self, GuidList, Arch = None): | |
| __SupportArchList = [] | |
| for ArchItem in Arch: | |
| # | |
| # Validate Arch | |
| # | |
| if (ArchItem == '' or ArchItem is None): | |
| ArchItem = 'COMMON' | |
| __SupportArchList.append(ArchItem) | |
| for Item in GuidList: | |
| # | |
| # Get Comment content of this protocol | |
| # | |
| CommentsList = None | |
| if len(Item) == 3: | |
| CommentsList = Item[1] | |
| CurrentLineOfItem = Item[2] | |
| Item = Item[0] | |
| InfGuidItemObj = InfGuidItem() | |
| if len(Item) >= 1 and len(Item) <= 2: | |
| # | |
| # Only GuildName contained | |
| # | |
| if not IsValidCVariableName(Item[0]): | |
| Logger.Error("InfParser", | |
| ToolError.FORMAT_INVALID, | |
| ST.ERR_INF_PARSER_INVALID_CNAME%(Item[0]), | |
| File=CurrentLineOfItem[2], | |
| Line=CurrentLineOfItem[1], | |
| ExtraData=CurrentLineOfItem[0]) | |
| if (Item[0] != ''): | |
| InfGuidItemObj.SetName(Item[0]) | |
| else: | |
| Logger.Error("InfParser", | |
| ToolError.FORMAT_INVALID, | |
| ST.ERR_INF_PARSER_CNAME_MISSING, | |
| File=CurrentLineOfItem[2], | |
| Line=CurrentLineOfItem[1], | |
| ExtraData=CurrentLineOfItem[0]) | |
| if len(Item) == 2: | |
| # | |
| # Contained CName and Feature Flag Express | |
| # <statements> ::= <CName> ["|" <FeatureFlagExpress>] | |
| # For GUID entry. | |
| # | |
| if Item[1].strip() == '': | |
| Logger.Error("InfParser", | |
| ToolError.FORMAT_INVALID, | |
| ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING, | |
| File=CurrentLineOfItem[2], | |
| Line=CurrentLineOfItem[1], | |
| ExtraData=CurrentLineOfItem[0]) | |
| # | |
| # Validate Feature Flag Express | |
| # | |
| FeatureFlagRtv = IsValidFeatureFlagExp(Item[1].strip()) | |
| if not FeatureFlagRtv[0]: | |
| Logger.Error("InfParser", | |
| ToolError.FORMAT_INVALID, | |
| ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]), | |
| File=CurrentLineOfItem[2], | |
| Line=CurrentLineOfItem[1], | |
| ExtraData=CurrentLineOfItem[0]) | |
| InfGuidItemObj.SetFeatureFlagExp(Item[1]) | |
| if len(Item) != 1 and len(Item) != 2: | |
| # | |
| # Invalid format of GUID statement | |
| # | |
| Logger.Error("InfParser", | |
| ToolError.FORMAT_INVALID, | |
| ST.ERR_INF_PARSER_GUID_PPI_PROTOCOL_SECTION_CONTENT_ERROR, | |
| File=CurrentLineOfItem[2], | |
| Line=CurrentLineOfItem[1], | |
| ExtraData=CurrentLineOfItem[0]) | |
| InfGuidItemObj = ParseGuidComment(CommentsList, InfGuidItemObj) | |
| InfGuidItemObj.SetSupArchList(__SupportArchList) | |
| # | |
| # Determine GUID name duplicate. Follow below rule: | |
| # | |
| # A GUID must not be duplicated within a [Guids] section. | |
| # A GUID may appear in multiple architectural [Guids] | |
| # sections. A GUID listed in an architectural [Guids] | |
| # section must not be listed in the common architectural | |
| # [Guids] section. | |
| # | |
| # NOTE: This check will not report error now. | |
| # | |
| for Item in self.Guids: | |
| if Item.GetName() == InfGuidItemObj.GetName(): | |
| ItemSupArchList = Item.GetSupArchList() | |
| for ItemArch in ItemSupArchList: | |
| for GuidItemObjArch in __SupportArchList: | |
| if ItemArch == GuidItemObjArch: | |
| # | |
| # ST.ERR_INF_PARSER_ITEM_DUPLICATE | |
| # | |
| pass | |
| if ItemArch.upper() == 'COMMON' or GuidItemObjArch.upper() == 'COMMON': | |
| # | |
| # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON | |
| # | |
| pass | |
| if (InfGuidItemObj) in self.Guids: | |
| GuidList = self.Guids[InfGuidItemObj] | |
| GuidList.append(InfGuidItemObj) | |
| self.Guids[InfGuidItemObj] = GuidList | |
| else: | |
| GuidList = [] | |
| GuidList.append(InfGuidItemObj) | |
| self.Guids[InfGuidItemObj] = GuidList | |
| return True | |
| def GetGuid(self): | |
| return self.Guids |