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>
		
			
				
	
	
		
			494 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			494 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file contained the parser for sections in INF file
 | 
						|
#
 | 
						|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
#
 | 
						|
 | 
						|
'''
 | 
						|
InfSectionParser
 | 
						|
'''
 | 
						|
##
 | 
						|
# Import Modules
 | 
						|
#
 | 
						|
from copy import deepcopy
 | 
						|
import re
 | 
						|
 | 
						|
from Library.StringUtils import GetSplitValueList
 | 
						|
from Library.CommentParsing import ParseHeaderCommentSection
 | 
						|
from Library.CommentParsing import ParseComment
 | 
						|
 | 
						|
from Library import DataType as DT
 | 
						|
 | 
						|
import Logger.Log as Logger
 | 
						|
from Logger import StringTable as ST
 | 
						|
from Logger.ToolError import FORMAT_INVALID
 | 
						|
 | 
						|
from Object.Parser.InfDefineObject import InfDefObject
 | 
						|
from Object.Parser.InfBuildOptionObject import InfBuildOptionsObject
 | 
						|
from Object.Parser.InfLibraryClassesObject import InfLibraryClassObject
 | 
						|
from Object.Parser.InfPackagesObject import InfPackageObject
 | 
						|
from Object.Parser.InfPcdObject import InfPcdObject
 | 
						|
from Object.Parser.InfSoucesObject import InfSourcesObject
 | 
						|
from Object.Parser.InfUserExtensionObject import InfUserExtensionObject
 | 
						|
from Object.Parser.InfProtocolObject import InfProtocolObject
 | 
						|
from Object.Parser.InfPpiObject import InfPpiObject
 | 
						|
from Object.Parser.InfGuidObject import InfGuidObject
 | 
						|
from Object.Parser.InfDepexObject import InfDepexObject
 | 
						|
from Object.Parser.InfBinaryObject import InfBinariesObject
 | 
						|
from Object.Parser.InfHeaderObject import InfHeaderObject
 | 
						|
from Object.Parser.InfMisc import InfSpecialCommentObject
 | 
						|
from Object.Parser.InfMisc import InfHobObject
 | 
						|
from Object.Parser.InfMisc import InfBootModeObject
 | 
						|
from Object.Parser.InfMisc import InfEventObject
 | 
						|
from Parser.InfParserMisc import gINF_SECTION_DEF
 | 
						|
from Parser.InfDefineSectionParser import InfDefinSectionParser
 | 
						|
from Parser.InfBuildOptionSectionParser import InfBuildOptionSectionParser
 | 
						|
from Parser.InfSourceSectionParser import InfSourceSectionParser
 | 
						|
from Parser.InfLibrarySectionParser import InfLibrarySectionParser
 | 
						|
from Parser.InfPackageSectionParser import InfPackageSectionParser
 | 
						|
from Parser.InfGuidPpiProtocolSectionParser import InfGuidPpiProtocolSectionParser
 | 
						|
from Parser.InfBinarySectionParser import InfBinarySectionParser
 | 
						|
from Parser.InfPcdSectionParser import InfPcdSectionParser
 | 
						|
from Parser.InfDepexSectionParser import InfDepexSectionParser
 | 
						|
 | 
						|
## GetSpecialStr2
 | 
						|
#
 | 
						|
# GetSpecialStr2
 | 
						|
#
 | 
						|
