From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001 From: Angelos Mouzakitis Date: Tue, 10 Oct 2023 14:33:42 +0000 Subject: Add submodule dependency files Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec --- .../UPT/Parser/InfGuidPpiProtocolSectionParser.py | 368 +++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 roms/edk2/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py (limited to 'roms/edk2/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py') diff --git a/roms/edk2/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py b/roms/edk2/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py new file mode 100644 index 000000000..9b83c0473 --- /dev/null +++ b/roms/edk2/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py @@ -0,0 +1,368 @@ +## @file +# This file contained the parser for [Guids], [Ppis], [Protocols] sections in INF file +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +''' +InfGuidPpiProtocolSectionParser +''' +## +# Import Modules +# + +import Logger.Log as Logger +from Logger import StringTable as ST +from Logger.ToolError import FORMAT_INVALID +from Parser.InfParserMisc import InfExpandMacro +from Library import DataType as DT +from Library import GlobalData +from Library.Parsing import MacroParser +from Library.Misc import GetSplitValueList +from Library.ParserValidate import IsValidIdString +from Library.ParserValidate import IsValidUserId +from Library.ParserValidate import IsValidArch +from Parser.InfParserMisc import InfParserSectionRoot + +class InfGuidPpiProtocolSectionParser(InfParserSectionRoot): + ## InfGuidParser + # + # + def InfGuidParser(self, SectionString, InfSectionObject, FileName): + # + # Macro defined in this section + # + SectionMacros = {} + ValueList = [] + GuidList = [] + CommentsList = [] + CurrentLineVar = None + # + # Parse section content + # + for Line in SectionString: + LineContent = Line[0] + LineNo = Line[1] + + if LineContent.strip() == '': + CommentsList = [] + continue + + if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): + CommentsList.append(Line) + continue + else: + # + # Encounter a GUID entry + # + if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1: + CommentsList.append(( + LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):], + LineNo)) + LineContent = \ + LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)] + + if LineContent != '': + # + # Find Macro + # + Name, Value = MacroParser((LineContent, LineNo), + FileName, + DT.MODEL_EFI_GUID, + self.FileLocalMacros) + if Name is not None: + SectionMacros[Name] = Value + CommentsList = [] + ValueList = [] + continue + + TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1) + ValueList[0:len(TokenList)] = TokenList + + # + # Replace with Local section Macro and [Defines] section Macro. + # + ValueList = [InfExpandMacro(Value, (FileName, LineContent, LineNo), + self.FileLocalMacros, SectionMacros, True) + for Value in ValueList] + + CurrentLineVar = (LineContent, LineNo, FileName) + + + if len(ValueList) >= 1: + GuidList.append((ValueList, CommentsList, CurrentLineVar)) + CommentsList = [] + ValueList = [] + continue + + # + # Current section archs + # + ArchList = [] + LineIndex = -1 + for Item in self.LastSectionHeaderContent: + LineIndex = Item[3] + if Item[1] not in ArchList: + ArchList.append(Item[1]) + + if not InfSectionObject.SetGuid(GuidList, Arch=ArchList): + Logger.Error('InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Guid]"), + File=FileName, + Line=LineIndex) + + ## InfPpiParser + # + # + def InfPpiParser(self, SectionString, InfSectionObject, FileName): + # + # Macro defined in this section + # + SectionMacros = {} + ValueList = [] + PpiList = [] + CommentsList = [] + CurrentLineVar = None + # + # Parse section content + # + for Line in SectionString: + LineContent = Line[0] + LineNo = Line[1] + + if LineContent.strip() == '': + CommentsList = [] + continue + + if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): + CommentsList.append(Line) + continue + else: + # + # Encounter a PPI entry + # + if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1: + CommentsList.append(( + LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):], + LineNo)) + LineContent = \ + LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)] + + if LineContent != '': + # + # Find Macro + # + Name, Value = MacroParser((LineContent, LineNo), + FileName, + DT.MODEL_EFI_PPI, + self.FileLocalMacros) + if Name is not None: + SectionMacros[Name] = Value + ValueList = [] + CommentsList = [] + continue + + TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1) + ValueList[0:len(TokenList)] = TokenList + + # + # Replace with Local section Macro and [Defines] section Macro. + # + ValueList = [InfExpandMacro(Value, (FileName, LineContent, LineNo), self.FileLocalMacros, SectionMacros) + for Value in ValueList] + + CurrentLineVar = (LineContent, LineNo, FileName) + + if len(ValueList) >= 1: + PpiList.append((ValueList, CommentsList, CurrentLineVar)) + ValueList = [] + CommentsList = [] + continue + + # + # Current section archs + # + ArchList = [] + LineIndex = -1 + for Item in self.LastSectionHeaderContent: + LineIndex = Item[3] + if Item[1] not in ArchList: + ArchList.append(Item[1]) + + if not InfSectionObject.SetPpi(PpiList, Arch=ArchList): + Logger.Error('InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Ppis]"), + File=FileName, + Line=LineIndex) + + ## InfUserExtensionParser + # + # + def InfUserExtensionParser(self, SectionString, InfSectionObject, FileName): + + UserExtensionContent = '' + + # + # Parse section content + # + for Line in SectionString: + LineContent = Line[0] + +# Comment the code to support user extension without any statement just the section header in [] +# if LineContent.strip() == '': +# continue + + UserExtensionContent += LineContent + DT.END_OF_LINE + continue + + # + # Current section UserId, IdString + # + IdContentList = [] + LastItem = '' + SectionLineNo = None + for Item in self.LastSectionHeaderContent: + UserId = Item[1] + IdString = Item[2] + Arch = Item[3] + SectionLineNo = Item[4] + if not IsValidArch(Arch): + Logger.Error( + 'InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (Arch), + File=GlobalData.gINF_MODULE_NAME, + Line=SectionLineNo, + ExtraData=None) + + if (UserId, IdString, Arch) not in IdContentList: + # + # To check the UserId and IdString valid or not. + # + if not IsValidUserId(UserId): + Logger.Error('InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_UE_SECTION_USER_ID_ERROR % (Item[1]), + File=GlobalData.gINF_MODULE_NAME, + Line=SectionLineNo, + ExtraData=None) + + if not IsValidIdString(IdString): + Logger.Error('InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_UE_SECTION_ID_STRING_ERROR % (IdString), + File=GlobalData.gINF_MODULE_NAME, Line=SectionLineNo, + ExtraData=None) + IdContentList.append((UserId, IdString, Arch)) + else: + # + # Each UserExtensions section header must have a unique set + # of UserId, IdString and Arch values. + # This means that the same UserId can be used in more than one + # section header, provided the IdString or Arch values are + # different. The same IdString values can be used in more than + # one section header if the UserId or Arch values are + # different. The same UserId and the same IdString can be used + # in a section header if the Arch values are different in each + # of the section headers. + # + Logger.Error('InfParser', + FORMAT_INVALID, + ST.ERR_INF_PARSER_UE_SECTION_DUPLICATE_ERROR % ( + IdString), + File=GlobalData.gINF_MODULE_NAME, + Line=SectionLineNo, + ExtraData=None) + LastItem = Item + + if not InfSectionObject.SetUserExtension(UserExtensionContent, + IdContent=IdContentList, + LineNo=SectionLineNo): + Logger.Error\ + ('InfParser', FORMAT_INVALID, \ + ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[UserExtension]"), \ + File=FileName, Line=LastItem[4]) + + def InfProtocolParser(self, SectionString, InfSectionObject, FileName): + # + # Macro defined in this section + # + SectionMacros = {} + ValueList = [] + ProtocolList = [] + CommentsList = [] + CurrentLineVar = None + # + # Parse section content + # + for Line in SectionString: + LineContent = Line[0] + LineNo = Line[1] + + if LineContent.strip() == '': + CommentsList = [] + continue + + if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): + CommentsList.append(Line) + continue + else: + # + # Encounter a Protocol entry + # + if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1: + CommentsList.append(( + LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):], + LineNo)) + LineContent = \ + LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)] + + if LineContent != '': + # + # Find Macro + # + Name, Value = MacroParser((LineContent, LineNo), + FileName, + DT.MODEL_EFI_PROTOCOL, + self.FileLocalMacros) + if Name is not None: + SectionMacros[Name] = Value + ValueList = [] + CommentsList = [] + continue + + TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1) + ValueList[0:len(TokenList)] = TokenList + + # + # Replace with Local section Macro and [Defines] section Macro. + # + ValueList = [InfExpandMacro(Value, (FileName, LineContent, LineNo), self.FileLocalMacros, SectionMacros) + for Value in ValueList] + + CurrentLineVar = (LineContent, LineNo, FileName) + + if len(ValueList) >= 1: + ProtocolList.append((ValueList, CommentsList, CurrentLineVar)) + ValueList = [] + CommentsList = [] + continue + + # + # Current section archs + # + ArchList = [] + LineIndex = -1 + for Item in self.LastSectionHeaderContent: + LineIndex = Item[3] + if Item[1] not in ArchList: + ArchList.append(Item[1]) + + if not InfSectionObject.SetProtocol(ProtocolList, Arch=ArchList): + Logger.Error\ + ('InfParser', FORMAT_INVALID, \ + ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Protocol]"), \ + File=FileName, Line=LineIndex) -- cgit