1## @file
2# This file contained the parser for [Binaries] sections in INF file
3#
4# Copyright (c) 2011 - 2014, 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'''
15InfBinarySectionParser
16'''
17##
18# Import Modules
19#
20
21import Logger.Log as Logger
22from Logger import StringTable as ST
23from Logger.ToolError import FORMAT_INVALID
24from Parser.InfParserMisc import InfExpandMacro
25from Library import DataType as DT
26from Library.Parsing import MacroParser
27from Library.Misc import GetSplitValueList
28from Object.Parser.InfCommonObject import InfLineCommentObject
29from Object.Parser.InfCommonObject import CurrentLine
30from Parser.InfParserMisc import InfParserSectionRoot
31
32class InfBinarySectionParser(InfParserSectionRoot):
33    ## InfBinaryParser
34    #
35    #
36    def InfBinaryParser(self, SectionString, InfSectionObject, FileName):
37        #
38        # Macro defined in this section
39        #
40        SectionMacros = {}
41        ValueList     = []
42        #
43        # For UI (UI, SEC_UI, UNI_UI) binaries
44        # One and only one UI section can be included
45        #
46        UiBinaryList  = []
47        #
48        # For Version (VER, SEC_VER, UNI_VER).
49        # One and only one VER section on be included
50        #
51        VerBinaryList = []
52        #
53        # For other common type binaries
54        #
55        ComBinaryList = []
56
57        StillCommentFalg  = False
58        HeaderComments    = []
59        LineComment       = None
60
61        AllSectionContent = ''
62        #
63        # Parse section content
64        #
65        for Line in SectionString:
66            BinLineContent = Line[0]
67            BinLineNo      = Line[1]
68
69            if BinLineContent.strip() == '':
70                continue
71
72            CurrentLineObj = CurrentLine()
73            CurrentLineObj.FileName = FileName
74            CurrentLineObj.LineString = BinLineContent
75            CurrentLineObj.LineNo = BinLineNo
76            #
77            # Found Header Comments
78            #
79            if BinLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
80                #
81                # Last line is comments, and this line go on.
82                #
83                if StillCommentFalg:
84                    HeaderComments.append(Line)
85                    AllSectionContent += BinLineContent + DT.END_OF_LINE
86                    continue
87                #
88                # First time encounter comment
89                #
90                else:
91                    #
92                    # Clear original data
93                    #
94                    HeaderComments = []
95                    HeaderComments.append(Line)
96                    AllSectionContent += BinLineContent + DT.END_OF_LINE
97                    StillCommentFalg = True
98                    continue
99            else:
100                StillCommentFalg = False
101
102            if len(HeaderComments) >= 1:
103                LineComment = InfLineCommentObject()
104                LineCommentContent = ''
105                for Item in HeaderComments:
106                    LineCommentContent += Item[0] + DT.END_OF_LINE
107                LineComment.SetHeaderComments(LineCommentContent)
108
109            #
110            # Find Tail comment.
111            #
112            if BinLineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
113                TailComments = BinLineContent[BinLineContent.find(DT.TAB_COMMENT_SPLIT):]
114                BinLineContent = BinLineContent[:BinLineContent.find(DT.TAB_COMMENT_SPLIT)]
115                if LineComment == None:
116                    LineComment = InfLineCommentObject()
117                LineComment.SetTailComments(TailComments)
118
119            #
120            # Find Macro
121            #
122            MacroDef = MacroParser((BinLineContent, BinLineNo),
123                                      FileName,
124                                      DT.MODEL_EFI_BINARY_FILE,
125                                      self.FileLocalMacros)
126            if MacroDef[0] != None:
127                SectionMacros[MacroDef[0]] = MacroDef[1]
128                LineComment = None
129                HeaderComments = []
130                continue
131
132            #
133            # Replace with Local section Macro and [Defines] section Macro.
134            #
135            LineContent = InfExpandMacro(BinLineContent,
136                                         (FileName, BinLineContent, BinLineNo),
137                                         self.FileLocalMacros,
138                                         SectionMacros, True)
139
140            AllSectionContent += LineContent + DT.END_OF_LINE
141            TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1)
142            ValueList[0:len(TokenList)] = TokenList
143
144            #
145            # Should equal to UI/SEC_UI/UNI_UI
146            #
147            ValueList[0] = ValueList[0].strip()
148            if ValueList[0] == DT.BINARY_FILE_TYPE_UNI_UI or \
149               ValueList[0] == DT.BINARY_FILE_TYPE_SEC_UI or \
150               ValueList[0] == DT.BINARY_FILE_TYPE_UI:
151                if len(ValueList) == 2:
152                    TokenList = GetSplitValueList(ValueList[1],
153                                                  DT.TAB_VALUE_SPLIT,
154                                                  2)
155                    NewValueList = []
156                    NewValueList.append(ValueList[0])
157                    for Item in TokenList:
158                        NewValueList.append(Item)
159                    UiBinaryList.append((NewValueList,
160                                         LineComment,
161                                         CurrentLineObj))
162            #
163            # Should equal to VER/SEC_VER/UNI_VER
164            #
165            elif ValueList[0] == DT.BINARY_FILE_TYPE_UNI_VER or \
166               ValueList[0] == DT.BINARY_FILE_TYPE_SEC_VER or \
167               ValueList[0] == DT.BINARY_FILE_TYPE_VER:
168                if len(ValueList) == 2:
169                    TokenList = GetSplitValueList(ValueList[1],
170                                                  DT.TAB_VALUE_SPLIT,
171                                                  2)
172                    NewValueList = []
173                    NewValueList.append(ValueList[0])
174                    for Item in TokenList:
175                        NewValueList.append(Item)
176                    VerBinaryList.append((NewValueList,
177                                          LineComment,
178                                          CurrentLineObj))
179            else:
180                if len(ValueList) == 2:
181                    if ValueList[0].strip() == 'SUBTYPE_GUID':
182                        TokenList = GetSplitValueList(ValueList[1],
183                                                      DT.TAB_VALUE_SPLIT,
184                                                      5)
185                    else:
186                        TokenList = GetSplitValueList(ValueList[1],
187                              DT.TAB_VALUE_SPLIT,
188                              4)
189
190                    NewValueList = []
191                    NewValueList.append(ValueList[0])
192                    for Item in TokenList:
193                        NewValueList.append(Item)
194                    ComBinaryList.append((NewValueList,
195                                          LineComment,
196                                          CurrentLineObj))
197                elif len(ValueList) == 1:
198                    NewValueList = []
199                    NewValueList.append(ValueList[0])
200                    ComBinaryList.append((NewValueList,
201                                          LineComment,
202                                          CurrentLineObj))
203
204
205
206
207            ValueList = []
208            LineComment = None
209            TailComments = ''
210            HeaderComments = []
211            continue
212
213        #
214        # Current section archs
215        #
216        ArchList = []
217        for Item in self.LastSectionHeaderContent:
218            if Item[1] not in ArchList:
219                ArchList.append(Item[1])
220                InfSectionObject.SetSupArchList(Item[1])
221
222        InfSectionObject.SetAllContent(AllSectionContent)
223        if not InfSectionObject.SetBinary(UiBinaryList,
224                                          VerBinaryList,
225                                          ComBinaryList,
226                                          ArchList):
227            Logger.Error('InfParser',
228                         FORMAT_INVALID,
229                         ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[Binaries]"),
230                         File=FileName,
231                         Line=Item[3])
232