def GetSpecialStr2(ItemList, FileName, LineNo, SectionString):
 | 
						|
    Str2 = ''
 | 
						|
    #
 | 
						|
    # S2 may be Platform or ModuleType
 | 
						|
    #
 | 
						|
    if len(ItemList) == 3:
 | 
						|
        #
 | 
						|
        # Except [LibraryClass], [Depex]
 | 
						|
        # section can has more than 2 items in section header string,
 | 
						|
        # others should report error.
 | 
						|
        #
 | 
						|
        if not (ItemList[0].upper() == DT.TAB_LIBRARY_CLASSES.upper() or \
 | 
						|
                ItemList[0].upper() == DT.TAB_DEPEX.upper() or \
 | 
						|
                ItemList[0].upper() == DT.TAB_USER_EXTENSIONS.upper()):
 | 
						|
            if ItemList[2] != '':
 | 
						|
                Logger.Error('Parser',
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INF_PARSER_SOURCE_SECTION_SECTIONNAME_INVALID % (SectionString),
 | 
						|
                             File=FileName,
 | 
						|
                             Line=LineNo,
 | 
						|
                             ExtraData=SectionString)
 | 
						|
        Str2 = ItemList[2]
 | 
						|
    elif len(ItemList) == 4:
 | 
						|
        #
 | 
						|
        # Except [UserExtension]
 | 
						|
        # section can has 4 items in section header string,
 | 
						|
        # others should report error.
 | 
						|
        #
 | 
						|
        if not ItemList[0].upper() == DT.TAB_USER_EXTENSIONS.upper() or ItemList[0].upper() == DT.TAB_DEPEX.upper():
 | 
						|
            if ItemList[3] != '':
 | 
						|
                Logger.Error('Parser', FORMAT_INVALID, ST.ERR_INF_PARSER_SOURCE_SECTION_SECTIONNAME_INVALID \
 | 
						|
                             % (SectionString), File=FileName, Line=LineNo, ExtraData=SectionString)
 | 
						|
 | 
						|
        if not ItemList[0].upper() == DT.TAB_USER_EXTENSIONS.upper():
 | 
						|
            Str2 = ItemList[2] + ' | ' + ItemList[3]
 | 
						|
        else:
 | 
						|
            Str2 = ItemList[2]
 | 
						|
 | 
						|
    elif len(ItemList) > 4:
 | 
						|
        Logger.Error('Parser', FORMAT_INVALID, ST.ERR_INF_PARSER_SOURCE_SECTION_SECTIONNAME_INVALID \
 | 
						|
                     % (SectionString), File=FileName, Line=LineNo, ExtraData=SectionString)
 | 
						|
 | 
						|
    return Str2
 | 
						|
 | 
						|
## ProcessUseExtHeader
 | 
						|
#
 | 
						|
#
 | 
						|
def ProcessUseExtHeader(ItemList):
 | 
						|
    NewItemList = []
 | 
						|
    AppendContent = ''
 | 
						|
    CompleteFlag = False
 | 
						|
    for Item in ItemList:
 | 
						|
        if Item.startswith('\"') and not Item.endswith('\"'):
 | 
						|
            AppendContent = Item
 | 
						|
            CompleteFlag = True
 | 
						|
        elif Item.endswith('\"') and not Item.startswith('\"'):
 | 
						|
            #
 | 
						|
            # Should not have an userId or IdString not starts with " before but ends with ".
 | 
						|
            #
 | 
						|
            if not CompleteFlag:
 | 
						|
                return False, []
 | 
						|
            AppendContent = AppendContent + "." + Item
 | 
						|
            NewItemList.append(AppendContent)
 | 
						|
            CompleteFlag = False
 | 
						|
            AppendContent = ''
 | 
						|
        elif Item.endswith('\"') and Item.startswith('\"'):
 | 
						|
            #
 | 
						|
            # Common item, not need to combine the information
 | 
						|
            #
 | 
						|
            NewItemList.append(Item)
 | 
						|
        else:
 | 
						|
            if not CompleteFlag:
 | 
						|
                NewItemList.append(Item)
 | 
						|
            else:
 | 
						|
                AppendContent = AppendContent + "." + Item
 | 
						|
 | 
						|
    if len(NewItemList) > 4:
 | 
						|
        return False, []
 | 
						|
 | 
						|
    return True, NewItemList
 | 
						|
 | 
						|
## GetArch
 | 
						|
#
 | 
						|
# GetArch
 | 
						|
#
 | 
						|
def GetArch(ItemList, ArchList, FileName, LineNo, SectionString):
 | 
						|
    #
 | 
						|
    # S1 is always Arch
 | 
						|
    #
 | 
						|
    if len(ItemList) > 1:
 | 
						|
        Arch = ItemList[1]
 | 
						|
    else:
 | 
						|
        Arch = 'COMMON'
 | 
						|
    ArchList.add(Arch)
 | 
						|
 | 
						|
    #
 | 
						|
    # 'COMMON' must not be used with specific ARCHs at the same section
 | 
						|
    #
 | 
						|
    if 'COMMON' in ArchList and len(ArchList) > 1:
 | 
						|
        Logger.Error('Parser',
 | 
						|
                     FORMAT_INVALID,
 | 
						|
                     ST.ERR_INF_PARSER_SECTION_ARCH_CONFLICT,
 | 
						|
                     File=FileName,
 | 
						|
                     Line=LineNo,
 | 
						|
                     ExtraData=SectionString)
 | 
						|
 | 
						|
    return Arch, ArchList
 | 
						|
 | 
						|
