From f215e02bf85f68d3a6106c2a1f4f7f063f819064 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:17:27 +0200 Subject: Adding upstream version 7.0.14-dfsg. Signed-off-by: Daniel Baumann --- .../Source/Python/UPT/Parser/InfParserMisc.py | 216 +++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100755 src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py') diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py new file mode 100755 index 00000000..0a51ac28 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py @@ -0,0 +1,216 @@ +## @file +# This file contained the miscellaneous functions for INF parser +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +''' +InfParserMisc +''' + +## +# Import Modules +# +import re + + +from Library import DataType as DT + + +from Library.StringUtils import gMACRO_PATTERN +from Library.StringUtils import ReplaceMacro +from Object.Parser.InfMisc import ErrorInInf +from Logger.StringTable import ERR_MARCO_DEFINITION_MISS_ERROR + +# +# Global variable +# + +# +# Sections can exist in INF file +# +gINF_SECTION_DEF = { + DT.TAB_UNKNOWN.upper() : DT.MODEL_UNKNOWN, + DT.TAB_HEADER.upper() : DT.MODEL_META_DATA_FILE_HEADER, + DT.TAB_INF_DEFINES.upper() : DT.MODEL_META_DATA_DEFINE, + DT.TAB_BUILD_OPTIONS.upper() : DT.MODEL_META_DATA_BUILD_OPTION, + DT.TAB_LIBRARY_CLASSES.upper() : DT.MODEL_EFI_LIBRARY_CLASS, + DT.TAB_PACKAGES.upper() : DT.MODEL_META_DATA_PACKAGE, + DT.TAB_INF_FIXED_PCD.upper() : DT.MODEL_PCD_FIXED_AT_BUILD, + DT.TAB_INF_PATCH_PCD.upper() : DT.MODEL_PCD_PATCHABLE_IN_MODULE, + DT.TAB_INF_FEATURE_PCD.upper() : DT.MODEL_PCD_FEATURE_FLAG, + DT.TAB_INF_PCD_EX.upper() : DT.MODEL_PCD_DYNAMIC_EX, + DT.TAB_INF_PCD.upper() : DT.MODEL_PCD_DYNAMIC, + DT.TAB_SOURCES.upper() : DT.MODEL_EFI_SOURCE_FILE, + DT.TAB_GUIDS.upper() : DT.MODEL_EFI_GUID, + DT.TAB_PROTOCOLS.upper() : DT.MODEL_EFI_PROTOCOL, + DT.TAB_PPIS.upper() : DT.MODEL_EFI_PPI, + DT.TAB_DEPEX.upper() : DT.MODEL_EFI_DEPEX, + DT.TAB_BINARIES.upper() : DT.MODEL_EFI_BINARY_FILE, + DT.TAB_USER_EXTENSIONS.upper() : DT.MODEL_META_DATA_USER_EXTENSION + # + # EDK1 section + # TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE + # + } + +## InfExpandMacro +# +# Expand MACRO definition with MACROs defined in [Defines] section and specific section. +# The MACROs defined in specific section has high priority and will be expanded firstly. +# +# @param LineInfo Contain information of FileName, LineContent, LineNo +# @param GlobalMacros MACROs defined in INF [Defines] section +# @param SectionMacros MACROs defined in INF specific section +# @param Flag If the flag set to True, need to skip macros in a quoted string +# +def InfExpandMacro(Content, LineInfo, GlobalMacros=None, SectionMacros=None, Flag=False): + if GlobalMacros is None: + GlobalMacros = {} + if SectionMacros is None: + SectionMacros = {} + + FileName = LineInfo[0] + LineContent = LineInfo[1] + LineNo = LineInfo[2] + + # Don't expand macros in comments + if LineContent.strip().startswith("#"): + return Content + + NewLineInfo = (FileName, LineNo, LineContent) + + # + # First, replace MARCOs with value defined in specific section + # + Content = ReplaceMacro (Content, + SectionMacros, + False, + (LineContent, LineNo), + FileName, + Flag) + # + # Then replace MARCOs with value defined in [Defines] section + # + Content = ReplaceMacro (Content, + GlobalMacros, + False, + (LineContent, LineNo), + FileName, + Flag) + + MacroUsed = gMACRO_PATTERN.findall(Content) + # + # no macro found in String, stop replacing + # + if len(MacroUsed) == 0: + return Content + else: + for Macro in MacroUsed: + gQuotedMacro = re.compile(".*\".*\$\(%s\).*\".*"%(Macro)) + if not gQuotedMacro.match(Content): + # + # Still have MACROs can't be expanded. + # + ErrorInInf (ERR_MARCO_DEFINITION_MISS_ERROR, + LineInfo=NewLineInfo) + + return Content + + +## IsBinaryInf +# +# Judge whether the INF file is Binary INF or Common INF +# +# @param FileLineList A list contain all INF file content. +# +def IsBinaryInf(FileLineList): + if not FileLineList: + return False + + ReIsSourcesSection = re.compile("^\s*\[Sources.*\]\s.*$", re.IGNORECASE) + ReIsBinarySection = re.compile("^\s*\[Binaries.*\]\s.*$", re.IGNORECASE) + BinarySectionFoundFlag = False + + for Line in FileLineList: + if ReIsSourcesSection.match(Line): + return False + if ReIsBinarySection.match(Line): + BinarySectionFoundFlag = True + + if BinarySectionFoundFlag: + return True + + return False + + +## IsLibInstanceInfo +# +# Judge whether the string contain the information of ## @LIB_INSTANCES. +# +# @param String +# +# @return Flag +# +def IsLibInstanceInfo(String): + ReIsLibInstance = re.compile("^\s*##\s*@LIB_INSTANCES\s*$") + if ReIsLibInstance.match(String): + return True + else: + return False + + +## IsAsBuildOptionInfo +# +# Judge whether the string contain the information of ## @ASBUILD. +# +# @param String +# +# @return Flag +# +def IsAsBuildOptionInfo(String): + ReIsAsBuildInstance = re.compile("^\s*##\s*@AsBuilt\s*$") + if ReIsAsBuildInstance.match(String): + return True + else: + return False + + +class InfParserSectionRoot(object): + def __init__(self): + # + # Macros defined in [Define] section are file scope global + # + self.FileLocalMacros = {} + + # + # Current Section Header content. + # + self.SectionHeaderContent = [] + + # + # Last time Section Header content. + # + self.LastSectionHeaderContent = [] + + self.FullPath = '' + + self.InfDefSection = None + self.InfBuildOptionSection = None + self.InfLibraryClassSection = None + self.InfPackageSection = None + self.InfPcdSection = None + self.InfSourcesSection = None + self.InfUserExtensionSection = None + self.InfProtocolSection = None + self.InfPpiSection = None + self.InfGuidSection = None + self.InfDepexSection = None + self.InfPeiDepexSection = None + self.InfDxeDepexSection = None + self.InfSmmDepexSection = None + self.InfBinariesSection = None + self.InfHeader = None + self.InfSpecialCommentSection = None -- cgit v1.2.3