1 ## @file 2 # This file contained the parser for [Sources] sections in INF file 3 # 4 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> 5 # 6 # This program and the accompanying materials are licensed and made available 7 # under the terms and conditions of the BSD License which accompanies this 8 # distribution. The full text of the license may be found at 9 # http://opensource.org/licenses/bsd-license.php 10 # 11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 # 14 ''' 15 InfSourceSectionParser 16 ''' 17 ## 18 # Import Modules 19 # 20 21 import Logger.Log as Logger 22 from Logger import StringTable as ST 23 from Logger.ToolError import FORMAT_INVALID 24 from Parser.InfParserMisc import InfExpandMacro 25 from Library import DataType as DT 26 from Library.Parsing import MacroParser 27 from Library.Misc import GetSplitValueList 28 from Object.Parser.InfCommonObject import InfLineCommentObject 29 from Parser.InfParserMisc import InfParserSectionRoot 30 31 class InfSourceSectionParser(InfParserSectionRoot): 32 ## InfSourceParser 33 # 34 # 35 def InfSourceParser(self, SectionString, InfSectionObject, FileName): 36 SectionMacros = {} 37 ValueList = [] 38 SourceList = [] 39 StillCommentFalg = False 40 HeaderComments = [] 41 LineComment = None 42 SectionContent = '' 43 for Line in SectionString: 44 SrcLineContent = Line[0] 45 SrcLineNo = Line[1] 46 47 if SrcLineContent.strip() == '': 48 continue 49 50 # 51 # Found Header Comments 52 # 53 if SrcLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): 54 # 55 # Last line is comments, and this line go on. 56 # 57 if StillCommentFalg: 58 HeaderComments.append(Line) 59 SectionContent += SrcLineContent + DT.END_OF_LINE 60 continue 61 # 62 # First time encounter comment 63 # 64 else: 65 # 66 # Clear original data 67 # 68 HeaderComments = [] 69 HeaderComments.append(Line) 70 StillCommentFalg = True 71 SectionContent += SrcLineContent + DT.END_OF_LINE 72 continue 73 else: 74 StillCommentFalg = False 75 76 if len(HeaderComments) >= 1: 77 LineComment = InfLineCommentObject() 78 LineCommentContent = '' 79 for Item in HeaderComments: 80 LineCommentContent += Item[0] + DT.END_OF_LINE 81 LineComment.SetHeaderComments(LineCommentContent) 82 83 # 84 # Find Tail comment. 85 # 86 if SrcLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: 87 TailComments = SrcLineContent[SrcLineContent.find(DT.TAB_COMMENT_SPLIT):] 88 SrcLineContent = SrcLineContent[:SrcLineContent.find(DT.TAB_COMMENT_SPLIT)] 89 if LineComment == None: 90 LineComment = InfLineCommentObject() 91 LineComment.SetTailComments(TailComments) 92 93 # 94 # Find Macro 95 # 96 Name, Value = MacroParser((SrcLineContent, SrcLineNo), 97 FileName, 98 DT.MODEL_EFI_SOURCE_FILE, 99 self.FileLocalMacros) 100 if Name != None: 101 SectionMacros[Name] = Value 102 LineComment = None 103 HeaderComments = [] 104 continue 105 106 # 107 # Replace with Local section Macro and [Defines] section Macro. 108 # 109 SrcLineContent = InfExpandMacro(SrcLineContent, 110 (FileName, SrcLineContent, SrcLineNo), 111 self.FileLocalMacros, 112 SectionMacros) 113 114 TokenList = GetSplitValueList(SrcLineContent, DT.TAB_VALUE_SPLIT, 4) 115 ValueList[0:len(TokenList)] = TokenList 116 117 # 118 # Store section content string after MACRO replaced. 119 # 120 SectionContent += SrcLineContent + DT.END_OF_LINE 121 122 SourceList.append((ValueList, LineComment, 123 (SrcLineContent, SrcLineNo, FileName))) 124 ValueList = [] 125 LineComment = None 126 TailComments = '' 127 HeaderComments = [] 128 continue 129 130 # 131 # Current section archs 132 # 133 ArchList = [] 134 for Item in self.LastSectionHeaderContent: 135 if Item[1] not in ArchList: 136 ArchList.append(Item[1]) 137 InfSectionObject.SetSupArchList(Item[1]) 138 139 InfSectionObject.SetAllContent(SectionContent) 140 if not InfSectionObject.SetSources(SourceList, Arch = ArchList): 141 Logger.Error('InfParser', 142 FORMAT_INVALID, 143 ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Sources]"), 144 File=FileName, 145 Line=Item[3])