## InfSectionParser
 | 
						|
#
 | 
						|
# Inherit from object
 | 
						|
#
 | 
						|
class InfSectionParser(InfDefinSectionParser,
 | 
						|
                       InfBuildOptionSectionParser,
 | 
						|
                       InfSourceSectionParser,
 | 
						|
                       InfLibrarySectionParser,
 | 
						|
                       InfPackageSectionParser,
 | 
						|
                       InfGuidPpiProtocolSectionParser,
 | 
						|
                       InfBinarySectionParser,
 | 
						|
                       InfPcdSectionParser,
 | 
						|
                       InfDepexSectionParser):
 | 
						|
    #
 | 
						|
    # Parser objects used to implement singleton
 | 
						|
    #
 | 
						|
    MetaFiles = {}
 | 
						|
 | 
						|
    ## Factory method
 | 
						|
    #
 | 
						|
    # One file, one parser object. This factory method makes sure that there's
 | 
						|
    # only one object constructed for one meta file.
 | 
						|
    #
 | 
						|
    #   @param  Class           class object of real AutoGen class
 | 
						|
    #                           (InfParser, DecParser or DscParser)
 | 
						|
    #   @param  FilePath        The path of meta file
 | 
						|
    #
 | 
						|
    def __new__(cls, FilePath, *args, **kwargs):
 | 
						|
        if args:
 | 
						|
            pass
 | 
						|
        if kwargs:
 | 
						|
            pass
 | 
						|
        if FilePath in cls.MetaFiles:
 | 
						|
            return cls.MetaFiles[FilePath]
 | 
						|
        else:
 | 
						|
            ParserObject = super(InfSectionParser, cls).__new__(cls)
 | 
						|
            cls.MetaFiles[FilePath] = ParserObject
 | 
						|
            return ParserObject
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        InfDefinSectionParser.__init__(self)
 | 
						|
        InfBuildOptionSectionParser.__init__(self)
 | 
						|
        InfSourceSectionParser.__init__(self)
 | 
						|
        InfLibrarySectionParser.__init__(self)
 | 
						|
        InfPackageSectionParser.__init__(self)
 | 
						|
        InfGuidPpiProtocolSectionParser.__init__(self)
 | 
						|
        InfBinarySectionParser.__init__(self)
 | 
						|
        InfPcdSectionParser.__init__(self)
 | 
						|
        InfDepexSectionParser.__init__(self)
 | 
						|
        #
 | 
						|
        # Initialize all objects that an INF file will generated.
 | 
						|
        #
 | 
						|
        self.InfDefSection = InfDefObject()
 | 
						|
        self.InfBuildOptionSection = InfBuildOptionsObject()
 | 
						|
        self.InfLibraryClassSection = InfLibraryClassObject()
 | 
						|
        self.InfPackageSection = InfPackageObject()
 | 
						|
        self.InfPcdSection = InfPcdObject(list(self.MetaFiles.keys())[0])
 | 
						|
        self.InfSourcesSection = InfSourcesObject()
 | 
						|
        self.InfUserExtensionSection = InfUserExtensionObject()
 | 
						|
        self.InfProtocolSection = InfProtocolObject()
 | 
						|
        self.InfPpiSection = InfPpiObject()
 | 
						|
        self.InfGuidSection = InfGuidObject()
 | 
						|
        self.InfDepexSection = InfDepexObject()
 | 
						|
        self.InfPeiDepexSection = InfDepexObject()
 | 
						|
        self.InfDxeDepexSection = InfDepexObject()
 | 
						|
        self.InfSmmDepexSection = InfDepexObject()
 | 
						|
        self.InfBinariesSection = InfBinariesObject()
 | 
						|
        self.InfHeader = InfHeaderObject()
 | 
						|
        self.InfBinaryHeader = InfHeaderObject()
 | 
						|
        self.InfSpecialCommentSection = InfSpecialCommentObject()
 | 
						|
 | 
						|
        #
 | 
						|
        # A List for store define section content.
 | 
						|
        #
 | 
						|
        self._PcdNameList = []
 | 
						|
        self._SectionName = ''
 | 
						|
        self._SectionType = 0
 | 
						|
        self.RelaPath = ''
 | 
						|
        self.FileName = ''
 | 
						|
 | 
						|
    #
 | 
						|
    # File Header content parser
 | 
						|
    #
 | 
						|
    def InfHeaderParser(self, Content, InfHeaderObject2, FileName, IsBinaryHeader = False):
 | 
						|
        if IsBinaryHeader:
 | 
						|
            (Abstract, Description, Copyright, License) = ParseHeaderCommentSection(Content, FileName, True)
 | 
						|
            if not Abstract or not Description or not Copyright or not License:
 | 
						|
                Logger.Error('Parser',
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INVALID_BINARYHEADER_FORMAT,
 | 
						|
                             File=FileName)
 | 
						|
        else:
 | 
						|
            (Abstract, Description, Copyright, License) = ParseHeaderCommentSection(Content, FileName)
 | 
						|
        #
 | 
						|
        # Not process file name now, for later usage.
 | 
						|
        #
 | 
						|
        if self.FileName:
 | 
						|
            pass
 | 
						|
 | 
						|
        #
 | 
						|
        # Insert Abstract, Description, CopyRight, License into header object
 | 
						|
        #
 | 
						|
        InfHeaderObject2.SetAbstract(Abstract)
 | 
						|
        InfHeaderObject2.SetDescription(Description)
 | 
						|
        InfHeaderObject2.SetCopyright(Copyright)
 | 
						|
        InfHeaderObject2.SetLicense(License)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    ## Section header parser
 | 
						|
    #
 | 
						|
    #   The section header is always in following format:
 | 
						|
    #
 | 
						|
    #       [section_name.arch<.platform|module_type>]
 | 
						|
    #
 | 
						|
    # @param String    A string contained the content need to be parsed.
 | 
						|
    #
 | 
						|
    def SectionHeaderParser(self, SectionString, FileName, LineNo):
 | 
						|
        _Scope = []
 | 
						|
        _SectionName = ''
 | 
						|
        ArchList = set()
 | 
						|
        _ValueList = []
 | 
						|
        _PcdNameList = [DT.TAB_INF_FIXED_PCD.upper(),
 | 
						|
                             DT.TAB_INF_FEATURE_PCD.upper(),
 | 
						|
                             DT.TAB_INF_PATCH_PCD.upper(),
 | 
						|
                             DT.TAB_INF_PCD.upper(),
 | 
						|
                             DT.TAB_INF_PCD_EX.upper()
 | 
						|
                             ]
 | 
						|
        SectionString = SectionString.strip()
 | 
						|
        for Item in GetSplitValueList(SectionString[1:-1], DT.TAB_COMMA_SPLIT):
 | 
						|
            if Item == '':
 | 
						|
                Logger.Error('Parser',
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % (""),
 | 
						|
                             File=FileName,
 | 
						|
                             Line=LineNo,
 | 
						|
                             ExtraData=SectionString)
 | 
						|
            ItemList = GetSplitValueList(Item, DT.TAB_SPLIT)
 | 
						|
            #
 | 
						|
            # different section should not mix in one section
 | 
						|
            # Allow different PCD type sections mixed together
 | 
						|
            #
 | 
						|
            if _SectionName.upper() not in _PcdNameList:
 | 
						|
                if _SectionName != '' and _SectionName.upper() != ItemList[0].upper():
 | 
						|
                    Logger.Error('Parser',
 | 
						|
                                 FORMAT_INVALID,
 | 
						|
                                 ST.ERR_INF_PARSER_SECTION_NAME_DUPLICATE,
 | 
						|
                                 File=FileName,
 | 
						|
                                 Line=LineNo,
 | 
						|
                                 ExtraData=SectionString)
 | 
						|
            elif _PcdNameList[1] in [_SectionName.upper(), ItemList[0].upper()] and \
 | 
						|
                (_SectionName.upper()!= ItemList[0].upper()):
 | 
						|
                Logger.Error('Parser',
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % (""),
 | 
						|
                             File=FileName,
 | 
						|
                             Line=LineNo,
 | 
						|
                             ExtraData=SectionString)
 | 
						|
 | 
						|
            _SectionName = ItemList[0]
 | 
						|
            if _SectionName.upper() in gINF_SECTION_DEF:
 | 
						|
                self._SectionType = gINF_SECTION_DEF[_SectionName.upper()]
 | 
						|
            else:
 | 
						|
                self._SectionType = DT.MODEL_UNKNOWN
 | 
						|
                Logger.Error("Parser",
 | 
						|
                             FORMAT_INVALID,
 | 
						|
                             ST.ERR_INF_PARSER_UNKNOWN_SECTION,
 | 
						|
                             File=FileName,
 | 
						|
                             Line=LineNo,
 | 
						|
                             ExtraData=SectionString)
 | 
						|
 | 
						|
            #
 | 
						|
            # Get Arch
 | 
						|
            #
 | 
						|
            Str1, ArchList = GetArch(ItemList, ArchList, FileName, LineNo, SectionString)
 | 
						|
 | 
						|
            #
 | 
						|
            # For [Defines] section, do special check.
 | 
						|
            #
 | 
						|
            if ItemList[0].upper() == DT.TAB_COMMON_DEFINES.upper():
 | 
						|
                if len(ItemList) != 1:
 | 
						|
                    Logger.Error('Parser',
 | 
						|
                                 FORMAT_INVALID,
 | 
						|
                                 ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (SectionString),
 | 
						|
                                 File=FileName, Line=LineNo, ExtraData=SectionString)
 | 
						|
 | 
						|
            #
 | 
						|
            # For [UserExtension] section, do special check.
 | 
						|
            #
 | 
						|
            if ItemList[0].upper() == DT.TAB_USER_EXTENSIONS.upper():
 | 
						|
 | 
						|
                RetValue = ProcessUseExtHeader(ItemList)
 | 
						|
 | 
						|
                if not RetValue[0]:
 | 
						|
                    Logger.Error('Parser',
 | 
						|
                                 FORMAT_INVALID,
 | 
						|
                                 ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (SectionString),
 | 
						|
                                 File=FileName, Line=LineNo, ExtraData=SectionString)
 | 
						|
                else:
 | 
						|
                    ItemList = RetValue[1]
 | 
						|
 | 
						|
                if len(ItemList) == 3:
 | 
						|
                    ItemList.append('COMMON')
 | 
						|
 | 
						|
                Str1 = ItemList[1]
 | 
						|
 | 
						|
            #
 | 
						|
            # For Library classes, need to check module type.
 | 
						|
            #
 | 
						|
            if ItemList[0].upper() == DT.TAB_LIBRARY_CLASSES.upper() and len(ItemList) == 3:
 | 
						|
                if ItemList[2] != '':
 | 
						|
                    ModuleTypeList = GetSplitValueList(ItemList[2], DT.TAB_VALUE_SPLIT)
 | 
						|
                    for Item in ModuleTypeList:
 | 
						|
                        if Item.strip() not in DT.MODULE_LIST:
 | 
						|
                            Logger.Error('Parser',
 | 
						|
                                         FORMAT_INVALID,
 | 
						|
                                         ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID % (Item),
 | 
						|
                                         File=FileName,
 | 
						|
                                         Line=LineNo,
 | 
						|
                                         ExtraData=SectionString)
 | 
						|
            #
 | 
						|
            # GetSpecialStr2
 | 
						|
            #
 | 
						|
            Str2 = GetSpecialStr2(ItemList, FileName, LineNo, SectionString)
 | 
						|
 | 
						|
            _Scope.append([Str1, Str2])
 | 
						|
 | 
						|
            _NewValueList = []
 | 
						|
            _AppendFlag = True
 | 
						|
            if _SectionName.upper() in _PcdNameList:
 | 
						|
                for ValueItem in _ValueList:
 | 
						|
                    if _SectionName.upper() == ValueItem[0].upper() and Str1.upper() not in ValueItem[1].split():
 | 
						|
                        ValueItem[1] = ValueItem[1] + " " + Str1
 | 
						|
                        _AppendFlag = False
 | 
						|
                    elif _SectionName.upper() == ValueItem[0].upper() and Str1.upper() in ValueItem[1].split():
 | 
						|
                        _AppendFlag = False
 | 
						|
 | 
						|
                    _NewValueList.append(ValueItem)
 | 
						|
 | 
						|
                _ValueList = _NewValueList
 | 
						|
 | 
						|
            if _AppendFlag:
 | 
						|
                if not ItemList[0].upper() == DT.TAB_USER_EXTENSIONS.upper():
 | 
						|
                    _ValueList.append([_SectionName, Str1, Str2, LineNo])
 | 
						|
                else:
 | 
						|
                    if len(ItemList) == 4:
 | 
						|
                        _ValueList.append([_SectionName, Str1, Str2, ItemList[3], LineNo])
 | 
						|
 | 
						|
        self.SectionHeaderContent = deepcopy(_ValueList)
 | 
						|
 | 
						|
    ## GenSpecialSectionList
 | 
						|
    #
 | 
						|
    #  @param SpecialSectionList: a list of list, of which item's format
 | 
						|
    #                             (Comment, LineNum)
 | 
						|
    #  @param ContainerFile:      Input value for filename of Inf file
 | 
						|
    #
 | 
						|
    def InfSpecialCommentParser (self, SpecialSectionList, InfSectionObject, ContainerFile, SectionType):
 | 
						|
        ReFindSpecialCommentRe = re.compile(r"""#(?:\s*)\[(.*?)\](?:.*)""", re.DOTALL)
 | 
						|
        ReFindHobArchRe = re.compile(r"""[Hh][Oo][Bb]\.([^,]*)""", re.DOTALL)
 | 
						|
        if self.FileName:
 | 
						|
            pass
 | 
						|
        SpecialObjectList = []
 | 
						|
        ArchList = []
 | 
						|
        if SectionType == DT.TYPE_EVENT_SECTION:
 | 
						|
            TokenDict = DT.EVENT_TOKENS
 | 
						|
        elif SectionType == DT.TYPE_HOB_SECTION:
 | 
						|
            TokenDict = DT.HOB_TOKENS
 | 
						|
        else:
 | 
						|
            TokenDict = DT.BOOTMODE_TOKENS
 | 
						|
 | 
						|
        for List in SpecialSectionList:
 | 
						|
            #
 | 
						|
            # Hob has Arch attribute, need to be handled specially here
 | 
						|
            #
 | 
						|
            if SectionType == DT.TYPE_HOB_SECTION:
 | 
						|
 | 
						|
                MatchObject = ReFindSpecialCommentRe.search(List[0][0])
 | 
						|
                HobSectionStr = MatchObject.group(1)
 | 
						|
                ArchList = []
 | 
						|
                for Match in ReFindHobArchRe.finditer(HobSectionStr):
 | 
						|
                    Arch = Match.groups(1)[0].upper()
 | 
						|
                    ArchList.append(Arch)
 | 
						|
            CommentSoFar = ''
 | 
						|
            for Index in range(1, len(List)):
 | 
						|
                Result = ParseComment(List[Index], DT.ALL_USAGE_TOKENS, TokenDict, [], False)
 | 
						|
                Usage = Result[0]
 | 
						|
                Type = Result[1]
 | 
						|
                HelpText = Result[3]
 | 
						|
 | 
						|
                if Usage == DT.ITEM_UNDEFINED and Type == DT.ITEM_UNDEFINED:
 | 
						|
                    if HelpText is None:
 | 
						|
                        HelpText = ''
 | 
						|
                    if not HelpText.endswith('\n'):
 | 
						|
                        HelpText += '\n'
 | 
						|
                    CommentSoFar += HelpText
 | 
						|
                else:
 | 
						|
                    if HelpText:
 | 
						|
                        CommentSoFar += HelpText
 | 
						|
                    if SectionType == DT.TYPE_EVENT_SECTION:
 | 
						|
                        SpecialObject = InfEventObject()
 | 
						|
                        SpecialObject.SetEventType(Type)
 | 
						|
                        SpecialObject.SetUsage(Usage)
 | 
						|
                        SpecialObject.SetHelpString(CommentSoFar)
 | 
						|
                    elif SectionType == DT.TYPE_HOB_SECTION:
 | 
						|
                        SpecialObject = InfHobObject()
 | 
						|
                        SpecialObject.SetHobType(Type)
 | 
						|
                        SpecialObject.SetUsage(Usage)
 | 
						|
                        SpecialObject.SetHelpString(CommentSoFar)
 | 
						|
                        if len(ArchList) >= 1:
 | 
						|
                            SpecialObject.SetSupArchList(ArchList)
 | 
						|
                    else:
 | 
						|
                        SpecialObject = InfBootModeObject()
 | 
						|
                        SpecialObject.SetSupportedBootModes(Type)
 | 
						|
                        SpecialObject.SetUsage(Usage)
 | 
						|
                        SpecialObject.SetHelpString(CommentSoFar)
 | 
						|
 | 
						|
                    SpecialObjectList.append(SpecialObject)
 | 
						|
                    CommentSoFar = ''
 | 
						|
        if not InfSectionObject.SetSpecialComments(SpecialObjectList,
 | 
						|
                                                   SectionType):
 | 
						|
            Logger.Error('InfParser',
 | 
						|
                         FORMAT_INVALID,
 | 
						|
                         ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % (SectionType),
 | 
						|
                         ContainerFile
 | 
						|
                         )
 |