From 4234283c3acb8c35014acc1546621fbc2621b095 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Fri, 26 Aug 2011 07:46:26 +0000 Subject: Sync BaseTools Branch (version r2271) to EDKII main trunk. BaseTool Branch: https://edk2-buildtools.svn.sourceforge.net/svnroot/edk2-buildtools/branches/Releases/BaseTools_r2100 Signed-off-by: lgao4 Reviewed-by: hchen30 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12214 6f19259b-4bc3-4df7-8a09-765794883524 --- .../UPT/Parser/InfGuidPpiProtocolSectionParser.py | 382 +++++++++++++++++++++ 1 file changed, 382 insertions(+) create mode 100644 BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py (limited to 'BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py') diff --git a/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py b/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py new file mode 100644 index 0000000000..9c3d703ad1 --- /dev/null +++ b/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py @@ -0,0 +1,382 @@ +## @file +# This file contained the parser for [Guids], [Ppis], [Protocols] sections in INF file +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +''' +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 != 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 != 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] + LineNo = Line[1] + + if LineContent.strip() == '': + continue + # + # Replace with [Defines] section Macro + # + LineContent = InfExpandMacro(LineContent, + (FileName, LineContent, LineNo), + self.FileLocalMacros, + None) + + 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 != 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 v1.2.3