https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			681 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			681 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file contained the parser for INF file
 | 
						|
#
 | 
						|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
#
 | 
						|
 | 
						|
'''
 | 
						|
InfParser
 | 
						|
'''
 | 
						|
 | 
						|
##
 | 
						|
# Import Modules
 | 
						|
#
 | 
						|
import re
 | 
						|
import os
 | 
						|
from copy import deepcopy
 | 
						|
 | 
						|
from Library.StringUtils import GetSplitValueList
 | 
						|
from Library.StringUtils import ConvertSpecialChar
 | 
						|
from Library.Misc import ProcessLineExtender
 | 
						|
from Library.Misc import ProcessEdkComment
 | 
						|
from Library.Parsing import NormPath
 | 
						|
from Library.ParserValidate import IsValidInfMoudleTypeList
 | 
						|
from Library.ParserValidate import IsValidArch
 | 
						|
from Library import DataType as DT
 | 
						|
from Library import GlobalData
 | 
						|
 | 
						|
import Logger.Log as Logger
 | 
						|
from Logger import StringTable as ST
 | 
						|
from Logger.ToolError import FORMAT_INVALID
 | 
						|
from Logger.ToolError import FILE_READ_FAILURE
 | 
						|
from Logger.ToolError import PARSER_ERROR
 | 
						|
 | 
						|
from Object.Parser.InfCommonObject import InfSectionCommonDef
 | 
						|
from Parser.InfSectionParser import InfSectionParser
 | 
						|
from Parser.InfParserMisc import gINF_SECTION_DEF
 | 
						|
from Parser.InfParserMisc import IsBinaryInf
 | 
						|
 | 
						|
## OpenInfFile
 | 
						|
#
 | 
						|
#
 | 
						|
def OpenInfFile(Filename):
 | 
						|
    FileLinesList = []
 | 
						|
 | 
						|
    try:
 | 
						|
        FInputfile = open(Filename, "r")
 | 
						|
        try:
 | 
						|
            FileLinesList = FInputfile.readlines()
 | 
						|
        except BaseException:
 | 
						|
            Logger.Error("InfParser",
 | 
						|
                         FILE_READ_FAILURE,
 | 
						|
                         ST.ERR_FILE_OPEN_FAILURE,
 | 
						|
                         File=Filename)
 | 
						|
        finally:
 | 
						|
            FInputfile.close()
 | 
						|
    except BaseException:
 | 
						|
        Logger.Error("InfParser",
 | 
						|
                     FILE_READ_FAILURE,
 | 
						|
                     ST.ERR_FILE_OPEN_FAILURE,
 | 
						|
                     File=Filename)
 | 
						|
 | 
						|
    return FileLinesList
 | 
						|
 | 
						|
## InfParser
 | 
						|
#
 | 
						|
# This class defined the structure used in InfParser object
 | 
						|
#
 | 
						|
# @param InfObject:         Inherited from InfSectionParser class
 | 
						|
# @param Filename:          Input value for Filename of INF file, default is
 | 
						|
#                           None
 | 
						|
# @param WorkspaceDir:      Input value for current workspace directory,
 | 
						|
#                           default is None
 | 
						|
#
 | 
						|
class InfParser(InfSectionParser):
 | 
						|
 | 
						|
    def __init__(self, Filename = None, WorkspaceDir = None):
 | 
						|
 | 
						|
        #
 | 
						|
        # Call parent class construct function
 | 
						|
        #
 | 
						|
        InfSectionParser.__init__()
 | 
						|
 | 
						|
        self.WorkspaceDir    = WorkspaceDir
 | 
						|
        self.SupArchList     = DT.ARCH_LIST
 | 
						|
        self.EventList    = []
 | 
						|
        self.HobList      = []
 | 
						|
        self.BootModeList = []
 | 
						|
 | 
						|
        #
 | 
						|
        # Load Inf file if filename is not None
 | 
						|
        #
 | 
						|
        if Filename is not None:
 | 
						|
            self.ParseInfFile(Filename)
 | 
						|
 | 
						|
    ## Parse INF file
 | 
						|
    #
 | 
						|
    # Parse the file if it exists
 | 
						|
    #
 | 
						|
    # @param Filename:  Input value for filename of INF file
 | 
						|
    #
 | 
						|
    def ParseInfFile(self, Filename):
 | 
						|
 | 
						|
        Filename = NormPath(Filename)
 | 
						|
        (Path, Name) = os.path.split(Filename)
 | 
						|
        self.FullPath = Filename
 | 
						|
        self.RelaPath = Path
 | 
						|
        self.FileName = Name
 | 
						|
        GlobalData.gINF_MODULE_DIR = Path
 | 
						|
        GlobalData.gINF_MODULE_NAME = self.FullPath
 | 
						|
        GlobalData.gIS_BINARY_INF = False
 | 
						|
        #
 | 
						|
        # Initialize common data
 | 
						|
        #
 | 
						|
        LineNo             = 0
 | 
						|
        CurrentSection     = DT.MODEL_UNKNOWN
 | 
						|
        SectionLines       = []
 | 
						|
 | 
						|
        #
 | 
						|
        # Flags
 | 
						|
        #
 | 
						|
        HeaderCommentStart = False
 | 
						|
        HeaderCommentEnd   = False
 | 
						|
        HeaderStarLineNo = -1
 | 
						|
        BinaryHeaderCommentStart = False
 | 
						|
        BinaryHeaderCommentEnd   = False
 | 
						|
        BinaryHeaderStarLineNo = -1
 | 
						|
 | 
						|
        #
 | 
						|
        # While Section ends. parse whole section contents.
 | 
						|
        #
 | 
						|
        NewSectionStartFlag = False
 | 
						|
        FirstSectionStartFlag = False
 | 
						|
 | 
						|
        #
 | 
						|
        # Parse file content
 | 
						|
        #
 | 
						|
        CommentBlock       = []
 | 
						|
 | 
						|
        #
 | 
						|
        # Variables for Event/Hob/BootMode
 | 
						|
        #
 | 
						|
        self.EventList    = []
 | 
						|
        self.HobList      = []
 | 
						|
        self.BootModeList = []
 | 
						|
        SectionType = ''
 | 
						|
 | 
						|
        FileLinesList = OpenInfFile (Filename)
 | 
						|
 | 
						|
        #
 | 
						|
        # One INF file can only has one [Defines] section.
 | 
						|
        #
 | 
						|
        DefineSectionParsedFlag = False
 | 
						|
 | 
						|
        #
 | 
						|
        # Convert special characters in lines to space character.
 | 
						|
        #
 | 
						|
        FileLinesList = ConvertSpecialChar(FileLinesList)
 | 
						|
 | 
						|
        #
 | 
						|
        # Process Line Extender
 | 
						|
        #
 | 
						|
        FileLinesList = ProcessLineExtender(FileLinesList)
 | 
						|
 | 
						|
        #
 | 
						|
        # Process EdkI INF style comment if found
 | 
						|
        #
 | 
						|
        OrigLines = [Line for Line in FileLinesList]
 | 
						|
        FileLinesList, EdkCommentStartPos = ProcessEdkComment(FileLinesList)
 | 
						|
 | 
						|
        #
 | 
						|
        # Judge whether the INF file is Binary INF or not
 | 
						|
        #
 | 
						|
        if IsBinaryInf(FileLinesList):
 | 
						|
            GlobalData.gIS_BINARY_INF = True
 | 
						|
 | 
						|
        InfSectionCommonDefObj = None
 | 
						|
 | 
						|
        for Line in FileLinesList:
 | 
						|
            LineNo   = LineNo + 1
 | 
						|
            Line     = Line.strip()
 | 
						|
            if (LineNo < len(FileLinesList) - 1):
 | 
						|
                NextLine = FileLinesList[LineNo].strip()
 | 
						|
 | 
						|
            #
 | 
						|
            # blank line
 | 
						|
            #
 | 
						|
            if (Line == '' or not Line) and LineNo == len(FileLinesList):
 | 
						|
                LastSectionFalg = True
 | 
						|
 | 
						|
            #
 | 
						|
            # check whether file header comment section started
 | 
						|
            #
 | 
						|
            if Line.startswith(DT.TAB_SPECIAL_COMMENT) and \
 | 
						|
               (Line.find(DT.TAB_HEADER_COMMENT) > -1) and \
 | 
						|
               not HeaderCommentStart and not HeaderCommentEnd:
 | 
						|
 | 
						|
                CurrentSection = DT.MODEL_META_DATA_FILE_HEADER
 | 
						|
                #
 | 
						|
                # Append the first line to section lines.
 | 
						|
                #
 | 
						|
                HeaderStarLineNo = LineNo
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                HeaderCommentStart = True
 | 
						|
                continue
 | 
						|
 | 
						|
            #
 | 
						|
            # Collect Header content.
 | 
						|
            #
 | 
						|
            if (Line.startswith(DT.TAB_COMMENT_SPLIT) and CurrentSection == DT.MODEL_META_DATA_FILE_HEADER) and\
 | 
						|
                HeaderCommentStart and not Line.startswith(DT.TAB_SPECIAL_COMMENT) and not\
 | 
						|
                HeaderCommentEnd and NextLine != '':
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                continue
 | 
						|
            #
 | 
						|
            # Header content end
 | 
						|
            #
 | 
						|
            if (Line.startswith(DT.TAB_SPECIAL_COMMENT) or not Line.strip().startswith("#")) and HeaderCommentStart \
 | 
						|
                and not HeaderCommentEnd:
 | 
						|
                HeaderCommentEnd = True
 | 
						|
                BinaryHeaderCommentStart = False
 | 
						|
                BinaryHeaderCommentEnd   = False
 | 
						|
                HeaderCommentStart = False
 | 
						|
                if Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1:
 | 
						|
                    self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName)
 | 
						|
                    SectionLines = []
 | 
						|
                else:
 | 
						|
                    SectionLines.append((Line, LineNo))
 | 
						|
                    #
 | 
						|
                    # Call Header comment parser.
 | 
						|
                    #
 | 
						|
                    self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName)
 | 
						|
                    SectionLines = []
 | 
						|
                    continue
 | 
						|
 | 
						|
            #
 | 
						|
            # check whether binary header comment section started
 | 
						|
            #
 | 
						|
            if Line.startswith(DT.TAB_SPECIAL_COMMENT) and \
 | 
						|
                (Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1) and \
 | 
						|
                not BinaryHeaderCommentStart:
 | 
						|
                SectionLines = []
 | 
						|
                CurrentSection = DT.MODEL_META_DATA_FILE_HEADER
 | 
						|
                #
 | 
						|
                # Append the first line to section lines.
 | 
						|
                #
 | 
						|
                BinaryHeaderStarLineNo = LineNo
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                BinaryHeaderCommentStart = True
 | 
						|
                HeaderCommentEnd = True
 | 
						|
                continue
 | 
						|
 | 
						|
            #
 | 
						|
            # check whether there are more than one binary header exist
 | 
						|
            #
 | 
						|
            if Line.startswith(DT.TAB_SPECIAL_COMMENT) and BinaryHeaderCommentStart and \
 | 
						|
                not BinaryHeaderCommentEnd and (Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1):
 | 
						|
                Logger.Error('Parser',
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_MULTIPLE_BINARYHEADER_EXIST,
 | 
						|
                             File=Filename)
 | 
						|
 | 
						|
            #
 | 
						|
            # Collect Binary Header content.
 | 
						|
            #
 | 
						|
            if (Line.startswith(DT.TAB_COMMENT_SPLIT) and CurrentSection == DT.MODEL_META_DATA_FILE_HEADER) and\
 | 
						|
                BinaryHeaderCommentStart and not Line.startswith(DT.TAB_SPECIAL_COMMENT) and not\
 | 
						|
                BinaryHeaderCommentEnd and NextLine != '':
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                continue
 | 
						|
            #
 | 
						|
            # Binary Header content end
 | 
						|
            #
 | 
						|
            if (Line.startswith(DT.TAB_SPECIAL_COMMENT) or not Line.strip().startswith(DT.TAB_COMMENT_SPLIT)) and \
 | 
						|
                BinaryHeaderCommentStart and not BinaryHeaderCommentEnd:
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                BinaryHeaderCommentStart = False
 | 
						|
                #
 | 
						|
                # Call Binary Header comment parser.
 | 
						|
                #
 | 
						|
                self.InfHeaderParser(SectionLines, self.InfBinaryHeader, self.FileName, True)
 | 
						|
                SectionLines = []
 | 
						|
                BinaryHeaderCommentEnd   = True
 | 
						|
                continue
 | 
						|
            #
 | 
						|
            # Find a new section tab
 | 
						|
            # Or at the last line of INF file,
 | 
						|
            # need to process the last section.
 | 
						|
            #
 | 
						|
            LastSectionFalg = False
 | 
						|
            if LineNo == len(FileLinesList):
 | 
						|
                LastSectionFalg = True
 | 
						|
 | 
						|
            if Line.startswith(DT.TAB_COMMENT_SPLIT) and not Line.startswith(DT.TAB_SPECIAL_COMMENT):
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                if not LastSectionFalg:
 | 
						|
                    continue
 | 
						|
 | 
						|
            #
 | 
						|
            # Encountered a section. start with '[' and end with ']'
 | 
						|
            #
 | 
						|
            if (Line.startswith(DT.TAB_SECTION_START) and \
 | 
						|
               Line.find(DT.TAB_SECTION_END) > -1) or LastSectionFalg:
 | 
						|
 | 
						|
                HeaderCommentEnd = True
 | 
						|
                BinaryHeaderCommentEnd = True
 | 
						|
 | 
						|
                if not LastSectionFalg:
 | 
						|
                    #
 | 
						|
                    # check to prevent '#' inside section header
 | 
						|
                    #
 | 
						|
                    HeaderContent = Line[1:Line.find(DT.TAB_SECTION_END)]
 | 
						|
                    if HeaderContent.find(DT.TAB_COMMENT_SPLIT) != -1:
 | 
						|
                        Logger.Error("InfParser",
 | 
						|
                                     FORMAT_INVALID,
 | 
						|
                                     ST.ERR_INF_PARSER_DEFINE_SECTION_HEADER_INVALID,
 | 
						|
                                     File=self.FullPath,
 | 
						|
                                     Line=LineNo,
 | 
						|
                                     ExtraData=Line)
 | 
						|
 | 
						|
                    #
 | 
						|
                    # Keep last time section header content for section parser
 | 
						|
                    # usage.
 | 
						|
                    #
 | 
						|
                    self.LastSectionHeaderContent = deepcopy(self.SectionHeaderContent)
 | 
						|
 | 
						|
                    #
 | 
						|
                    # TailComments in section define.
 | 
						|
                    #
 | 
						|
                    TailComments = ''
 | 
						|
                    CommentIndex = Line.find(DT.TAB_COMMENT_SPLIT)
 | 
						|
                    if  CommentIndex > -1:
 | 
						|
                        TailComments = Line[CommentIndex:]
 | 
						|
                        Line = Line[:CommentIndex]
 | 
						|
 | 
						|
                    InfSectionCommonDefObj = InfSectionCommonDef()
 | 
						|
                    if TailComments != '':
 | 
						|
                        InfSectionCommonDefObj.SetTailComments(TailComments)
 | 
						|
                    if CommentBlock != '':
 | 
						|
                        InfSectionCommonDefObj.SetHeaderComments(CommentBlock)
 | 
						|
                        CommentBlock = []
 | 
						|
                    #
 | 
						|
                    # Call section parser before section header parer to avoid encounter EDKI INF file
 | 
						|
                    #
 | 
						|
                    if CurrentSection == DT.MODEL_META_DATA_DEFINE:
 | 
						|
                        DefineSectionParsedFlag = self._CallSectionParsers(CurrentSection,
 | 
						|
                                                                   DefineSectionParsedFlag, SectionLines,
 | 
						|
                                                                   InfSectionCommonDefObj, LineNo)
 | 
						|
                    #
 | 
						|
                    # Compare the new section name with current
 | 
						|
                    #
 | 
						|
                    self.SectionHeaderParser(Line, self.FileName, LineNo)
 | 
						|
 | 
						|
                    self._CheckSectionHeaders(Line, LineNo)
 | 
						|
 | 
						|
                    SectionType = _ConvertSecNameToType(self.SectionHeaderContent[0][0])
 | 
						|
 | 
						|
                if not FirstSectionStartFlag:
 | 
						|
                    CurrentSection = SectionType
 | 
						|
                    FirstSectionStartFlag = True
 | 
						|
                else:
 | 
						|
                    NewSectionStartFlag = True
 | 
						|
            else:
 | 
						|
                SectionLines.append((Line, LineNo))
 | 
						|
                continue
 | 
						|
 | 
						|
            if LastSectionFalg:
 | 
						|
                SectionLines, CurrentSection = self._ProcessLastSection(SectionLines, Line, LineNo, CurrentSection)
 | 
						|
 | 
						|
            #
 | 
						|
            # End of section content collect.
 | 
						|
            # Parser the section content collected previously.
 | 
						|
            #
 | 
						|
            if NewSectionStartFlag or LastSectionFalg:
 | 
						|
                if CurrentSection != DT.MODEL_META_DATA_DEFINE or \
 | 
						|
                    (LastSectionFalg and CurrentSection == DT.MODEL_META_DATA_DEFINE):
 | 
						|
                    DefineSectionParsedFlag = self._CallSectionParsers(CurrentSection,
 | 
						|
                                                                       DefineSectionParsedFlag, SectionLines,
 | 
						|
                                                                       InfSectionCommonDefObj, LineNo)
 | 
						|
 | 
						|
                CurrentSection = SectionType
 | 
						|
                #
 | 
						|
                # Clear section lines
 | 
						|
                #
 | 
						|
                SectionLines = []
 | 
						|
 | 
						|
        if HeaderStarLineNo == -1:
 | 
						|
            Logger.Error("InfParser",
 | 
						|
                        FORMAT_INVALID,
 | 
						|
                        ST.ERR_NO_SOURCE_HEADER,
 | 
						|
                        File=self.FullPath)
 | 
						|
        if BinaryHeaderStarLineNo > -1 and HeaderStarLineNo > -1  and HeaderStarLineNo > BinaryHeaderStarLineNo:
 | 
						|
            Logger.Error("InfParser",
 | 
						|
                        FORMAT_INVALID,
 | 
						|
                        ST.ERR_BINARY_HEADER_ORDER,
 | 
						|
                        File=self.FullPath)
 | 
						|
        #
 | 
						|
        # EDKII INF should not have EDKI style comment
 | 
						|
        #
 | 
						|
        if EdkCommentStartPos != -1:
 | 
						|
            Logger.Error("InfParser",
 | 
						|
                         FORMAT_INVALID,
 | 
						|
                         ST.ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII,
 | 
						|
                         File=self.FullPath,
 | 
						|
                         Line=EdkCommentStartPos + 1,
 | 
						|
                         ExtraData=OrigLines[EdkCommentStartPos])
 | 
						|
 | 
						|
        #
 | 
						|
        # extract [Event] [Hob] [BootMode] sections
 | 
						|
        #
 | 
						|
        self._ExtractEventHobBootMod(FileLinesList)
 | 
						|
 | 
						|
    ## _CheckSectionHeaders
 | 
						|
    #
 | 
						|
    #
 | 
						|
    def _CheckSectionHeaders(self, Line, LineNo):
 | 
						|
        if len(self.SectionHeaderContent) == 0:
 | 
						|
            Logger.Error("InfParser",
 | 
						|
                         FORMAT_INVALID,
 | 
						|
                         ST.ERR_INF_PARSER_DEFINE_SECTION_HEADER_INVALID,
 | 
						|
                         File=self.FullPath,
 | 
						|
                         Line=LineNo, ExtraData=Line)
 | 
						|
        else:
 | 
						|
            for SectionItem in self.SectionHeaderContent:
 | 
						|
                ArchList = []
 | 
						|
                #
 | 
						|
                # Not cover Depex/UserExtension section header
 | 
						|
                # check.
 | 
						|
                #
 | 
						|
                if SectionItem[0].strip().upper() == DT.TAB_INF_FIXED_PCD.upper() or \
 | 
						|
                    SectionItem[0].strip().upper() == DT.TAB_INF_PATCH_PCD.upper() or \
 | 
						|
                    SectionItem[0].strip().upper() == DT.TAB_INF_PCD_EX.upper() or \
 | 
						|
                    SectionItem[0].strip().upper() == DT.TAB_INF_PCD.upper() or \
 | 
						|
                    SectionItem[0].strip().upper() == DT.TAB_INF_FEATURE_PCD.upper():
 | 
						|
                    ArchList = GetSplitValueList(SectionItem[1].strip(), ' ')
 | 
						|
                else:
 | 
						|
                    ArchList = [SectionItem[1].strip()]
 | 
						|
 | 
						|
                for Arch in ArchList:
 | 
						|
                    if (not IsValidArch(Arch)) and \
 | 
						|
                        (SectionItem[0].strip().upper() != DT.TAB_DEPEX.upper()) and \
 | 
						|
                        (SectionItem[0].strip().upper() != DT.TAB_USER_EXTENSIONS.upper()) and \
 | 
						|
                        (SectionItem[0].strip().upper() != DT.TAB_COMMON_DEFINES.upper()):
 | 
						|
                        Logger.Error("InfParser",
 | 
						|
                                     FORMAT_INVALID,
 | 
						|
                                     ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(SectionItem[1]),
 | 
						|
                                     File=self.FullPath,
 | 
						|
                                     Line=LineNo, ExtraData=Line)
 | 
						|
                #
 | 
						|
                # Check if the ModuleType is valid
 | 
						|
                #
 | 
						|
                ChkModSectionList = ['LIBRARYCLASSES']
 | 
						|
                if (self.SectionHeaderContent[0][0].upper() in ChkModSectionList):
 | 
						|
                    if SectionItem[2].strip().upper():
 | 
						|
                        MoudleTypeList = GetSplitValueList(
 | 
						|
                                    SectionItem[2].strip().upper())
 | 
						|
                        if (not IsValidInfMoudleTypeList(MoudleTypeList)):
 | 
						|
                            Logger.Error("InfParser",
 | 
						|
                                         FORMAT_INVALID,
 | 
						|
                                         ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(SectionItem[2]),
 | 
						|
                                         File=self.FullPath, Line=LineNo,
 | 
						|
                                         ExtraData=Line)
 | 
						|
 | 
						|
    ## _CallSectionParsers
 | 
						|
    #
 | 
						|
    #
 | 
						|
    def _CallSectionParsers(self, CurrentSection, DefineSectionParsedFlag,
 | 
						|
                            SectionLines, InfSectionCommonDefObj, LineNo):
 | 
						|
        if CurrentSection == DT.MODEL_META_DATA_DEFINE:
 | 
						|
            if not DefineSectionParsedFlag:
 | 
						|
                self.InfDefineParser(SectionLines,
 | 
						|
                                     self.InfDefSection,
 | 
						|
                                     self.FullPath,
 | 
						|
                                     InfSectionCommonDefObj)
 | 
						|
                DefineSectionParsedFlag = True
 | 
						|
            else:
 | 
						|
                Logger.Error("Parser",
 | 
						|
                             PARSER_ERROR,
 | 
						|
                             ST.ERR_INF_PARSER_MULTI_DEFINE_SECTION,
 | 
						|
                             File=self.FullPath,
 | 
						|
                             RaiseError = Logger.IS_RAISE_ERROR)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_META_DATA_BUILD_OPTION:
 | 
						|
            self.InfBuildOptionParser(SectionLines,
 | 
						|
                                      self.InfBuildOptionSection,
 | 
						|
                                      self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_LIBRARY_CLASS:
 | 
						|
            self.InfLibraryParser(SectionLines,
 | 
						|
                                  self.InfLibraryClassSection,
 | 
						|
                                  self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_META_DATA_PACKAGE:
 | 
						|
            self.InfPackageParser(SectionLines,
 | 
						|
                                  self.InfPackageSection,
 | 
						|
                                  self.FullPath)
 | 
						|
        #
 | 
						|
        # [Pcd] Sections, put it together
 | 
						|
        #
 | 
						|
        elif CurrentSection == DT.MODEL_PCD_FIXED_AT_BUILD or \
 | 
						|
             CurrentSection == DT.MODEL_PCD_PATCHABLE_IN_MODULE or \
 | 
						|
             CurrentSection == DT.MODEL_PCD_FEATURE_FLAG or \
 | 
						|
             CurrentSection == DT.MODEL_PCD_DYNAMIC_EX or \
 | 
						|
             CurrentSection == DT.MODEL_PCD_DYNAMIC:
 | 
						|
            self.InfPcdParser(SectionLines,
 | 
						|
                              self.InfPcdSection,
 | 
						|
                              self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_SOURCE_FILE:
 | 
						|
            self.InfSourceParser(SectionLines,
 | 
						|
                                 self.InfSourcesSection,
 | 
						|
                                 self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_META_DATA_USER_EXTENSION:
 | 
						|
            self.InfUserExtensionParser(SectionLines,
 | 
						|
                                        self.InfUserExtensionSection,
 | 
						|
                                        self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_PROTOCOL:
 | 
						|
            self.InfProtocolParser(SectionLines,
 | 
						|
                                   self.InfProtocolSection,
 | 
						|
                                   self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_PPI:
 | 
						|
            self.InfPpiParser(SectionLines,
 | 
						|
                              self.InfPpiSection,
 | 
						|
                              self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_GUID:
 | 
						|
            self.InfGuidParser(SectionLines,
 | 
						|
                               self.InfGuidSection,
 | 
						|
                               self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_DEPEX:
 | 
						|
            self.InfDepexParser(SectionLines,
 | 
						|
                                self.InfDepexSection,
 | 
						|
                                self.FullPath)
 | 
						|
 | 
						|
        elif CurrentSection == DT.MODEL_EFI_BINARY_FILE:
 | 
						|
            self.InfBinaryParser(SectionLines,
 | 
						|
                                 self.InfBinariesSection,
 | 
						|
                                 self.FullPath)
 | 
						|
        #
 | 
						|
        # Unknown section type found, raise error.
 | 
						|
        #
 | 
						|
        else:
 | 
						|
            if len(self.SectionHeaderContent) >= 1:
 | 
						|
                Logger.Error("Parser",
 | 
						|
                             PARSER_ERROR,
 | 
						|
                             ST.ERR_INF_PARSER_UNKNOWN_SECTION,
 | 
						|
                             File=self.FullPath, Line=LineNo,
 | 
						|
                             RaiseError = Logger.IS_RAISE_ERROR)
 | 
						|
            else:
 | 
						|
                Logger.Error("Parser",
 | 
						|
                             PARSER_ERROR,
 | 
						|
                             ST.ERR_INF_PARSER_NO_SECTION_ERROR,
 | 
						|
                             File=self.FullPath, Line=LineNo,
 | 
						|
                             RaiseError = Logger.IS_RAISE_ERROR)
 | 
						|
 | 
						|
        return DefineSectionParsedFlag
 | 
						|
 | 
						|
    def _ExtractEventHobBootMod(self, FileLinesList):
 | 
						|
        SpecialSectionStart = False
 | 
						|
        CheckLocation = False
 | 
						|
        GFindSpecialCommentRe = \
 | 
						|
        re.compile(r"""#(?:\s*)\[(.*?)\](?:.*)""", re.DOTALL)
 | 
						|
        GFindNewSectionRe2 = \
 | 
						|
        re.compile(r"""#?(\s*)\[(.*?)\](.*)""", re.DOTALL)
 | 
						|
        LineNum = 0
 | 
						|
        Element = []
 | 
						|
        for Line in FileLinesList:
 | 
						|
            Line = Line.strip()
 | 
						|
            LineNum += 1
 | 
						|
            MatchObject = GFindSpecialCommentRe.search(Line)
 | 
						|
            if MatchObject:
 | 
						|
                SpecialSectionStart = True
 | 
						|
                Element = []
 | 
						|
                if MatchObject.group(1).upper().startswith("EVENT"):
 | 
						|
                    List = self.EventList
 | 
						|
                elif MatchObject.group(1).upper().startswith("HOB"):
 | 
						|
                    List = self.HobList
 | 
						|
                elif MatchObject.group(1).upper().startswith("BOOTMODE"):
 | 
						|
                    List = self.BootModeList
 | 
						|
                else:
 | 
						|
                    SpecialSectionStart = False
 | 
						|
                    CheckLocation = False
 | 
						|
                if SpecialSectionStart:
 | 
						|
                    Element.append([Line, LineNum])
 | 
						|
                    List.append(Element)
 | 
						|
            else:
 | 
						|
                #
 | 
						|
                # if currently in special section, try to detect end of current section
 | 
						|
                #
 | 
						|
                MatchObject = GFindNewSectionRe2.search(Line)
 | 
						|
                if SpecialSectionStart:
 | 
						|
                    if MatchObject:
 | 
						|
                        SpecialSectionStart = False
 | 
						|
                        CheckLocation = False
 | 
						|
                        Element = []
 | 
						|
                    elif not Line:
 | 
						|
                        SpecialSectionStart = False
 | 
						|
                        CheckLocation = True
 | 
						|
                        Element = []
 | 
						|
                    else:
 | 
						|
                        if not Line.startswith(DT.TAB_COMMENT_SPLIT):
 | 
						|
                            Logger.Warn("Parser",
 | 
						|
                                         ST.WARN_SPECIAL_SECTION_LOCATION_WRONG,
 | 
						|
                                         File=self.FullPath, Line=LineNum)
 | 
						|
                            SpecialSectionStart = False
 | 
						|
                            CheckLocation = False
 | 
						|
                            Element = []
 | 
						|
                        else:
 | 
						|
                            Element.append([Line, LineNum])
 | 
						|
                else:
 | 
						|
                    if CheckLocation:
 | 
						|
                        if MatchObject:
 | 
						|
                            CheckLocation = False
 | 
						|
                        elif Line:
 | 
						|
                            Logger.Warn("Parser",
 | 
						|
                                         ST.WARN_SPECIAL_SECTION_LOCATION_WRONG,
 | 
						|
                                         File=self.FullPath, Line=LineNum)
 | 
						|
                            CheckLocation = False
 | 
						|
 | 
						|
        if len(self.BootModeList) >= 1:
 | 
						|
            self.InfSpecialCommentParser(self.BootModeList,
 | 
						|
                                         self.InfSpecialCommentSection,
 | 
						|
                                         self.FileName,
 | 
						|
                                         DT.TYPE_BOOTMODE_SECTION)
 | 
						|
 | 
						|
        if len(self.EventList) >= 1:
 | 
						|
            self.InfSpecialCommentParser(self.EventList,
 | 
						|
                                         self.InfSpecialCommentSection,
 | 
						|
                                         self.FileName,
 | 
						|
                                         DT.TYPE_EVENT_SECTION)
 | 
						|
 | 
						|
        if len(self.HobList) >= 1:
 | 
						|
            self.InfSpecialCommentParser(self.HobList,
 | 
						|
                                         self.InfSpecialCommentSection,
 | 
						|
                                         self.FileName,
 | 
						|
                                         DT.TYPE_HOB_SECTION)
 | 
						|
    ## _ProcessLastSection
 | 
						|
    #
 | 
						|
    #
 | 
						|
    def _ProcessLastSection(self, SectionLines, Line, LineNo, CurrentSection):
 | 
						|
        #
 | 
						|
        # The last line is a section header. will discard it.
 | 
						|
        #
 | 
						|
        if not (Line.startswith(DT.TAB_SECTION_START) and Line.find(DT.TAB_SECTION_END) > -1):
 | 
						|
            SectionLines.append((Line, LineNo))
 | 
						|
 | 
						|
        if len(self.SectionHeaderContent) >= 1:
 | 
						|
            TemSectionName = self.SectionHeaderContent[0][0].upper()
 | 
						|
            if TemSectionName.upper() not in gINF_SECTION_DEF.keys():
 | 
						|
                Logger.Error("InfParser",
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INF_PARSER_UNKNOWN_SECTION,
 | 
						|
                             File=self.FullPath,
 | 
						|
                             Line=LineNo,
 | 
						|
                             ExtraData=Line,
 | 
						|
                             RaiseError = Logger.IS_RAISE_ERROR
 | 
						|
                             )
 | 
						|
            else:
 | 
						|
                CurrentSection = gINF_SECTION_DEF[TemSectionName]
 | 
						|
                self.LastSectionHeaderContent = self.SectionHeaderContent
 | 
						|
 | 
						|
        return SectionLines, CurrentSection
 | 
						|
 | 
						|
## _ConvertSecNameToType
 | 
						|
#
 | 
						|
#
 | 
						|
def _ConvertSecNameToType(SectionName):
 | 
						|
    SectionType = ''
 | 
						|
    if SectionName.upper() not in gINF_SECTION_DEF.keys():
 | 
						|
        SectionType = DT.MODEL_UNKNOWN
 | 
						|
    else:
 | 
						|
        SectionType = gINF_SECTION_DEF[SectionName.upper()]
 | 
						|
 | 
						|
    return SectionType
 | 
						|
 |