X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FGenFds%2FFdfParser.py;h=fb5fd85e0a825ebf3341e2ca706af9b0b37b57c3;hp=28af09b982005c419738912a702c933774b88576;hb=04797875d1d53e53e31eca4fa01bc3cf6929f39c;hpb=cfaaf99bdd412139ca7b9724e678429b2f2fb45f diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 28af09b982..fb5fd85e0a 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -1,87 +1,76 @@ ## @file # parse FDF file # -# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.
# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# SPDX-License-Identifier: BSD-2-Clause-Patent # ## # Import Modules # -import re - -import Fd -import Region -import Fv -import AprioriSection -import FfsInfStatement -import FfsFileStatement -import VerSection -import UiSection -import FvImageSection -import DataSection -import DepexSection -import CompressSection -import GuidSection -import Capsule -import CapsuleData -import Rule -import RuleComplexFile -import RuleSimpleFile -import EfiSection -import Vtf -import ComponentStatement -import OptionRom -import OptRomInfStatement -import OptRomFileStatement - -from GenFdsGlobalVariable import GenFdsGlobalVariable +from __future__ import print_function +from __future__ import absolute_import +from re import compile, DOTALL +from string import hexdigits +from uuid import UUID + from Common.BuildToolError import * from Common import EdkLogger -from Common.Misc import PathClass -from Common.String import NormPath -import Common.GlobalData as GlobalData -from Common.Expression import * +from Common.Misc import PathClass, tdict, ProcessDuplicatedInf +from Common.StringUtils import NormPath, ReplaceMacro from Common import GlobalData -from Common.String import ReplaceMacro - -from Common.Misc import tdict - -import re +from Common.Expression import * +from Common.DataType import * +from Common.MultipleWorkspace import MultipleWorkspace as mws import Common.LongFilePathOs as os from Common.LongFilePathSupport import OpenLongFilePath as open - -##define T_CHAR_SPACE ' ' -##define T_CHAR_NULL '\0' -##define T_CHAR_CR '\r' -##define T_CHAR_TAB '\t' -##define T_CHAR_LF '\n' -##define T_CHAR_SLASH '/' -##define T_CHAR_BACKSLASH '\\' -##define T_CHAR_DOUBLE_QUOTE '\"' -##define T_CHAR_SINGLE_QUOTE '\'' -##define T_CHAR_STAR '*' -##define T_CHAR_HASH '#' - -(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \ -T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \ -(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#') - -SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') - -RegionSizePattern = re.compile("\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*") -RegionSizeGuidPattern = re.compile("\s*(?P\w+\.\w+)\s*\|\s*(?P\w+\.\w+)\s*") -RegionOffsetPcdPattern = re.compile("\s*(?P\w+\.\w+)\s*$") -ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P\w+\.\w+)\s*") - +from Common.RangeExpression import RangeExpression +from collections import OrderedDict + +from .Fd import FD +from .Region import Region +from .Fv import FV +from .AprioriSection import AprioriSection +from .FfsInfStatement import FfsInfStatement +from .FfsFileStatement import FileStatement +from .VerSection import VerSection +from .UiSection import UiSection +from .FvImageSection import FvImageSection +from .DataSection import DataSection +from .DepexSection import DepexSection +from .CompressSection import CompressSection +from .GuidSection import GuidSection +from .Capsule import EFI_CERT_TYPE_PKCS7_GUID, EFI_CERT_TYPE_RSA2048_SHA256_GUID, Capsule +from .CapsuleData import CapsuleFfs, CapsulePayload, CapsuleFv, CapsuleFd, CapsuleAnyFile, CapsuleAfile +from .RuleComplexFile import RuleComplexFile +from .RuleSimpleFile import RuleSimpleFile +from .EfiSection import EfiSection +from .OptionRom import OPTIONROM +from .OptRomInfStatement import OptRomInfStatement, OverrideAttribs +from .OptRomFileStatement import OptRomFileStatement +from .GenFdsGlobalVariable import GenFdsGlobalVariable + +T_CHAR_CR = '\r' +T_CHAR_TAB = '\t' +T_CHAR_DOUBLE_QUOTE = '\"' +T_CHAR_SINGLE_QUOTE = '\'' +T_CHAR_BRACE_R = '}' + +SEPARATORS = {TAB_EQUAL_SPLIT, TAB_VALUE_SPLIT, TAB_COMMA_SPLIT, '{', T_CHAR_BRACE_R} +ALIGNMENTS = {"Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K", + "256K", "512K", "1M", "2M", "4M", "8M", "16M"} +ALIGNMENT_NOAUTO = ALIGNMENTS - {"Auto"} +CR_LB_SET = {T_CHAR_CR, TAB_LINE_BREAK} + +RegionSizePattern = compile("\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*") +RegionSizeGuidPattern = compile("\s*(?P\w+\.\w+[\.\w\[\]]*)\s*\|\s*(?P\w+\.\w+[\.\w\[\]]*)\s*") +RegionOffsetPcdPattern = compile("\s*(?P\w+\.\w+[\.\w\[\]]*)\s*$") +ShortcutPcdPattern = compile("\s*\w+\s*=\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P\w+\.\w+)\s*") +BaseAddrValuePattern = compile('^0[xX][0-9a-fA-F]+') +FileExtensionPattern = compile(r'([a-zA-Z][a-zA-Z0-9]*)') +TokenFindPattern = compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)') AllIncludeFileList = [] # Get the closest parent @@ -100,19 +89,18 @@ def IsValidInclude (File, Line): return True def GetRealFileLine (File, Line): - InsertedLines = 0 for Profile in AllIncludeFileList: if Profile.IsLineInFile(Line): return Profile.GetLineInFile(Line) elif Line >= Profile.InsertStartLineNumber and Profile.Level == 1: - InsertedLines += Profile.GetTotalLines() + InsertedLines += Profile.GetTotalLines() return (File, Line - InsertedLines) ## The exception class that used to report error messages when parsing FDF # -# Currently the "ToolName" is set to be "FDF Parser". +# Currently the "ToolName" is set to be "FdfParser". # class Warning (Exception): ## The constructor @@ -123,7 +111,6 @@ class Warning (Exception): # @param Line The Line number that error occurs # def __init__(self, Str, File = None, Line = None): - FileLineTuple = GetRealFileLine(File, Line) self.FileName = FileLineTuple[0] self.LineNumber = FileLineTuple[1] @@ -134,26 +121,29 @@ class Warning (Exception): def __str__(self): return self.Message -## The MACRO class that used to record macro value data when parsing include file -# -# -class MacroProfile : - ## The constructor - # - # @param self The object pointer - # @param FileName The file that to be parsed - # - def __init__(self, FileName, Line): - self.FileName = FileName - self.DefinedAtLine = Line - self.MacroName = None - self.MacroValue = None + # helper functions to facilitate consistency in warnings + # each function is for a different common warning + @staticmethod + def Expected(Str, File, Line): + return Warning("expected {}".format(Str), File, Line) + @staticmethod + def ExpectedEquals(File, Line): + return Warning.Expected("'='", File, Line) + @staticmethod + def ExpectedCurlyOpen(File, Line): + return Warning.Expected("'{'", File, Line) + @staticmethod + def ExpectedCurlyClose(File, Line): + return Warning.Expected("'}'", File, Line) + @staticmethod + def ExpectedBracketClose(File, Line): + return Warning.Expected("']'", File, Line) ## The Include file content class that used to record file data when parsing include file # # May raise Exception when opening file. # -class IncludeFileProfile : +class IncludeFileProfile: ## The constructor # # @param self The object pointer @@ -163,12 +153,11 @@ class IncludeFileProfile : self.FileName = FileName self.FileLinesList = [] try: - fsock = open(FileName, "rb", 0) - try: + with open(FileName, "r") as fsock: self.FileLinesList = fsock.readlines() - finally: - fsock.close() - + for index, line in enumerate(self.FileLinesList): + if not line.endswith(TAB_LINE_BREAK): + self.FileLinesList[index] += TAB_LINE_BREAK except: EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName) @@ -176,12 +165,12 @@ class IncludeFileProfile : self.InsertAdjust = 0 self.IncludeFileList = [] self.Level = 1 # first level include file - + def GetTotalLines(self): TotalLines = self.InsertAdjust + len(self.FileLinesList) for Profile in self.IncludeFileList: - TotalLines += Profile.GetTotalLines() + TotalLines += Profile.GetTotalLines() return TotalLines @@ -194,7 +183,7 @@ class IncludeFileProfile : def GetLineInFile(self, Line): if not self.IsLineInFile (Line): return (self.FileName, -1) - + InsertedLines = self.InsertStartLineNumber for Profile in self.IncludeFileList: @@ -205,13 +194,11 @@ class IncludeFileProfile : return (self.FileName, Line - InsertedLines + 1) - - ## The FDF content class that used to record file data when parsing FDF # # May raise Exception when opening file. # -class FileProfile : +class FileProfile: ## The constructor # # @param self The object pointer @@ -220,27 +207,25 @@ class FileProfile : def __init__(self, FileName): self.FileLinesList = [] try: - fsock = open(FileName, "rb", 0) - try: + with open(FileName, "r") as fsock: self.FileLinesList = fsock.readlines() - finally: - fsock.close() except: EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName) - - self.PcdDict = {} + self.FileName = FileName + self.PcdDict = OrderedDict() + self.PcdLocalDict = OrderedDict() self.InfList = [] + self.InfDict = {'ArchTBD':[]} # ECC will use this Dict and List information self.PcdFileLineDict = {} self.InfFileLineList = [] - + self.FdDict = {} self.FdNameNotSet = False self.FvDict = {} self.CapsuleDict = {} - self.VtfList = [] self.RuleDict = {} self.OptRomDict = {} self.FmpPayloadDict = {} @@ -266,56 +251,37 @@ class FdfParser: self.CurrentOffsetWithinLine = 0 self.CurrentFdName = None self.CurrentFvName = None - self.__Token = "" - self.__SkippedChars = "" + self._Token = "" + self._SkippedChars = "" GlobalData.gFdfParser = self # Used to section info - self.__CurSection = [] + self._CurSection = [] # Key: [section name, UI name, arch] - # Value: {MACRO_NAME : MACRO_VALUE} - self.__MacroDict = tdict(True, 3) - self.__PcdDict = {} + # Value: {MACRO_NAME: MACRO_VALUE} + self._MacroDict = tdict(True, 3) + self._PcdDict = OrderedDict() - self.__WipeOffArea = [] + self._WipeOffArea = [] if GenFdsGlobalVariable.WorkSpaceDir == '': GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE") - ## __IsWhiteSpace() method - # - # Whether char at current FileBufferPos is whitespace - # - # @param self The object pointer - # @param Char The char to test - # @retval True The char is a kind of white space - # @retval False The char is NOT a kind of white space - # - def __IsWhiteSpace(self, Char): - if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF): - return True - else: - return False - - ## __SkipWhiteSpace() method + ## _SkipWhiteSpace() method # - # Skip white spaces from current char, return number of chars skipped + # Skip white spaces from current char. # # @param self The object pointer - # @retval Count The number of chars skipped # - def __SkipWhiteSpace(self): - Count = 0 - while not self.__EndOfFile(): - Count += 1 - if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB): - self.__SkippedChars += str(self.__CurrentChar()) - self.__GetOneChar() - + def _SkipWhiteSpace(self): + while not self._EndOfFile(): + if self._CurrentChar() in {TAB_PRINTCHAR_NUL, T_CHAR_CR, TAB_LINE_BREAK, TAB_SPACE_SPLIT, T_CHAR_TAB}: + self._SkippedChars += str(self._CurrentChar()) + self._GetOneChar() else: - Count = Count - 1 - return Count + return + return - ## __EndOfFile() method + ## _EndOfFile() method # # Judge current buffer pos is at file end # @@ -323,17 +289,16 @@ class FdfParser: # @retval True Current File buffer position is at file end # @retval False Current File buffer position is NOT at file end # - def __EndOfFile(self): + def _EndOfFile(self): NumberOfLines = len(self.Profile.FileLinesList) SizeOfLastLine = len(self.Profile.FileLinesList[-1]) if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1: return True - elif self.CurrentLineNumber > NumberOfLines: + if self.CurrentLineNumber > NumberOfLines: return True - else: - return False + return False - ## __EndOfLine() method + ## _EndOfLine() method # # Judge current buffer pos is at line end # @@ -341,14 +306,13 @@ class FdfParser: # @retval True Current File buffer position is at line end # @retval False Current File buffer position is NOT at line end # - def __EndOfLine(self): + def _EndOfLine(self): if self.CurrentLineNumber > len(self.Profile.FileLinesList): return True SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) if self.CurrentOffsetWithinLine >= SizeOfCurrentLine: return True - else: - return False + return False ## Rewind() method # @@ -356,13 +320,13 @@ class FdfParser: # # @param self The object pointer # @param DestLine Optional new destination line number. - # @param DestOffset Optional new destination offset. + # @param DestOffset Optional new destination offset. # - def Rewind(self, DestLine = 1, DestOffset = 0): - self.CurrentLineNumber = DestLine - self.CurrentOffsetWithinLine = DestOffset + def Rewind(self, DestLine = 1, DestOffset = 0): + self.CurrentLineNumber = DestLine + self.CurrentOffsetWithinLine = DestOffset - ## __UndoOneChar() method + ## _UndoOneChar() method # # Go back one char in the file buffer # @@ -370,78 +334,78 @@ class FdfParser: # @retval True Successfully go back one char # @retval False Not able to go back one char as file beginning reached # - def __UndoOneChar(self): - + def _UndoOneChar(self): if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0: return False elif self.CurrentOffsetWithinLine == 0: self.CurrentLineNumber -= 1 - self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1 + self.CurrentOffsetWithinLine = len(self._CurrentLine()) - 1 else: self.CurrentOffsetWithinLine -= 1 return True - ## __GetOneChar() method + ## _GetOneChar() method # # Move forward one char in the file buffer # # @param self The object pointer # - def __GetOneChar(self): + def _GetOneChar(self): if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1: self.CurrentLineNumber += 1 self.CurrentOffsetWithinLine = 0 else: self.CurrentOffsetWithinLine += 1 - ## __CurrentChar() method + ## _CurrentChar() method # # Get the char pointed to by the file buffer pointer # # @param self The object pointer # @retval Char Current char # - def __CurrentChar(self): + def _CurrentChar(self): return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] - ## __NextChar() method + ## _NextChar() method # # Get the one char pass the char pointed to by the file buffer pointer # # @param self The object pointer # @retval Char Next char # - def __NextChar(self): + def _NextChar(self): if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1: return self.Profile.FileLinesList[self.CurrentLineNumber][0] - else: - return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1] + return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1] - ## __SetCurrentCharValue() method + ## _SetCurrentCharValue() method # # Modify the value of current char # # @param self The object pointer # @param Value The new value of current char # - def __SetCurrentCharValue(self, Value): + def _SetCurrentCharValue(self, Value): self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value - ## __CurrentLine() method + ## _CurrentLine() method # # Get the list that contains current line contents # # @param self The object pointer # @retval List current line contents # - def __CurrentLine(self): + def _CurrentLine(self): return self.Profile.FileLinesList[self.CurrentLineNumber - 1] - def __StringToList(self): + def _StringToList(self): self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList] + if not self.Profile.FileLinesList: + EdkLogger.error('FdfParser', FILE_READ_FAILURE, 'The file is empty!', File=self.FileName) self.Profile.FileLinesList[-1].append(' ') - def __ReplaceFragment(self, StartPos, EndPos, Value = ' '): + def _ReplaceFragment(self, StartPos, EndPos, Value = ' '): if StartPos[0] == EndPos[0]: Offset = StartPos[1] while Offset <= EndPos[1]: @@ -450,14 +414,14 @@ class FdfParser: return Offset = StartPos[1] - while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'): + while self.Profile.FileLinesList[StartPos[0]][Offset] not in CR_LB_SET: self.Profile.FileLinesList[StartPos[0]][Offset] = Value Offset += 1 Line = StartPos[0] while Line < EndPos[0]: Offset = 0 - while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'): + while self.Profile.FileLinesList[Line][Offset] not in CR_LB_SET: self.Profile.FileLinesList[Line][Offset] = Value Offset += 1 Line += 1 @@ -467,45 +431,29 @@ class FdfParser: self.Profile.FileLinesList[EndPos[0]][Offset] = Value Offset += 1 - - def __GetMacroName(self): - if not self.__GetNextToken(): - raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber) - MacroName = self.__Token - NotFlag = False - if MacroName.startswith('!'): - NotFlag = True - MacroName = MacroName[1:].strip() - - if not MacroName.startswith('$(') or not MacroName.endswith(')'): - raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName}, - self.FileName, self.CurrentLineNumber) - MacroName = MacroName[2:-1] - return MacroName, NotFlag - - def __SetMacroValue(self, Macro, Value): - if not self.__CurSection: + def _SetMacroValue(self, Macro, Value): + if not self._CurSection: return MacroDict = {} - if not self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]]: - self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]] = MacroDict + if not self._MacroDict[self._CurSection[0], self._CurSection[1], self._CurSection[2]]: + self._MacroDict[self._CurSection[0], self._CurSection[1], self._CurSection[2]] = MacroDict else: - MacroDict = self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]] + MacroDict = self._MacroDict[self._CurSection[0], self._CurSection[1], self._CurSection[2]] MacroDict[Macro] = Value - def __GetMacroValue(self, Macro): + def _GetMacroValue(self, Macro): # Highest priority if Macro in GlobalData.gCommandLineDefines: return GlobalData.gCommandLineDefines[Macro] if Macro in GlobalData.gGlobalDefines: return GlobalData.gGlobalDefines[Macro] - if self.__CurSection: - MacroDict = self.__MacroDict[ - self.__CurSection[0], - self.__CurSection[1], - self.__CurSection[2] + if self._CurSection: + MacroDict = self._MacroDict[ + self._CurSection[0], + self._CurSection[1], + self._CurSection[2] ] if MacroDict and Macro in MacroDict: return MacroDict[Macro] @@ -515,33 +463,26 @@ class FdfParser: return GlobalData.gPlatformDefines[Macro] return None - def __SectionHeaderParser(self, Section): + def _SectionHeaderParser(self, Section): # [Defines] # [FD.UiName]: use dummy instead if UI name is optional # [FV.UiName] # [Capsule.UiName] # [Rule]: don't take rule section into account, macro is not allowed in this section - # [VTF.arch.UiName, arch] # [OptionRom.DriverName] - self.__CurSection = [] - Section = Section.strip()[1:-1].upper().replace(' ', '').strip('.') - ItemList = Section.split('.') + self._CurSection = [] + Section = Section.strip()[1:-1].upper().replace(' ', '').strip(TAB_SPLIT) + ItemList = Section.split(TAB_SPLIT) Item = ItemList[0] if Item == '' or Item == 'RULE': return - if Item == 'DEFINES': - self.__CurSection = ['COMMON', 'COMMON', 'COMMON'] - elif Item == 'VTF' and len(ItemList) == 3: - UiName = ItemList[2] - Pos = UiName.find(',') - if Pos != -1: - UiName = UiName[:Pos] - self.__CurSection = ['VTF', UiName, ItemList[1]] + if Item == TAB_COMMON_DEFINES.upper(): + self._CurSection = [TAB_COMMON, TAB_COMMON, TAB_COMMON] elif len(ItemList) > 1: - self.__CurSection = [ItemList[0], ItemList[1], 'COMMON'] + self._CurSection = [ItemList[0], ItemList[1], TAB_COMMON] elif len(ItemList) > 0: - self.__CurSection = [ItemList[0], 'DUMMY', 'COMMON'] + self._CurSection = [ItemList[0], 'DUMMY', TAB_COMMON] ## PreprocessFile() method # @@ -553,7 +494,6 @@ class FdfParser: # @param self The object pointer # def PreprocessFile(self): - self.Rewind() InComment = False DoubleSlashComment = False @@ -561,12 +501,12 @@ class FdfParser: # HashComment in quoted string " " is ignored. InString = False - while not self.__EndOfFile(): + while not self._EndOfFile(): - if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment: + if self._CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment: InString = not InString # meet new line, then no longer in a comment for // and '#' - if self.__CurrentChar() == T_CHAR_LF: + if self._CurrentChar() == TAB_LINE_BREAK: self.CurrentLineNumber += 1 self.CurrentOffsetWithinLine = 0 if InComment and DoubleSlashComment: @@ -576,33 +516,33 @@ class FdfParser: InComment = False HashComment = False # check for */ comment end - elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH: - self.__SetCurrentCharValue(T_CHAR_SPACE) - self.__GetOneChar() - self.__SetCurrentCharValue(T_CHAR_SPACE) - self.__GetOneChar() + elif InComment and not DoubleSlashComment and not HashComment and self._CurrentChar() == TAB_STAR and self._NextChar() == TAB_BACK_SLASH: + self._SetCurrentCharValue(TAB_SPACE_SPLIT) + self._GetOneChar() + self._SetCurrentCharValue(TAB_SPACE_SPLIT) + self._GetOneChar() InComment = False # set comments to spaces elif InComment: - self.__SetCurrentCharValue(T_CHAR_SPACE) - self.__GetOneChar() + self._SetCurrentCharValue(TAB_SPACE_SPLIT) + self._GetOneChar() # check for // comment - elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine(): + elif self._CurrentChar() == TAB_BACK_SLASH and self._NextChar() == TAB_BACK_SLASH and not self._EndOfLine(): InComment = True DoubleSlashComment = True # check for '#' comment - elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString: + elif self._CurrentChar() == TAB_COMMENT_SPLIT and not self._EndOfLine() and not InString: InComment = True HashComment = True # check for /* comment start - elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR: - self.__SetCurrentCharValue( T_CHAR_SPACE) - self.__GetOneChar() - self.__SetCurrentCharValue( T_CHAR_SPACE) - self.__GetOneChar() + elif self._CurrentChar() == TAB_BACK_SLASH and self._NextChar() == TAB_STAR: + self._SetCurrentCharValue(TAB_SPACE_SPLIT) + self._GetOneChar() + self._SetCurrentCharValue(TAB_SPACE_SPLIT) + self._GetOneChar() InComment = True else: - self.__GetOneChar() + self._GetOneChar() # restore from ListOfList to ListOfString self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList] @@ -616,29 +556,48 @@ class FdfParser: # @param self The object pointer # def PreprocessIncludeFile(self): - # nested include support + # nested include support Processed = False - while self.__GetNextToken(): - - if self.__Token == '!include': + MacroDict = {} + while self._GetNextToken(): + + if self._Token == TAB_DEFINE: + if not self._GetNextToken(): + raise Warning.Expected("Macro name", self.FileName, self.CurrentLineNumber) + Macro = self._Token + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + Value = self._GetExpression() + MacroDict[Macro] = Value + + elif self._Token == TAB_INCLUDE: Processed = True IncludeLine = self.CurrentLineNumber - IncludeOffset = self.CurrentOffsetWithinLine - len('!include') - if not self.__GetNextToken(): - raise Warning("expected include file name", self.FileName, self.CurrentLineNumber) - IncFileName = self.__Token - __IncludeMacros = {} - for Macro in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']: - MacroVal = self.__GetMacroValue(Macro) - if MacroVal: - __IncludeMacros[Macro] = MacroVal + IncludeOffset = self.CurrentOffsetWithinLine - len(TAB_INCLUDE) + if not self._GetNextToken(): + raise Warning.Expected("include file name", self.FileName, self.CurrentLineNumber) + IncFileName = self._Token + PreIndex = 0 + StartPos = IncFileName.find('$(', PreIndex) + EndPos = IncFileName.find(')', StartPos+2) + while StartPos != -1 and EndPos != -1: + Macro = IncFileName[StartPos+2: EndPos] + MacroVal = self._GetMacroValue(Macro) + if not MacroVal: + if Macro in MacroDict: + MacroVal = MacroDict[Macro] + if MacroVal is not None: + IncFileName = IncFileName.replace('$(' + Macro + ')', MacroVal, 1) + if MacroVal.find('$(') != -1: + PreIndex = StartPos + else: + PreIndex = StartPos + len(MacroVal) + else: + raise Warning("The Macro %s is not defined" %Macro, self.FileName, self.CurrentLineNumber) + StartPos = IncFileName.find('$(', PreIndex) + EndPos = IncFileName.find(')', StartPos+2) - try: - IncludedFile = NormPath(ReplaceMacro(IncFileName, __IncludeMacros, RaiseError=True)) - except: - raise Warning("only these system environment variables are permitted to start the path of the included file: " - "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)", - self.FileName, self.CurrentLineNumber) + IncludedFile = NormPath(IncFileName) # # First search the include file under the same directory as FDF file # @@ -662,7 +621,7 @@ class FdfParser: IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) ErrorCode = IncludedFile1.Validate()[0] if ErrorCode != 0: - raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace), + raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace), self.FileName, self.CurrentLineNumber) if not IsValidInclude (IncludedFile1.Path, self.CurrentLineNumber): @@ -675,14 +634,14 @@ class FdfParser: # list index of the insertion, note that line number is 'CurrentLine + 1' InsertAtLine = CurrentLine ParentProfile = GetParentAtLine (CurrentLine) - if ParentProfile != None: + if ParentProfile is not None: ParentProfile.IncludeFileList.insert(0, IncFileProfile) IncFileProfile.Level = ParentProfile.Level + 1 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1 # deal with remaining portions after "!include filename", if exists. - if self.__GetNextToken(): + if self._GetNextToken(): if self.CurrentLineNumber == CurrentLine: - RemainingLine = self.__CurrentLine()[CurrentOffset:] + RemainingLine = self._CurrentLine()[CurrentOffset:] self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine) IncFileProfile.InsertAdjust += 1 self.CurrentLineNumber += 1 @@ -698,24 +657,25 @@ class FdfParser: # comment out the processed include file statement TempList = list(self.Profile.FileLinesList[IncludeLine - 1]) - TempList.insert(IncludeOffset, '#') + TempList.insert(IncludeOffset, TAB_COMMENT_SPLIT) self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList) if Processed: # Nested and back-to-back support self.Rewind(DestLine = IncFileProfile.InsertStartLineNumber - 1) Processed = False # Preprocess done. self.Rewind() - - def __GetIfListCurrentItemStat(self, IfList): + + @staticmethod + def _GetIfListCurrentItemStat(IfList): if len(IfList) == 0: return True - + for Item in IfList: if Item[1] == False: return False - + return True - + ## PreprocessConditionalStatement() method # # Preprocess conditional statement. @@ -728,35 +688,35 @@ class FdfParser: IfList = [] RegionLayoutLine = 0 ReplacedLine = -1 - while self.__GetNextToken(): + while self._GetNextToken(): # Determine section name and the location dependent macro - if self.__GetIfListCurrentItemStat(IfList): - if self.__Token.startswith('['): - Header = self.__Token - if not self.__Token.endswith(']'): - self.__SkipToToken(']') - Header += self.__SkippedChars + if self._GetIfListCurrentItemStat(IfList): + if self._Token.startswith(TAB_SECTION_START): + Header = self._Token + if not self._Token.endswith(TAB_SECTION_END): + self._SkipToToken(TAB_SECTION_END) + Header += self._SkippedChars if Header.find('$(') != -1: raise Warning("macro cannot be used in section header", self.FileName, self.CurrentLineNumber) - self.__SectionHeaderParser(Header) + self._SectionHeaderParser(Header) continue # Replace macros except in RULE section or out of section - elif self.__CurSection and ReplacedLine != self.CurrentLineNumber: + elif self._CurSection and ReplacedLine != self.CurrentLineNumber: ReplacedLine = self.CurrentLineNumber - self.__UndoToken() + self._UndoToken() CurLine = self.Profile.FileLinesList[ReplacedLine - 1] PreIndex = 0 StartPos = CurLine.find('$(', PreIndex) EndPos = CurLine.find(')', StartPos+2) - while StartPos != -1 and EndPos != -1 and self.__Token not in ['!ifdef', '!ifndef', '!if', '!elseif']: - MacroName = CurLine[StartPos+2 : EndPos] - MacorValue = self.__GetMacroValue(MacroName) - if MacorValue != None: - CurLine = CurLine.replace('$(' + MacroName + ')', MacorValue, 1) - if MacorValue.find('$(') != -1: + while StartPos != -1 and EndPos != -1 and self._Token not in {TAB_IF_DEF, TAB_IF_N_DEF, TAB_IF, TAB_ELSE_IF}: + MacroName = CurLine[StartPos+2: EndPos] + MacroValue = self._GetMacroValue(MacroName) + if MacroValue is not None: + CurLine = CurLine.replace('$(' + MacroName + ')', MacroValue, 1) + if MacroValue.find('$(') != -1: PreIndex = StartPos else: - PreIndex = StartPos + len(MacorValue) + PreIndex = StartPos + len(MacroValue) else: PreIndex = EndPos + 1 StartPos = CurLine.find('$(', PreIndex) @@ -764,73 +724,74 @@ class FdfParser: self.Profile.FileLinesList[ReplacedLine - 1] = CurLine continue - if self.__Token == 'DEFINE': - if self.__GetIfListCurrentItemStat(IfList): - if not self.__CurSection: + if self._Token == TAB_DEFINE: + if self._GetIfListCurrentItemStat(IfList): + if not self._CurSection: raise Warning("macro cannot be defined in Rule section or out of section", self.FileName, self.CurrentLineNumber) DefineLine = self.CurrentLineNumber - 1 - DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE') - if not self.__GetNextToken(): - raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber) - Macro = self.__Token - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - Value = self.__GetExpression() - self.__SetMacroValue(Macro, Value) - self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) - elif self.__Token == 'SET': - if not self.__GetIfListCurrentItemStat(IfList): + DefineOffset = self.CurrentOffsetWithinLine - len(TAB_DEFINE) + if not self._GetNextToken(): + raise Warning.Expected("Macro name", self.FileName, self.CurrentLineNumber) + Macro = self._Token + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + Value = self._GetExpression() + self._SetMacroValue(Macro, Value) + self._WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + elif self._Token == 'SET': + if not self._GetIfListCurrentItemStat(IfList): continue SetLine = self.CurrentLineNumber - 1 SetOffset = self.CurrentOffsetWithinLine - len('SET') - PcdPair = self.__GetNextPcdName() + PcdPair = self._GetNextPcdSettings() PcdName = "%s.%s" % (PcdPair[1], PcdPair[0]) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - Value = self.__GetExpression() - Value = self.__EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True) + Value = self._GetExpression() + Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True) - self.__PcdDict[PcdName] = Value + self._PcdDict[PcdName] = Value self.Profile.PcdDict[PcdPair] = Value + self.SetPcdLocalation(PcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple - self.__WipeOffArea.append(((SetLine, SetOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) - elif self.__Token in ('!ifdef', '!ifndef', '!if'): - IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token)) + self._WipeOffArea.append(((SetLine, SetOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + elif self._Token in {TAB_IF_DEF, TAB_IF_N_DEF, TAB_IF}: + IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self._Token)) IfList.append([IfStartPos, None, None]) - CondLabel = self.__Token - Expression = self.__GetExpression() - - if CondLabel == '!if': - ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval') + CondLabel = self._Token + Expression = self._GetExpression() + + if CondLabel == TAB_IF: + ConditionSatisfied = self._EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval') else: - ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'in') - if CondLabel == '!ifndef': + ConditionSatisfied = self._EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'in') + if CondLabel == TAB_IF_N_DEF: ConditionSatisfied = not ConditionSatisfied BranchDetermined = ConditionSatisfied IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined] if ConditionSatisfied: - self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) - elif self.__Token in ('!elseif', '!else'): - ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token)) + self._WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + elif self._Token in {TAB_ELSE_IF, TAB_ELSE}: + ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self._Token)) if len(IfList) <= 0: raise Warning("Missing !if statement", self.FileName, self.CurrentLineNumber) if IfList[-1][1]: IfList[-1] = [ElseStartPos, False, True] - self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + self._WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) else: - self.__WipeOffArea.append((IfList[-1][0], ElseStartPos)) + self._WipeOffArea.append((IfList[-1][0], ElseStartPos)) IfList[-1] = [ElseStartPos, True, IfList[-1][2]] - if self.__Token == '!elseif': - Expression = self.__GetExpression() - ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval') + if self._Token == TAB_ELSE_IF: + Expression = self._GetExpression() + ConditionSatisfied = self._EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval') IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]] if IfList[-1][1]: @@ -838,14 +799,14 @@ class FdfParser: IfList[-1][1] = False else: IfList[-1][2] = True - self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) - elif self.__Token == '!endif': + self._WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + elif self._Token == '!endif': if len(IfList) <= 0: raise Warning("Missing !if statement", self.FileName, self.CurrentLineNumber) if IfList[-1][1]: - self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + self._WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) else: - self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + self._WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) IfList.pop() elif not IfList: # Don't use PCDs inside conditional directive @@ -854,7 +815,7 @@ class FdfParser: continue SetPcd = ShortcutPcdPattern.match(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) if SetPcd: - self.__PcdDict[SetPcd.group('name')] = SetPcd.group('value') + self._PcdDict[SetPcd.group('name')] = SetPcd.group('value') RegionLayoutLine = self.CurrentLineNumber continue RegionSize = RegionSizePattern.match(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) @@ -865,64 +826,69 @@ class FdfParser: if not RegionSizeGuid: RegionLayoutLine = self.CurrentLineNumber + 1 continue - self.__PcdDict[RegionSizeGuid.group('base')] = RegionSize.group('base') - self.__PcdDict[RegionSizeGuid.group('size')] = RegionSize.group('size') + self._PcdDict[RegionSizeGuid.group('base')] = RegionSize.group('base') + self._PcdDict[RegionSizeGuid.group('size')] = RegionSize.group('size') RegionLayoutLine = self.CurrentLineNumber + 1 if IfList: raise Warning("Missing !endif", self.FileName, self.CurrentLineNumber) self.Rewind() - def __CollectMacroPcd(self): + def _CollectMacroPcd(self): MacroDict = {} # PCD macro MacroDict.update(GlobalData.gPlatformPcds) - MacroDict.update(self.__PcdDict) + MacroDict.update(self._PcdDict) # Lowest priority MacroDict.update(GlobalData.gPlatformDefines) - if self.__CurSection: + if self._CurSection: # Defines macro - ScopeMacro = self.__MacroDict['COMMON', 'COMMON', 'COMMON'] + ScopeMacro = self._MacroDict[TAB_COMMON, TAB_COMMON, TAB_COMMON] if ScopeMacro: MacroDict.update(ScopeMacro) - + # Section macro - ScopeMacro = self.__MacroDict[ - self.__CurSection[0], - self.__CurSection[1], - self.__CurSection[2] + ScopeMacro = self._MacroDict[ + self._CurSection[0], + self._CurSection[1], + self._CurSection[2] ] if ScopeMacro: MacroDict.update(ScopeMacro) MacroDict.update(GlobalData.gGlobalDefines) MacroDict.update(GlobalData.gCommandLineDefines) + for Item in GlobalData.BuildOptionPcd: + if isinstance(Item, tuple): + continue + PcdName, TmpValue = Item.split(TAB_EQUAL_SPLIT) + TmpValue = BuildOptionValue(TmpValue, {}) + MacroDict[PcdName.strip()] = TmpValue # Highest priority return MacroDict - def __EvaluateConditional(self, Expression, Line, Op = None, Value = None): - FileLineTuple = GetRealFileLine(self.FileName, Line) - MacroPcdDict = self.__CollectMacroPcd() + def _EvaluateConditional(self, Expression, Line, Op = None, Value = None): + MacroPcdDict = self._CollectMacroPcd() if Op == 'eval': try: if Value: return ValueExpression(Expression, MacroPcdDict)(True) else: return ValueExpression(Expression, MacroPcdDict)() - except WrnExpression, Excpt: - # + except WrnExpression as Excpt: + # # Catch expression evaluation warning here. We need to report # the precise number of line and return the evaluation result # EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt), - File=self.FileName, ExtraData=self.__CurrentLine(), + File=self.FileName, ExtraData=self._CurrentLine(), Line=Line) return Excpt.result - except Exception, Excpt: + except Exception as Excpt: if hasattr(Excpt, 'Pcd'): if Excpt.Pcd in GlobalData.gPlatformOtherPcds: Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd] @@ -930,21 +896,21 @@ class FdfParser: " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section" " of the DSC file (%s), and it is currently defined in this section:" " %s, line #: %d." % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE'], Info[0], Info[1]), - *FileLineTuple) + self.FileName, Line) else: raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE']), - *FileLineTuple) + self.FileName, Line) else: - raise Warning(str(Excpt), *FileLineTuple) + raise Warning(str(Excpt), self.FileName, Line) else: if Expression.startswith('$(') and Expression[-1] == ')': - Expression = Expression[2:-1] + Expression = Expression[2:-1] return Expression in MacroPcdDict - ## __IsToken() method + ## _IsToken() method # # Check whether input string is found from current char position along - # If found, the string value is put into self.__Token + # If found, the string value is put into self._Token # # @param self The object pointer # @param String The string to search @@ -952,26 +918,26 @@ class FdfParser: # @retval True Successfully find string, file buffer pointer moved forward # @retval False Not able to find string, file buffer pointer not changed # - def __IsToken(self, String, IgnoreCase = False): - self.__SkipWhiteSpace() + def _IsToken(self, String, IgnoreCase = False): + self._SkipWhiteSpace() # Only consider the same line, no multi-line token allowed StartPos = self.CurrentOffsetWithinLine index = -1 if IgnoreCase: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].upper().find(String.upper()) else: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].find(String) if index == 0: self.CurrentOffsetWithinLine += len(String) - self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine] + self._Token = self._CurrentLine()[StartPos: self.CurrentOffsetWithinLine] return True return False - ## __IsKeyword() method + ## _IsKeyword() method # # Check whether input keyword is found from current char position along, whole word only! - # If found, the string value is put into self.__Token + # If found, the string value is put into self._Token # # @param self The object pointer # @param Keyword The string to search @@ -979,94 +945,117 @@ class FdfParser: # @retval True Successfully find string, file buffer pointer moved forward # @retval False Not able to find string, file buffer pointer not changed # - def __IsKeyword(self, KeyWord, IgnoreCase = False): - self.__SkipWhiteSpace() + def _IsKeyword(self, KeyWord, IgnoreCase = False): + self._SkipWhiteSpace() # Only consider the same line, no multi-line token allowed StartPos = self.CurrentOffsetWithinLine index = -1 if IgnoreCase: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper()) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].upper().find(KeyWord.upper()) else: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].find(KeyWord) if index == 0: - followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)] - if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE: + followingChar = self._CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)] + if not str(followingChar).isspace() and followingChar not in SEPARATORS: return False self.CurrentOffsetWithinLine += len(KeyWord) - self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine] + self._Token = self._CurrentLine()[StartPos: self.CurrentOffsetWithinLine] return True return False - def __GetExpression(self): + def _GetExpression(self): Line = self.Profile.FileLinesList[self.CurrentLineNumber - 1] Index = len(Line) - 1 - while Line[Index] in ['\r', '\n']: + while Line[Index] in CR_LB_SET: Index -= 1 ExpressionString = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:Index+1] self.CurrentOffsetWithinLine += len(ExpressionString) ExpressionString = ExpressionString.strip() return ExpressionString - ## __GetNextWord() method + ## _GetNextWord() method # # Get next C name from file lines - # If found, the string value is put into self.__Token + # If found, the string value is put into self._Token # # @param self The object pointer # @retval True Successfully find a C name string, file buffer pointer moved forward # @retval False Not able to find a C name string, file buffer pointer not changed # - def __GetNextWord(self): - self.__SkipWhiteSpace() - if self.__EndOfFile(): + def _GetNextWord(self): + self._SkipWhiteSpace() + if self._EndOfFile(): return False - TempChar = self.__CurrentChar() + TempChar = self._CurrentChar() StartPos = self.CurrentOffsetWithinLine if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_': - self.__GetOneChar() - while not self.__EndOfLine(): - TempChar = self.__CurrentChar() + self._GetOneChar() + while not self._EndOfLine(): + TempChar = self._CurrentChar() if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \ or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-': - self.__GetOneChar() + self._GetOneChar() + + else: + break + + self._Token = self._CurrentLine()[StartPos: self.CurrentOffsetWithinLine] + return True + + return False + + def _GetNextPcdWord(self): + self._SkipWhiteSpace() + if self._EndOfFile(): + return False + + TempChar = self._CurrentChar() + StartPos = self.CurrentOffsetWithinLine + if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_' or TempChar == TAB_SECTION_START or TempChar == TAB_SECTION_END: + self._GetOneChar() + while not self._EndOfLine(): + TempChar = self._CurrentChar() + if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \ + or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-' or TempChar == TAB_SECTION_START or TempChar == TAB_SECTION_END: + self._GetOneChar() else: break - self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine] + self._Token = self._CurrentLine()[StartPos: self.CurrentOffsetWithinLine] return True return False - ## __GetNextToken() method + ## _GetNextToken() method # - # Get next token unit before a seperator - # If found, the string value is put into self.__Token + # Get next token unit before a separator + # If found, the string value is put into self._Token # # @param self The object pointer # @retval True Successfully find a token unit, file buffer pointer moved forward # @retval False Not able to find a token unit, file buffer pointer not changed # - def __GetNextToken(self): + def _GetNextToken(self): # Skip leading spaces, if exist. - self.__SkipWhiteSpace() - if self.__EndOfFile(): + self._SkipWhiteSpace() + if self._EndOfFile(): return False # Record the token start position, the position of the first non-space char. StartPos = self.CurrentOffsetWithinLine StartLine = self.CurrentLineNumber while StartLine == self.CurrentLineNumber: - TempChar = self.__CurrentChar() - # Try to find the end char that is not a space and not in seperator tuple. + TempChar = self._CurrentChar() + # Try to find the end char that is not a space and not in separator tuple. # That is, when we got a space or any char in the tuple, we got the end of token. - if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE: - self.__GetOneChar() - # if we happen to meet a seperator as the first char, we must proceed to get it. - # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens. - elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE: - self.__GetOneChar() + if not str(TempChar).isspace() and TempChar not in SEPARATORS: + self._GetOneChar() + # if we happen to meet a separator as the first char, we must proceed to get it. + # That is, we get a token that is a separator char. normally it is the boundary of other tokens. + elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS: + self._GetOneChar() break else: break @@ -1076,65 +1065,60 @@ class FdfParser: EndPos = self.CurrentOffsetWithinLine if self.CurrentLineNumber != StartLine: EndPos = len(self.Profile.FileLinesList[StartLine-1]) - self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos] + self._Token = self.Profile.FileLinesList[StartLine-1][StartPos: EndPos] + if self._Token.lower() in {TAB_IF, TAB_END_IF, TAB_ELSE_IF, TAB_ELSE, TAB_IF_DEF, TAB_IF_N_DEF, TAB_ERROR, TAB_INCLUDE}: + self._Token = self._Token.lower() if StartPos != self.CurrentOffsetWithinLine: return True else: return False - def __GetNextOp(self): - # Skip leading spaces, if exist. - self.__SkipWhiteSpace() - if self.__EndOfFile(): - return False - # Record the token start position, the position of the first non-space char. - StartPos = self.CurrentOffsetWithinLine - while not self.__EndOfLine(): - TempChar = self.__CurrentChar() - # Try to find the end char that is not a space - if not str(TempChar).isspace(): - self.__GetOneChar() - else: - break - else: - return False - - if StartPos != self.CurrentOffsetWithinLine: - self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine] - return True - else: - return False - ## __GetNextGuid() method + ## _GetNextGuid() method # - # Get next token unit before a seperator - # If found, the GUID string is put into self.__Token + # Get next token unit before a separator + # If found, the GUID string is put into self._Token # # @param self The object pointer # @retval True Successfully find a registry format GUID, file buffer pointer moved forward # @retval False Not able to find a registry format GUID, file buffer pointer not changed # - def __GetNextGuid(self): - - if not self.__GetNextToken(): + def _GetNextGuid(self): + if not self._GetNextToken(): return False - p = re.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}') - if p.match(self.__Token) != None: + if GlobalData.gGuidPattern.match(self._Token) is not None: return True else: - self.__UndoToken() + self._UndoToken() return False - ## __UndoToken() method + @staticmethod + def _Verify(Name, Value, Scope): + # value verification only applies to numeric values. + if Scope not in TAB_PCD_NUMERIC_TYPES: + return + + ValueNumber = 0 + try: + ValueNumber = int(Value, 0) + except: + EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name) + if ValueNumber < 0: + EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name) + if ValueNumber > MAX_VAL_TYPE[Scope]: + EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name) + return True + + ## _UndoToken() method # # Go back one token unit in file buffer # # @param self The object pointer # - def __UndoToken(self): - self.__UndoOneChar() - while self.__CurrentChar().isspace(): - if not self.__UndoOneChar(): - self.__GetOneChar() + def _UndoToken(self): + self._UndoOneChar() + while self._CurrentChar().isspace(): + if not self._UndoOneChar(): + self._GetOneChar() return @@ -1142,146 +1126,110 @@ class FdfParser: CurrentLine = self.CurrentLineNumber while CurrentLine == self.CurrentLineNumber: - TempChar = self.__CurrentChar() - # Try to find the end char that is not a space and not in seperator tuple. + TempChar = self._CurrentChar() + # Try to find the end char that is not a space and not in separator tuple. # That is, when we got a space or any char in the tuple, we got the end of token. - if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE: - if not self.__UndoOneChar(): + if not str(TempChar).isspace() and not TempChar in SEPARATORS: + if not self._UndoOneChar(): return - # if we happen to meet a seperator as the first char, we must proceed to get it. - # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens. - elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE: + # if we happen to meet a separator as the first char, we must proceed to get it. + # That is, we get a token that is a separator char. normally it is the boundary of other tokens. + elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS: return else: break - self.__GetOneChar() + self._GetOneChar() - ## __HexDigit() method + ## _GetNextHexNumber() method # - # Whether char input is a Hex data bit - # - # @param self The object pointer - # @param TempChar The char to test - # @retval True The char is a Hex data bit - # @retval False The char is NOT a Hex data bit - # - def __HexDigit(self, TempChar): - if (TempChar >= 'a' and TempChar <= 'f') or (TempChar >= 'A' and TempChar <= 'F') \ - or (TempChar >= '0' and TempChar <= '9'): - return True - else: - return False - - def __IsHex(self, HexStr): - if not HexStr.upper().startswith("0X"): - return False - if len(self.__Token) <= 2: - return False - charList = [c for c in HexStr[2 : ] if not self.__HexDigit( c)] - if len(charList) == 0: - return True - else: - return False - ## __GetNextHexNumber() method - # - # Get next HEX data before a seperator - # If found, the HEX data is put into self.__Token + # Get next HEX data before a separator + # If found, the HEX data is put into self._Token # # @param self The object pointer # @retval True Successfully find a HEX data, file buffer pointer moved forward # @retval False Not able to find a HEX data, file buffer pointer not changed # - def __GetNextHexNumber(self): - if not self.__GetNextToken(): + def _GetNextHexNumber(self): + if not self._GetNextToken(): return False - if self.__IsHex(self.__Token): + if GlobalData.gHexPatternAll.match(self._Token): return True else: - self.__UndoToken() + self._UndoToken() return False - ## __GetNextDecimalNumber() method + ## _GetNextDecimalNumber() method # - # Get next decimal data before a seperator - # If found, the decimal data is put into self.__Token + # Get next decimal data before a separator + # If found, the decimal data is put into self._Token # # @param self The object pointer # @retval True Successfully find a decimal data, file buffer pointer moved forward # @retval False Not able to find a decimal data, file buffer pointer not changed # - def __GetNextDecimalNumber(self): - if not self.__GetNextToken(): + def _GetNextDecimalNumber(self): + if not self._GetNextToken(): return False - if self.__Token.isdigit(): + if self._Token.isdigit(): return True else: - self.__UndoToken() + self._UndoToken() return False - ## __GetNextPcdName() method - # - # Get next PCD token space C name and PCD C name pair before a seperator - # If found, the decimal data is put into self.__Token - # - # @param self The object pointer - # @retval Tuple PCD C name and PCD token space C name pair - # - def __GetNextPcdName(self): - if not self.__GetNextWord(): - raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) - pcdTokenSpaceCName = self.__Token + def _GetNextPcdSettings(self): + if not self._GetNextWord(): + raise Warning.Expected("", self.FileName, self.CurrentLineNumber) + pcdTokenSpaceCName = self._Token - if not self.__IsToken( "."): - raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SPLIT): + raise Warning.Expected(".", self.FileName, self.CurrentLineNumber) - if not self.__GetNextWord(): - raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) - pcdCName = self.__Token + if not self._GetNextWord(): + raise Warning.Expected("", self.FileName, self.CurrentLineNumber) + pcdCName = self._Token - return (pcdCName, pcdTokenSpaceCName) + Fields = [] + while self._IsToken(TAB_SPLIT): + if not self._GetNextPcdWord(): + raise Warning.Expected("Pcd Fields", self.FileName, self.CurrentLineNumber) + Fields.append(self._Token) - ## __GetStringData() method + return (pcdCName, pcdTokenSpaceCName,TAB_SPLIT.join(Fields)) + + ## _GetStringData() method # # Get string contents quoted in "" - # If found, the decimal data is put into self.__Token + # If found, the decimal data is put into self._Token # # @param self The object pointer # @retval True Successfully find a string data, file buffer pointer moved forward # @retval False Not able to find a string data, file buffer pointer not changed # - def __GetStringData(self): - if self.__Token.startswith("\"") or self.__Token.startswith("L\""): - self.__UndoToken() - self.__SkipToToken("\"") - currentLineNumber = self.CurrentLineNumber - - if not self.__SkipToToken("\""): - raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber) - if currentLineNumber != self.CurrentLineNumber: - raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber) - self.__Token = self.__SkippedChars.rstrip('\"') - return True - - elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"): - self.__UndoToken() - self.__SkipToToken("\'") - currentLineNumber = self.CurrentLineNumber - - if not self.__SkipToToken("\'"): - raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber) - if currentLineNumber != self.CurrentLineNumber: - raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber) - self.__Token = self.__SkippedChars.rstrip('\'') - return True - + def _GetStringData(self): + QuoteToUse = None + if self._Token.startswith(T_CHAR_DOUBLE_QUOTE) or self._Token.startswith("L\""): + QuoteToUse = T_CHAR_DOUBLE_QUOTE + elif self._Token.startswith(T_CHAR_SINGLE_QUOTE) or self._Token.startswith("L\'"): + QuoteToUse = T_CHAR_SINGLE_QUOTE else: return False - ## __SkipToToken() method + self._UndoToken() + self._SkipToToken(QuoteToUse) + currentLineNumber = self.CurrentLineNumber + + if not self._SkipToToken(QuoteToUse): + raise Warning(QuoteToUse, self.FileName, self.CurrentLineNumber) + if currentLineNumber != self.CurrentLineNumber: + raise Warning(QuoteToUse, self.FileName, self.CurrentLineNumber) + self._Token = self._SkippedChars.rstrip(QuoteToUse) + return True + + ## _SkipToToken() method # # Search forward in file buffer for the string - # The skipped chars are put into self.__SkippedChars + # The skipped chars are put into self._SkippedChars # # @param self The object pointer # @param String The string to search @@ -1289,25 +1237,25 @@ class FdfParser: # @retval True Successfully find the string, file buffer pointer moved forward # @retval False Not able to find the string, file buffer pointer not changed # - def __SkipToToken(self, String, IgnoreCase = False): + def _SkipToToken(self, String, IgnoreCase = False): StartPos = self.GetFileBufferPos() - self.__SkippedChars = "" - while not self.__EndOfFile(): + self._SkippedChars = "" + while not self._EndOfFile(): index = -1 if IgnoreCase: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].upper().find(String.upper()) else: - index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String) + index = self._CurrentLine()[self.CurrentOffsetWithinLine: ].find(String) if index == 0: self.CurrentOffsetWithinLine += len(String) - self.__SkippedChars += String + self._SkippedChars += String return True - self.__SkippedChars += str(self.__CurrentChar()) - self.__GetOneChar() + self._SkippedChars += str(self._CurrentChar()) + self._GetOneChar() - self.SetFileBufferPos( StartPos) - self.__SkippedChars = "" + self.SetFileBufferPos(StartPos) + self._SkippedChars = "" return False ## GetFileBufferPos() method @@ -1338,18 +1286,18 @@ class FdfParser: # @param self The object pointer # def Preprocess(self): - self.__StringToList() + self._StringToList() self.PreprocessFile() self.PreprocessIncludeFile() - self.__StringToList() + self._StringToList() self.PreprocessFile() self.PreprocessConditionalStatement() - self.__StringToList() - for Pos in self.__WipeOffArea: - self.__ReplaceFragment(Pos[0], Pos[1]) + self._StringToList() + for Pos in self._WipeOffArea: + self._ReplaceFragment(Pos[0], Pos[1]) self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList] - while self.__GetDefines(): + while self._GetDefines(): pass ## ParseFile() method @@ -1360,45 +1308,44 @@ class FdfParser: # @param self The object pointer # def ParseFile(self): - try: self.Preprocess() - while self.__GetFd(): - pass - - while self.__GetFv(): - pass - - while self.__GetFmp(): - pass - - while self.__GetCapsule(): - pass - - while self.__GetVtf(): - pass - - while self.__GetRule(): - pass - - while self.__GetOptionRom(): + self._GetError() + # + # Keep processing sections of the FDF until no new sections or a syntax error is found + # + while self._GetFd() or self._GetFv() or self._GetFmp() or self._GetCapsule() or self._GetRule() or self._GetOptionRom(): pass - except Warning, X: - self.__UndoToken() - #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \ + except Warning as X: + self._UndoToken() + #'\n\tGot Token: \"%s\" from File %s\n' % (self._Token, FileLineTuple[0]) + \ # At this point, the closest parent would be the included file itself Profile = GetParentAtLine(X.OriginalLineNumber) - if Profile != None: + if Profile is not None: X.Message += ' near line %d, column %d: %s' \ % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1]) else: FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) X.Message += ' near line %d, column %d: %s' \ - % (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r')) + % (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:].rstrip(TAB_LINE_BREAK).rstrip(T_CHAR_CR)) raise - ## __GetDefines() method + ## SectionParser() method + # + # Parse the file section info + # Exception will be raised if syntax error found + # + # @param self The object pointer + # @param section The section string + + def SectionParser(self, section): + S = section.upper() + if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \ + and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'): + raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self.FileName, self.CurrentLineNumber) + + ## _GetDefines() method # # Get Defines section contents and store its data into AllMacrosList # @@ -1406,47 +1353,55 @@ class FdfParser: # @retval True Successfully find a Defines # @retval False Not able to find a Defines # - def __GetDefines(self): - - if not self.__GetNextToken(): + def _GetDefines(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[DEFINES"): - if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \ - and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[DEFINES"): + self.SectionParser(S) + self._UndoToken() return False - self.__UndoToken() - if not self.__IsToken("[DEFINES", True): + self._UndoToken() + if not self._IsToken("[DEFINES", True): FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber) + # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) + raise Warning.Expected("[DEFINES", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - while self.__GetNextWord(): + while self._GetNextWord(): # handle the SET statement - if self.__Token == 'SET': - self.__UndoToken() - self.__GetSetStatement(None) + if self._Token == 'SET': + self._UndoToken() + self._GetSetStatement(None) continue - - Macro = self.__Token - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken() or self.__Token.startswith('['): - raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber) - Value = self.__Token + + Macro = self._Token + + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken() or self._Token.startswith(TAB_SECTION_START): + raise Warning.Expected("MACRO value", self.FileName, self.CurrentLineNumber) + Value = self._Token return False - ## __GetFd() method + ##_GetError() method + def _GetError(self): + #save the Current information + CurrentLine = self.CurrentLineNumber + CurrentOffset = self.CurrentOffsetWithinLine + while self._GetNextToken(): + if self._Token == TAB_ERROR: + EdkLogger.error('FdfParser', ERROR_STATEMENT, self._CurrentLine().replace(TAB_ERROR, '', 1), File=self.FileName, Line=self.CurrentLineNumber) + self.CurrentLineNumber = CurrentLine + self.CurrentOffsetWithinLine = CurrentOffset + + ## _GetFd() method # # Get FD section contents and store its data into FD dictionary of self.Profile # @@ -1454,27 +1409,26 @@ class FdfParser: # @retval True Successfully find a FD # @retval False Not able to find a FD # - def __GetFd(self): - - if not self.__GetNextToken(): + def _GetFd(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[FD."): + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[FD."): if not S.startswith("[FV.") and not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \ - and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): + and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): raise Warning("Unknown section", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + self._UndoToken() return False - self.__UndoToken() - if not self.__IsToken("[FD.", True): + self._UndoToken() + if not self._IsToken("[FD.", True): FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber) + # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) + raise Warning.Expected("[FD.]", self.FileName, self.CurrentLineNumber) - FdName = self.__GetUiName() + FdName = self._GetUiName() if FdName == "": if len (self.Profile.FdDict) == 0: FdName = GenFdsGlobalVariable.PlatformName @@ -1482,62 +1436,62 @@ class FdfParser: FdName = GlobalData.gActivePlatform.PlatformName self.Profile.FdNameNotSet = True else: - raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("FdName in [FD.] section", self.FileName, self.CurrentLineNumber) self.CurrentFdName = FdName.upper() - + if self.CurrentFdName in self.Profile.FdDict: raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - FdObj = Fd.FD() + FdObj = FD() FdObj.FdUiName = self.CurrentFdName self.Profile.FdDict[self.CurrentFdName] = FdObj if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet: - raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("all FDs have their name", self.FileName, self.CurrentLineNumber) - Status = self.__GetCreateFile(FdObj) + Status = self._GetCreateFile(FdObj) if not Status: raise Warning("FD name error", self.FileName, self.CurrentLineNumber) - while self.__GetTokenStatements(FdObj): + while self._GetTokenStatements(FdObj): pass for Attr in ("BaseAddress", "Size", "ErasePolarity"): - if getattr(FdObj, Attr) == None: - self.__GetNextToken() + if getattr(FdObj, Attr) is None: + self._GetNextToken() raise Warning("Keyword %s missing" % Attr, self.FileName, self.CurrentLineNumber) if not FdObj.BlockSizeList: FdObj.BlockSizeList.append((1, FdObj.Size, None)) - self.__GetDefineStatements(FdObj) + self._GetDefineStatements(FdObj) - self.__GetSetStatements(FdObj) + self._GetSetStatements(FdObj) - if not self.__GetRegionLayout(FdObj): - raise Warning("expected region layout", self.FileName, self.CurrentLineNumber) + if not self._GetRegionLayout(FdObj): + raise Warning.Expected("region layout", self.FileName, self.CurrentLineNumber) - while self.__GetRegionLayout(FdObj): + while self._GetRegionLayout(FdObj): pass return True - ## __GetUiName() method + ## _GetUiName() method # # Return the UI name of a section # # @param self The object pointer # @retval FdName UI name # - def __GetUiName(self): + def _GetUiName(self): Name = "" - if self.__GetNextWord(): - Name = self.__Token + if self._GetNextWord(): + Name = self._Token return Name - ## __GetCreateFile() method + ## _GetCreateFile() method # # Return the output file name of object # @@ -1545,78 +1499,82 @@ class FdfParser: # @param Obj object whose data will be stored in file # @retval FdName UI name # - def __GetCreateFile(self, Obj): + def _GetCreateFile(self, Obj): + if self._IsKeyword("CREATE_FILE"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if self.__IsKeyword( "CREATE_FILE"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("file name", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected file name", self.FileName, self.CurrentLineNumber) - - FileName = self.__Token + FileName = self._Token Obj.CreateFileName = FileName return True - ## __GetTokenStatements() method + def SetPcdLocalation(self,pcdpair): + self.Profile.PcdLocalDict[pcdpair] = (self.Profile.FileName,self.CurrentLineNumber) + + ## _GetTokenStatements() method # # Get token statements # # @param self The object pointer # @param Obj for whom token statement is got # - def __GetTokenStatements(self, Obj): - if self.__IsKeyword( "BaseAddress"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextHexNumber(): - raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber) - - Obj.BaseAddress = self.__Token - - if self.__IsToken( "|"): - pcdPair = self.__GetNextPcdName() + def _GetTokenStatements(self, Obj): + if self._IsKeyword("BaseAddress"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex base address", self.FileName, self.CurrentLineNumber) + + Obj.BaseAddress = self._Token + + if self._IsToken(TAB_VALUE_SPLIT): + pcdPair = self._GetNextPcdSettings() Obj.BaseAddressPcd = pcdPair self.Profile.PcdDict[pcdPair] = Obj.BaseAddress + self.SetPcdLocalation(pcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple return True - if self.__IsKeyword( "Size"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextHexNumber(): - raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber) + if self._IsKeyword("Size"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex size", self.FileName, self.CurrentLineNumber) - Size = self.__Token - if self.__IsToken( "|"): - pcdPair = self.__GetNextPcdName() + Size = self._Token + if self._IsToken(TAB_VALUE_SPLIT): + pcdPair = self._GetNextPcdSettings() Obj.SizePcd = pcdPair self.Profile.PcdDict[pcdPair] = Size + self.SetPcdLocalation(pcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple - Obj.Size = long(Size, 0) + Obj.Size = int(Size, 0) return True - if self.__IsKeyword( "ErasePolarity"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber) - - if self.__Token != "1" and self.__Token != "0": - raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber) - - Obj.ErasePolarity = self.__Token + if self._IsKeyword("ErasePolarity"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._GetNextToken(): + raise Warning.Expected("Erase Polarity", self.FileName, self.CurrentLineNumber) + + if not self._Token in {"1", "0"}: + raise Warning.Expected("1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber) + + Obj.ErasePolarity = self._Token return True - return self.__GetBlockStatements(Obj) + return self._GetBlockStatements(Obj) - ## __GetAddressStatements() method + ## _GetAddressStatements() method # # Get address statements # @@ -1625,46 +1583,45 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetAddressStatements(self, Obj): + def _GetAddressStatements(self, Obj): + if self._IsKeyword("BsBaseAddress"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if self.__IsKeyword("BsBaseAddress"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._GetNextDecimalNumber() and not self._GetNextHexNumber(): + raise Warning.Expected("address", self.FileName, self.CurrentLineNumber) - if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber(): - raise Warning("expected address", self.FileName, self.CurrentLineNumber) - - BsAddress = long(self.__Token, 0) + BsAddress = int(self._Token, 0) Obj.BsBaseAddress = BsAddress - if self.__IsKeyword("RtBaseAddress"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if self._IsKeyword("RtBaseAddress"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber(): - raise Warning("expected address", self.FileName, self.CurrentLineNumber) + if not self._GetNextDecimalNumber() and not self._GetNextHexNumber(): + raise Warning.Expected("address", self.FileName, self.CurrentLineNumber) - RtAddress = long(self.__Token, 0) + RtAddress = int(self._Token, 0) Obj.RtBaseAddress = RtAddress - ## __GetBlockStatements() method + ## _GetBlockStatements() method # # Get block statements # # @param self The object pointer # @param Obj for whom block statement is got # - def __GetBlockStatements(self, Obj): + def _GetBlockStatements(self, Obj): IsBlock = False - while self.__GetBlockStatement(Obj): + while self._GetBlockStatement(Obj): IsBlock = True - + Item = Obj.BlockSizeList[-1] - if Item[0] == None or Item[1] == None: - raise Warning("expected block statement", self.FileName, self.CurrentLineNumber) + if Item[0] is None or Item[1] is None: + raise Warning.Expected("block statement", self.FileName, self.CurrentLineNumber) return IsBlock - ## __GetBlockStatement() method + ## _GetBlockStatement() method # # Get block statement # @@ -1673,40 +1630,41 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetBlockStatement(self, Obj): - if not self.__IsKeyword( "BlockSize"): + def _GetBlockStatement(self, Obj): + if not self._IsKeyword("BlockSize"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber(): - raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber() and not self._GetNextDecimalNumber(): + raise Warning.Expected("Hex or Integer block size", self.FileName, self.CurrentLineNumber) - BlockSize = self.__Token + BlockSize = self._Token BlockSizePcd = None - if self.__IsToken( "|"): - PcdPair = self.__GetNextPcdName() + if self._IsToken(TAB_VALUE_SPLIT): + PcdPair = self._GetNextPcdSettings() BlockSizePcd = PcdPair self.Profile.PcdDict[PcdPair] = BlockSize + self.SetPcdLocalation(PcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple - BlockSize = long(BlockSize, 0) + BlockSize = int(BlockSize, 0) BlockNumber = None - if self.__IsKeyword( "NumBlocks"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if self._IsKeyword("NumBlocks"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber(): - raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber) + if not self._GetNextDecimalNumber() and not self._GetNextHexNumber(): + raise Warning.Expected("block numbers", self.FileName, self.CurrentLineNumber) - BlockNumber = long(self.__Token, 0) + BlockNumber = int(self._Token, 0) Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd)) return True - ## __GetDefineStatements() method + ## _GetDefineStatements() method # # Get define statements # @@ -1715,11 +1673,11 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetDefineStatements(self, Obj): - while self.__GetDefineStatement( Obj): + def _GetDefineStatements(self, Obj): + while self._GetDefineStatement(Obj): pass - ## __GetDefineStatement() method + ## _GetDefineStatement() method # # Get define statement # @@ -1728,24 +1686,24 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetDefineStatement(self, Obj): - if self.__IsKeyword("DEFINE"): - self.__GetNextToken() - Macro = self.__Token - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + def _GetDefineStatement(self, Obj): + if self._IsKeyword(TAB_DEFINE): + self._GetNextToken() + Macro = self._Token + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("value", self.FileName, self.CurrentLineNumber) - Value = self.__Token + Value = self._Token Macro = '$(' + Macro + ')' Obj.DefineVarDict[Macro] = Value return True return False - ## __GetSetStatements() method + ## _GetSetStatements() method # # Get set statements # @@ -1754,11 +1712,11 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetSetStatements(self, Obj): - while self.__GetSetStatement(Obj): + def _GetSetStatements(self, Obj): + while self._GetSetStatement(Obj): pass - ## __GetSetStatement() method + ## _GetSetStatement() method # # Get set statement # @@ -1767,38 +1725,39 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # - def __GetSetStatement(self, Obj): - if self.__IsKeyword("SET"): - PcdPair = self.__GetNextPcdName() + def _GetSetStatement(self, Obj): + if self._IsKeyword("SET"): + PcdPair = self._GetNextPcdSettings() - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - Value = self.__GetExpression() - Value = self.__EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True) + Value = self._GetExpression() + Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True) if Obj: Obj.SetVarDict[PcdPair] = Value self.Profile.PcdDict[PcdPair] = Value + self.SetPcdLocalation(PcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple return True return False - ## __CalcRegionExpr(self) + ## _CalcRegionExpr(self) # # Calculate expression for offset or size of a region # # @return: None if invalid expression # Calculated number if successfully # - def __CalcRegionExpr(self): + def _CalcRegionExpr(self): StartPos = self.GetFileBufferPos() Expr = '' PairCount = 0 - while not self.__EndOfFile(): - CurCh = self.__CurrentChar() + while not self._EndOfFile(): + CurCh = self._CurrentChar() if CurCh == '(': PairCount += 1 elif CurCh == ')': @@ -1807,104 +1766,106 @@ class FdfParser: if CurCh in '|\r\n' and PairCount == 0: break Expr += CurCh - self.__GetOneChar() + self._GetOneChar() try: - return long( + return int( ValueExpression(Expr, - self.__CollectMacroPcd() - )(True),0) + self._CollectMacroPcd() + )(True), 0) except Exception: self.SetFileBufferPos(StartPos) return None - ## __GetRegionLayout() method + ## _GetRegionLayout() method # # Get region layout for FD # # @param self The object pointer - # @param Fd for whom region is got + # @param theFd for whom region is got # @retval True Successfully find # @retval False Not able to find # - def __GetRegionLayout(self, Fd): - Offset = self.__CalcRegionExpr() - if Offset == None: + def _GetRegionLayout(self, theFd): + Offset = self._CalcRegionExpr() + if Offset is None: return False - RegionObj = Region.Region() + RegionObj = Region() RegionObj.Offset = Offset - Fd.RegionList.append(RegionObj) + theFd.RegionList.append(RegionObj) - if not self.__IsToken( "|"): - raise Warning("expected '|'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_VALUE_SPLIT): + raise Warning.Expected("'|'", self.FileName, self.CurrentLineNumber) - Size = self.__CalcRegionExpr() - if Size == None: - raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber) + Size = self._CalcRegionExpr() + if Size is None: + raise Warning.Expected("Region Size", self.FileName, self.CurrentLineNumber) RegionObj.Size = Size - if not self.__GetNextWord(): + if not self._GetNextWord(): return True - if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"): + if not self._Token in {"SET", BINARY_FILE_TYPE_FV, "FILE", "DATA", "CAPSULE", "INF"}: # # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]] # Or it might be next region's offset described by an expression which starts with a PCD. # PcdOffset[|PcdSize] or OffsetPcdExpression|Size # - self.__UndoToken() - IsRegionPcd = (RegionSizeGuidPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]) or - RegionOffsetPcdPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:])) + self._UndoToken() + IsRegionPcd = (RegionSizeGuidPattern.match(self._CurrentLine()[self.CurrentOffsetWithinLine:]) or + RegionOffsetPcdPattern.match(self._CurrentLine()[self.CurrentOffsetWithinLine:])) if IsRegionPcd: - RegionObj.PcdOffset = self.__GetNextPcdName() - self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0)) - self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset + RegionObj.PcdOffset = self._GetNextPcdSettings() + self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + int(theFd.BaseAddress, 0)) + self.SetPcdLocalation(RegionObj.PcdOffset) + self._PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple - if self.__IsToken( "|"): - RegionObj.PcdSize = self.__GetNextPcdName() + if self._IsToken(TAB_VALUE_SPLIT): + RegionObj.PcdSize = self._GetNextPcdSettings() self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size - self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size + self.SetPcdLocalation(RegionObj.PcdSize) + self._PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple - if not self.__GetNextWord(): + if not self._GetNextWord(): return True - if self.__Token == "SET": - self.__UndoToken() - self.__GetSetStatements( RegionObj) - if not self.__GetNextWord(): + if self._Token == "SET": + self._UndoToken() + self._GetSetStatements(RegionObj) + if not self._GetNextWord(): return True - elif self.__Token == "FV": - self.__UndoToken() - self.__GetRegionFvType( RegionObj) + elif self._Token == BINARY_FILE_TYPE_FV: + self._UndoToken() + self._GetRegionFvType(RegionObj) - elif self.__Token == "CAPSULE": - self.__UndoToken() - self.__GetRegionCapType( RegionObj) + elif self._Token == "CAPSULE": + self._UndoToken() + self._GetRegionCapType(RegionObj) - elif self.__Token == "FILE": - self.__UndoToken() - self.__GetRegionFileType(RegionObj) + elif self._Token == "FILE": + self._UndoToken() + self._GetRegionFileType(RegionObj) - elif self.__Token == "INF": - self.__UndoToken() + elif self._Token == "INF": + self._UndoToken() RegionObj.RegionType = "INF" - while self.__IsKeyword("INF"): - self.__UndoToken() - ffsInf = self.__ParseInfStatement() + while self._IsKeyword("INF"): + self._UndoToken() + ffsInf = self._ParseInfStatement() if not ffsInf: break RegionObj.RegionDataList.append(ffsInf) - elif self.__Token == "DATA": - self.__UndoToken() - self.__GetRegionDataType(RegionObj) + elif self._Token == "DATA": + self._UndoToken() + self._GetRegionDataType(RegionObj) else: - self.__UndoToken() - if self.__GetRegionLayout(Fd): + self._UndoToken() + if self._GetRegionLayout(theFd): return True raise Warning("A valid region type was not found. " "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred", @@ -1912,189 +1873,185 @@ class FdfParser: return True - ## __GetRegionFvType() method + ## _GetRegionFvType() method # # Get region fv data for region # # @param self The object pointer # @param RegionObj for whom region data is got # - def __GetRegionFvType(self, RegionObj): + def _GetRegionFvType(self, RegionObj): + if not self._IsKeyword(BINARY_FILE_TYPE_FV): + raise Warning.Expected("'FV'", self.FileName, self.CurrentLineNumber) - if not self.__IsKeyword( "FV"): - raise Warning("expected Keyword 'FV'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV name", self.FileName, self.CurrentLineNumber) + RegionObj.RegionType = BINARY_FILE_TYPE_FV + RegionObj.RegionDataList.append((self._Token).upper()) - RegionObj.RegionType = "FV" - RegionObj.RegionDataList.append(self.__Token) + while self._IsKeyword(BINARY_FILE_TYPE_FV): - while self.__IsKeyword( "FV"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV name", self.FileName, self.CurrentLineNumber) + RegionObj.RegionDataList.append((self._Token).upper()) - RegionObj.RegionDataList.append(self.__Token) - - ## __GetRegionCapType() method + ## _GetRegionCapType() method # # Get region capsule data for region # # @param self The object pointer # @param RegionObj for whom region data is got # - def __GetRegionCapType(self, RegionObj): - - if not self.__IsKeyword("CAPSULE"): - raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber) + def _GetRegionCapType(self, RegionObj): + if not self._IsKeyword("CAPSULE"): + raise Warning.Expected("'CAPSULE'", self.FileName, self.CurrentLineNumber) - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("CAPSULE name", self.FileName, self.CurrentLineNumber) RegionObj.RegionType = "CAPSULE" - RegionObj.RegionDataList.append(self.__Token) + RegionObj.RegionDataList.append(self._Token) - while self.__IsKeyword("CAPSULE"): + while self._IsKeyword("CAPSULE"): - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("CAPSULE name", self.FileName, self.CurrentLineNumber) - RegionObj.RegionDataList.append(self.__Token) + RegionObj.RegionDataList.append(self._Token) - ## __GetRegionFileType() method + ## _GetRegionFileType() method # # Get region file data for region # # @param self The object pointer # @param RegionObj for whom region data is got # - def __GetRegionFileType(self, RegionObj): - - if not self.__IsKeyword( "FILE"): - raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber) + def _GetRegionFileType(self, RegionObj): + if not self._IsKeyword("FILE"): + raise Warning.Expected("'FILE'", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected File name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber) RegionObj.RegionType = "FILE" - RegionObj.RegionDataList.append( self.__Token) + RegionObj.RegionDataList.append(self._Token) - while self.__IsKeyword( "FILE"): + while self._IsKeyword("FILE"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FILE name", self.FileName, self.CurrentLineNumber) - RegionObj.RegionDataList.append(self.__Token) + RegionObj.RegionDataList.append(self._Token) - ## __GetRegionDataType() method + ## _GetRegionDataType() method # # Get region array data for region # # @param self The object pointer # @param RegionObj for whom region data is got # - def __GetRegionDataType(self, RegionObj): + def _GetRegionDataType(self, RegionObj): + if not self._IsKeyword("DATA"): + raise Warning.Expected("Region Data type", self.FileName, self.CurrentLineNumber) - if not self.__IsKeyword( "DATA"): - raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber) - - if len(self.__Token) > 18: + if len(self._Token) > 18: raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) # convert hex string value to byte hex string array - AllString = self.__Token + AllString = self._Token AllStrLen = len (AllString) DataString = "" while AllStrLen > 4: - DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + "," + DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + TAB_COMMA_SPLIT AllStrLen = AllStrLen - 2 - DataString = DataString + AllString[:AllStrLen] + "," + DataString = DataString + AllString[:AllStrLen] + TAB_COMMA_SPLIT # byte value array - if len (self.__Token) <= 4: - while self.__IsToken(","): - if not self.__GetNextHexNumber(): + if len (self._Token) <= 4: + while self._IsToken(TAB_COMMA_SPLIT): + if not self._GetNextHexNumber(): raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: + if len(self._Token) > 4: raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString += self.__Token - DataString += "," + DataString += self._Token + DataString += TAB_COMMA_SPLIT - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - DataString = DataString.rstrip(",") + DataString = DataString.rstrip(TAB_COMMA_SPLIT) RegionObj.RegionType = "DATA" - RegionObj.RegionDataList.append( DataString) + RegionObj.RegionDataList.append(DataString) - while self.__IsKeyword( "DATA"): + while self._IsKeyword("DATA"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 18: + if len(self._Token) > 18: raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) # convert hex string value to byte hex string array - AllString = self.__Token + AllString = self._Token AllStrLen = len (AllString) DataString = "" while AllStrLen > 4: - DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + "," + DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + TAB_COMMA_SPLIT AllStrLen = AllStrLen - 2 - DataString = DataString + AllString[:AllStrLen] + "," + DataString = DataString + AllString[:AllStrLen] + TAB_COMMA_SPLIT # byte value array - if len (self.__Token) <= 4: - while self.__IsToken(","): - if not self.__GetNextHexNumber(): + if len (self._Token) <= 4: + while self._IsToken(TAB_COMMA_SPLIT): + if not self._GetNextHexNumber(): raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: + if len(self._Token) > 4: raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString += self.__Token - DataString += "," + DataString += self._Token + DataString += TAB_COMMA_SPLIT - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - DataString = DataString.rstrip(",") - RegionObj.RegionDataList.append( DataString) + DataString = DataString.rstrip(TAB_COMMA_SPLIT) + RegionObj.RegionDataList.append(DataString) - ## __GetFv() method + ## _GetFv() method # # Get FV section contents and store its data into FV dictionary of self.Profile # @@ -2102,70 +2059,64 @@ class FdfParser: # @retval True Successfully find a FV # @retval False Not able to find a FV # - def __GetFv(self): - if not self.__GetNextToken(): + def _GetFv(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[FV."): - if not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \ - and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[FV."): + self.SectionParser(S) + self._UndoToken() return False - self.__UndoToken() - if not self.__IsToken("[FV.", True): + self._UndoToken() + if not self._IsToken("[FV.", True): FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) + raise Warning("Unknown Keyword '%s'" % self._Token, self.FileName, self.CurrentLineNumber) - FvName = self.__GetUiName() + FvName = self._GetUiName() self.CurrentFvName = FvName.upper() - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - FvObj = Fv.FV() - FvObj.UiFvName = self.CurrentFvName + FvObj = FV(Name=self.CurrentFvName) self.Profile.FvDict[self.CurrentFvName] = FvObj - Status = self.__GetCreateFile(FvObj) + Status = self._GetCreateFile(FvObj) if not Status: raise Warning("FV name error", self.FileName, self.CurrentLineNumber) - self.__GetDefineStatements(FvObj) + self._GetDefineStatements(FvObj) - self.__GetAddressStatements(FvObj) + self._GetAddressStatements(FvObj) - FvObj.FvExtEntryTypeValue = [] - FvObj.FvExtEntryType = [] - FvObj.FvExtEntryData = [] while True: - self.__GetSetStatements(FvObj) + self._GetSetStatements(FvObj) - if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or - self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or - self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or - self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)): + if not (self._GetBlockStatement(FvObj) or self._GetFvBaseAddress(FvObj) or + self._GetFvForceRebase(FvObj) or self._GetFvAlignment(FvObj) or + self._GetFvAttributes(FvObj) or self._GetFvNameGuid(FvObj) or + self._GetFvExtEntryStatement(FvObj) or self._GetFvNameString(FvObj)): break if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid: raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber) - self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy()) - self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy()) + self._GetAprioriSection(FvObj) + self._GetAprioriSection(FvObj) while True: - isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy()) - isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy()) + isInf = self._GetInfStatement(FvObj) + isFile = self._GetFileStatement(FvObj) if not isInf and not isFile: break return True - ## __GetFvAlignment() method + ## _GetFvAlignment() method # # Get alignment for FV # @@ -2174,26 +2125,25 @@ class FdfParser: # @retval True Successfully find a alignment statement # @retval False Not able to find a alignment statement # - def __GetFvAlignment(self, Obj): - - if not self.__IsKeyword( "FvAlignment"): + def _GetFvAlignment(self, Obj): + if not self._IsKeyword("FvAlignment"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("alignment value", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \ + if self._Token.upper() not in {"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \ "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \ "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \ - "1G", "2G"): - raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - Obj.FvAlignment = self.__Token + "1G", "2G"}: + raise Warning("Unknown alignment value '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + Obj.FvAlignment = self._Token return True - - ## __GetFvBaseAddress() method + + ## _GetFvBaseAddress() method # # Get BaseAddress for FV # @@ -2202,25 +2152,22 @@ class FdfParser: # @retval True Successfully find a FvBaseAddress statement # @retval False Not able to find a FvBaseAddress statement # - def __GetFvBaseAddress(self, Obj): - - if not self.__IsKeyword("FvBaseAddress"): + def _GetFvBaseAddress(self, Obj): + if not self._IsKeyword("FvBaseAddress"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV base address value", self.FileName, self.CurrentLineNumber) - IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+') + if not BaseAddrValuePattern.match(self._Token.upper()): + raise Warning("Unknown FV base address value '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + Obj.FvBaseAddress = self._Token + return True - if not IsValidBaseAddrValue.match(self.__Token.upper()): - raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - Obj.FvBaseAddress = self.__Token - return True - - ## __GetFvForceRebase() method + ## _GetFvForceRebase() method # # Get FvForceRebase for FV # @@ -2229,31 +2176,30 @@ class FdfParser: # @retval True Successfully find a FvForceRebase statement # @retval False Not able to find a FvForceRebase statement # - def __GetFvForceRebase(self, Obj): - - if not self.__IsKeyword("FvForceRebase"): + def _GetFvForceRebase(self, Obj): + if not self._IsKeyword("FvForceRebase"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FvForceRebase value", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]: - raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - - if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]: + if self._Token.upper() not in {"TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"}: + raise Warning("Unknown FvForceRebase value '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + + if self._Token.upper() in {"TRUE", "1", "0X1", "0X01"}: Obj.FvForceRebase = True - elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]: + elif self._Token.upper() in {"FALSE", "0", "0X0", "0X00"}: Obj.FvForceRebase = False else: Obj.FvForceRebase = None - + return True - ## __GetFvAttributes() method + ## _GetFvAttributes() method # # Get attributes for FV # @@ -2261,31 +2207,31 @@ class FdfParser: # @param Obj for whom attribute is got # @retval None # - def __GetFvAttributes(self, FvObj): + def _GetFvAttributes(self, FvObj): IsWordToken = False - while self.__GetNextWord(): + while self._GetNextWord(): IsWordToken = True - name = self.__Token - if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \ + name = self._Token + if name not in {"ERASE_POLARITY", "MEMORY_MAPPED", \ "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \ "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \ "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \ "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \ - "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"): - self.__UndoToken() + "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"}: + self._UndoToken() return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"): - raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken() or self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}: + raise Warning.Expected("TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber) - FvObj.FvAttributeDict[name] = self.__Token + FvObj.FvAttributeDict[name] = self._Token return IsWordToken - - ## __GetFvNameGuid() method + + ## _GetFvNameGuid() method # # Get FV GUID for FV # @@ -2293,321 +2239,323 @@ class FdfParser: # @param Obj for whom GUID is got # @retval None # - def __GetFvNameGuid(self, FvObj): - - if not self.__IsKeyword( "FvNameGuid"): + def _GetFvNameGuid(self, FvObj): + if not self._IsKeyword("FvNameGuid"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextGuid(): - raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber) + if not self._GetNextGuid(): + raise Warning.Expected("GUID value", self.FileName, self.CurrentLineNumber) - FvObj.FvNameGuid = self.__Token + FvObj.FvNameGuid = self._Token return True - def __GetFvNameString(self, FvObj): - - if not self.__IsKeyword( "FvNameString"): + def _GetFvNameString(self, FvObj): + if not self._IsKeyword("FvNameString"): return False - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken() or self.__Token not in ('TRUE', 'FALSE'): - raise Warning("expected TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken() or self._Token.upper() not in {'TRUE', 'FALSE'}: + raise Warning.Expected("TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber) - FvObj.FvNameString = self.__Token + FvObj.FvNameString = self._Token return True - def __GetFvExtEntryStatement(self, FvObj): - - if not self.__IsKeyword( "FV_EXT_ENTRY"): + def _GetFvExtEntryStatement(self, FvObj): + if not (self._IsKeyword("FV_EXT_ENTRY") or self._IsKeyword("FV_EXT_ENTRY_TYPE")): return False - if not self.__IsKeyword ("TYPE"): - raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsKeyword ("TYPE"): + raise Warning.Expected("'TYPE'", self.FileName, self.CurrentLineNumber) + + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber(): - raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber() and not self._GetNextDecimalNumber(): + raise Warning.Expected("Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber) - FvObj.FvExtEntryTypeValue += [self.__Token] + FvObj.FvExtEntryTypeValue.append(self._Token) - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"): - raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber) + if not self._IsKeyword("FILE") and not self._IsKeyword("DATA"): + raise Warning.Expected("'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber) - FvObj.FvExtEntryType += [self.__Token] + FvObj.FvExtEntryType.append(self._Token) - if self.__Token == 'DATA': + if self._Token == 'DATA': + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: + if len(self._Token) > 4: raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString = self.__Token - DataString += "," + DataString = self._Token + DataString += TAB_COMMA_SPLIT - while self.__IsToken(","): - if not self.__GetNextHexNumber(): + while self._IsToken(TAB_COMMA_SPLIT): + if not self._GetNextHexNumber(): raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: + if len(self._Token) > 4: raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString += self.__Token - DataString += "," + DataString += self._Token + DataString += TAB_COMMA_SPLIT + + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + DataString = DataString.rstrip(TAB_COMMA_SPLIT) + FvObj.FvExtEntryData.append(DataString) - DataString = DataString.rstrip(",") - FvObj.FvExtEntryData += [DataString] + if self._Token == 'FILE': + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if self.__Token == 'FILE': - - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber) - - FvObj.FvExtEntryData += [self.__Token] + if not self._GetNextToken(): + raise Warning.Expected("FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + FvObj.FvExtEntryData.append(self._Token) + + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) return True - ## __GetAprioriSection() method + ## _GetAprioriSection() method # # Get token statements # # @param self The object pointer # @param FvObj for whom apriori is got - # @param MacroDict dictionary used to replace macro # @retval True Successfully find apriori statement # @retval False Not able to find apriori statement # - def __GetAprioriSection(self, FvObj, MacroDict = {}): - - if not self.__IsKeyword( "APRIORI"): + def _GetAprioriSection(self, FvObj): + if not self._IsKeyword("APRIORI"): return False - if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"): - raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber) - AprType = self.__Token + if not self._IsKeyword("PEI") and not self._IsKeyword("DXE"): + raise Warning.Expected("Apriori file type", self.FileName, self.CurrentLineNumber) + AprType = self._Token - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - AprSectionObj = AprioriSection.AprioriSection() + AprSectionObj = AprioriSection() AprSectionObj.AprioriType = AprType - self.__GetDefineStatements(AprSectionObj) - MacroDict.update(AprSectionObj.DefineVarDict) + self._GetDefineStatements(AprSectionObj) while True: - IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict) - IsFile = self.__GetFileStatement( AprSectionObj) + IsInf = self._GetInfStatement(AprSectionObj) + IsFile = self._GetFileStatement(AprSectionObj) if not IsInf and not IsFile: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) FvObj.AprioriSectionList.append(AprSectionObj) return True - def __ParseInfStatement(self): - if not self.__IsKeyword("INF"): + def _ParseInfStatement(self): + if not self._IsKeyword("INF"): return None - ffsInf = FfsInfStatement.FfsInfStatement() - self.__GetInfOptions(ffsInf) + ffsInf = FfsInfStatement() + self._GetInfOptions(ffsInf) - if not self.__GetNextToken(): - raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber) - ffsInf.InfFileName = self.__Token + if not self._GetNextToken(): + raise Warning.Expected("INF file path", self.FileName, self.CurrentLineNumber) + ffsInf.InfFileName = self._Token + if not ffsInf.InfFileName.endswith('.inf'): + raise Warning.Expected(".inf file path", self.FileName, self.CurrentLineNumber) ffsInf.CurrentLineNum = self.CurrentLineNumber - ffsInf.CurrentLineContent = self.__CurrentLine() + ffsInf.CurrentLineContent = self._CurrentLine() #Replace $(SAPCE) with real space ffsInf.InfFileName = ffsInf.InfFileName.replace('$(SPACE)', ' ') - if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1: + if ffsInf.InfFileName.replace(TAB_WORKSPACE, '').find('$') == -1: #do case sensitive check for file path ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() if ErrorCode != 0: EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - if not ffsInf.InfFileName in self.Profile.InfList: - self.Profile.InfList.append(ffsInf.InfFileName) + NewFileName = ffsInf.InfFileName + if ffsInf.OverrideGuid: + NewFileName = ProcessDuplicatedInf(PathClass(ffsInf.InfFileName,GenFdsGlobalVariable.WorkSpaceDir), ffsInf.OverrideGuid, GenFdsGlobalVariable.WorkSpaceDir).Path + + if not NewFileName in self.Profile.InfList: + self.Profile.InfList.append(NewFileName) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.InfFileLineList.append(FileLineTuple) + if ffsInf.UseArch: + if ffsInf.UseArch not in self.Profile.InfDict: + self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName] + else: + self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName) + else: + self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName) - if self.__IsToken('|'): - if self.__IsKeyword('RELOCS_STRIPPED'): + if self._IsToken(TAB_VALUE_SPLIT): + if self._IsKeyword('RELOCS_STRIPPED'): ffsInf.KeepReloc = False - elif self.__IsKeyword('RELOCS_RETAINED'): + elif self._IsKeyword('RELOCS_RETAINED'): ffsInf.KeepReloc = True else: - raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + raise Warning("Unknown reloc strip flag '%s'" % self._Token, self.FileName, self.CurrentLineNumber) return ffsInf - ## __GetInfStatement() method + ## _GetInfStatement() method # # Get INF statements # # @param self The object pointer # @param Obj for whom inf statement is got - # @param MacroDict dictionary used to replace macro # @retval True Successfully find inf statement # @retval False Not able to find inf statement # - def __GetInfStatement(self, Obj, ForCapsule=False, MacroDict={}): - ffsInf = self.__ParseInfStatement() + def _GetInfStatement(self, Obj, ForCapsule=False): + ffsInf = self._ParseInfStatement() if not ffsInf: return False if ForCapsule: - capsuleFfs = CapsuleData.CapsuleFfs() - capsuleFfs.Ffs = ffsInf - Obj.CapsuleDataList.append(capsuleFfs) + myCapsuleFfs = CapsuleFfs() + myCapsuleFfs.Ffs = ffsInf + Obj.CapsuleDataList.append(myCapsuleFfs) else: Obj.FfsList.append(ffsInf) return True - ## __GetInfOptions() method + ## _GetInfOptions() method # # Get options for INF # # @param self The object pointer # @param FfsInfObj for whom option is got # - def __GetInfOptions(self, FfsInfObj): - if self.__IsKeyword("FILE_GUID"): - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextGuid(): - raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber) - FfsInfObj.OverrideGuid = self.__Token - - if self.__IsKeyword( "RuleOverride"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber) - FfsInfObj.Rule = self.__Token - - if self.__IsKeyword( "VERSION"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Version", self.FileName, self.CurrentLineNumber) - - if self.__GetStringData(): - FfsInfObj.Version = self.__Token - - if self.__IsKeyword( "UI"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected UI name", self.FileName, self.CurrentLineNumber) - - if self.__GetStringData(): - FfsInfObj.Ui = self.__Token - - if self.__IsKeyword( "USE"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber) - FfsInfObj.UseArch = self.__Token - - - if self.__GetNextToken(): - p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))') - if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token): - FfsInfObj.KeyStringList.append(self.__Token) - if not self.__IsToken(","): + def _GetInfOptions(self, FfsInfObj): + if self._IsKeyword("FILE_GUID"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextGuid(): + raise Warning.Expected("GUID value", self.FileName, self.CurrentLineNumber) + FfsInfObj.OverrideGuid = self._Token + + if self._IsKeyword("RuleOverride"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Rule name", self.FileName, self.CurrentLineNumber) + FfsInfObj.Rule = self._Token + + if self._IsKeyword("VERSION"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Version", self.FileName, self.CurrentLineNumber) + + if self._GetStringData(): + FfsInfObj.Version = self._Token + + if self._IsKeyword(BINARY_FILE_TYPE_UI): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("UI name", self.FileName, self.CurrentLineNumber) + + if self._GetStringData(): + FfsInfObj.Ui = self._Token + + if self._IsKeyword("USE"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("ARCH name", self.FileName, self.CurrentLineNumber) + FfsInfObj.UseArch = self._Token + + + if self._GetNextToken(): + p = compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))') + if p.match(self._Token) and p.match(self._Token).span()[1] == len(self._Token): + FfsInfObj.KeyStringList.append(self._Token) + if not self._IsToken(TAB_COMMA_SPLIT): return else: - self.__UndoToken() + self._UndoToken() return - while self.__GetNextToken(): - if not p.match(self.__Token): - raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) - FfsInfObj.KeyStringList.append(self.__Token) + while self._GetNextToken(): + if not p.match(self._Token): + raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) + FfsInfObj.KeyStringList.append(self._Token) - if not self.__IsToken(","): + if not self._IsToken(TAB_COMMA_SPLIT): break - ## __GetFileStatement() method + ## _GetFileStatement() method # # Get FILE statements # # @param self The object pointer # @param Obj for whom FILE statement is got - # @param MacroDict dictionary used to replace macro # @retval True Successfully find FILE statement # @retval False Not able to find FILE statement # - def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}): - - if not self.__IsKeyword( "FILE"): + def _GetFileStatement(self, Obj, ForCapsule = False): + if not self._IsKeyword("FILE"): return False - if not self.__GetNextWord(): - raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber) + if not self._GetNextWord(): + raise Warning.Expected("FFS type", self.FileName, self.CurrentLineNumber) - if ForCapsule and self.__Token == 'DATA': - self.__UndoToken() - self.__UndoToken() + if ForCapsule and self._Token == 'DATA': + self._UndoToken() + self._UndoToken() return False - - FfsFileObj = FfsFileStatement.FileStatement() - FfsFileObj.FvFileType = self.__Token - - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextGuid(): - if not self.__GetNextWord(): - raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber) - if self.__Token == 'PCD': - if not self.__IsToken( "("): - raise Warning("expected '('", self.FileName, self.CurrentLineNumber) - PcdPair = self.__GetNextPcdName() - if not self.__IsToken( ")"): - raise Warning("expected ')'", self.FileName, self.CurrentLineNumber) - self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' - - FfsFileObj.NameGuid = self.__Token - - self.__GetFilePart( FfsFileObj, MacroDict.copy()) + + FfsFileObj = FileStatement() + FfsFileObj.FvFileType = self._Token + + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._GetNextGuid(): + if not self._GetNextWord(): + raise Warning.Expected("File GUID", self.FileName, self.CurrentLineNumber) + if self._Token == 'PCD': + if not self._IsToken("("): + raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber) + PcdPair = self._GetNextPcdSettings() + if not self._IsToken(")"): + raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber) + self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')' + + FfsFileObj.NameGuid = self._Token + + self._GetFilePart(FfsFileObj) if ForCapsule: - capsuleFfs = CapsuleData.CapsuleFfs() + capsuleFfs = CapsuleFfs() capsuleFfs.Ffs = FfsFileObj Obj.CapsuleDataList.append(capsuleFfs) else: @@ -2615,129 +2563,126 @@ class FdfParser: return True - ## __FileCouldHaveRelocFlag() method + ## _FileCouldHaveRelocFlag() method # # Check whether reloc strip flag can be set for a file type. # - # @param self The object pointer # @param FileType The file type to check with # @retval True This type could have relocation strip flag # @retval False No way to have it # - - def __FileCouldHaveRelocFlag (self, FileType): - if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'): + @staticmethod + def _FileCouldHaveRelocFlag (FileType): + if FileType in {SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_MM_CORE_STANDALONE, 'PEI_DXE_COMBO'}: return True else: return False - ## __SectionCouldHaveRelocFlag() method + ## _SectionCouldHaveRelocFlag() method # # Check whether reloc strip flag can be set for a section type. # - # @param self The object pointer # @param SectionType The section type to check with # @retval True This type could have relocation strip flag # @retval False No way to have it # - - def __SectionCouldHaveRelocFlag (self, SectionType): - if SectionType in ('TE', 'PE32'): + @staticmethod + def _SectionCouldHaveRelocFlag (SectionType): + if SectionType in {BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32}: return True else: return False - ## __GetFilePart() method + ## _GetFilePart() method # # Get components for FILE statement # # @param self The object pointer # @param FfsFileObj for whom component is got - # @param MacroDict dictionary used to replace macro # - def __GetFilePart(self, FfsFileObj, MacroDict = {}): - - self.__GetFileOpts( FfsFileObj) + def _GetFilePart(self, FfsFileObj): + self._GetFileOpts(FfsFileObj) - if not self.__IsToken("{"): - if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'): - if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType): - if self.__Token == 'RELOCS_STRIPPED': + if not self._IsToken("{"): + if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'): + if self._FileCouldHaveRelocFlag(FfsFileObj.FvFileType): + if self._Token == 'RELOCS_STRIPPED': FfsFileObj.KeepReloc = False else: FfsFileObj.KeepReloc = True else: raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) - if not self.__IsToken("{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("File name or section data", self.FileName, self.CurrentLineNumber) - if self.__Token == "FV": - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV name", self.FileName, self.CurrentLineNumber) - FfsFileObj.FvName = self.__Token + if self._Token == BINARY_FILE_TYPE_FV: + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber) + FfsFileObj.FvName = self._Token - elif self.__Token == "FD": - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FD name", self.FileName, self.CurrentLineNumber) - FfsFileObj.FdName = self.__Token + elif self._Token == "FD": + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FD name", self.FileName, self.CurrentLineNumber) + FfsFileObj.FdName = self._Token - elif self.__Token in ("DEFINE", "APRIORI", "SECTION"): - self.__UndoToken() - self.__GetSectionData( FfsFileObj, MacroDict) + elif self._Token in {TAB_DEFINE, "APRIORI", "SECTION"}: + self._UndoToken() + self._GetSectionData(FfsFileObj) elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW': - self.__UndoToken() - self.__GetRAWData(FfsFileObj, MacroDict) + self._UndoToken() + self._GetRAWData(FfsFileObj) else: FfsFileObj.CurrentLineNum = self.CurrentLineNumber - FfsFileObj.CurrentLineContent = self.__CurrentLine() - FfsFileObj.FileName = self.__Token.replace('$(SPACE)', ' ') - self.__VerifyFile(FfsFileObj.FileName) + FfsFileObj.CurrentLineContent = self._CurrentLine() + FfsFileObj.FileName = self._Token.replace('$(SPACE)', ' ') + self._VerifyFile(FfsFileObj.FileName) - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - ## __GetRAWData() method + ## _GetRAWData() method # # Get RAW data for FILE statement # # @param self The object pointer # @param FfsFileObj for whom section is got - # @param MacroDict dictionary used to replace macro # - def __GetRAWData(self, FfsFileObj, MacroDict = {}): + def _GetRAWData(self, FfsFileObj): FfsFileObj.FileName = [] FfsFileObj.SubAlignment = [] while True: AlignValue = None - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - AlignValue = self.__Token - if not self.__GetNextToken(): - raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber) - - FileName = self.__Token.replace('$(SPACE)', ' ') - if FileName == '}': - self.__UndoToken() - raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber) - - self.__VerifyFile(FileName) + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + #For FFS, Auto is default option same to "" + if not self._Token == "Auto": + AlignValue = self._Token + if not self._GetNextToken(): + raise Warning.Expected("Filename value", self.FileName, self.CurrentLineNumber) + + FileName = self._Token.replace('$(SPACE)', ' ') + if FileName == T_CHAR_BRACE_R: + self._UndoToken() + raise Warning.Expected("Filename value", self.FileName, self.CurrentLineNumber) + + self._VerifyFile(FileName) File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir) FfsFileObj.FileName.append(File.Path) FfsFileObj.SubAlignment.append(AlignValue) - if self.__IsToken( "}"): - self.__UndoToken() + if self._IsToken(T_CHAR_BRACE_R): + self._UndoToken() break if len(FfsFileObj.SubAlignment) == 1: @@ -2745,45 +2690,43 @@ class FdfParser: if len(FfsFileObj.FileName) == 1: FfsFileObj.FileName = FfsFileObj.FileName[0] - ## __GetFileOpts() method + ## _GetFileOpts() method # # Get options for FILE statement # # @param self The object pointer # @param FfsFileObj for whom options is got # - def __GetFileOpts(self, FfsFileObj): - - if self.__GetNextToken(): - Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)') - if Pattern.match(self.__Token): - FfsFileObj.KeyStringList.append(self.__Token) - if self.__IsToken(","): - while self.__GetNextToken(): - if not Pattern.match(self.__Token): - raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) - FfsFileObj.KeyStringList.append(self.__Token) - - if not self.__IsToken(","): + def _GetFileOpts(self, FfsFileObj): + if self._GetNextToken(): + if TokenFindPattern.match(self._Token): + FfsFileObj.KeyStringList.append(self._Token) + if self._IsToken(TAB_COMMA_SPLIT): + while self._GetNextToken(): + if not TokenFindPattern.match(self._Token): + raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) + FfsFileObj.KeyStringList.append(self._Token) + + if not self._IsToken(TAB_COMMA_SPLIT): break else: - self.__UndoToken() + self._UndoToken() - if self.__IsKeyword( "FIXED", True): + if self._IsKeyword("FIXED", True): FfsFileObj.Fixed = True - if self.__IsKeyword( "CHECKSUM", True): + if self._IsKeyword("CHECKSUM", True): FfsFileObj.CheckSum = True - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) #For FFS, Auto is default option same to "" - if not self.__Token == "Auto": - FfsFileObj.Alignment = self.__Token + if not self._Token == "Auto": + FfsFileObj.Alignment = self._Token - ## __GetAlignment() method + ## _GetAlignment() method # # Return the alignment value # @@ -2791,143 +2734,131 @@ class FdfParser: # @retval True Successfully find alignment # @retval False Not able to find alignment # - def __GetAlignment(self): - if self.__IsKeyword( "Align", True): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + def _GetAlignment(self): + if self._IsKeyword("Align", True): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("alignment value", self.FileName, self.CurrentLineNumber) return True return False - ## __GetFilePart() method + ## _GetSectionData() method # # Get section data for FILE statement # # @param self The object pointer # @param FfsFileObj for whom section is got - # @param MacroDict dictionary used to replace macro # - def __GetSectionData(self, FfsFileObj, MacroDict = {}): - Dict = {} - Dict.update(MacroDict) - - self.__GetDefineStatements(FfsFileObj) - - Dict.update(FfsFileObj.DefineVarDict) - self.__GetAprioriSection(FfsFileObj, Dict.copy()) - self.__GetAprioriSection(FfsFileObj, Dict.copy()) + def _GetSectionData(self, FfsFileObj): + self._GetDefineStatements(FfsFileObj) while True: - IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict) - IsEncapSection = self.__GetEncapsulationSec(FfsFileObj) + IsLeafSection = self._GetLeafSection(FfsFileObj) + IsEncapSection = self._GetEncapsulationSec(FfsFileObj) if not IsLeafSection and not IsEncapSection: break - ## __GetLeafSection() method + ## _GetLeafSection() method # # Get leaf section for Obj # # @param self The object pointer # @param Obj for whom leaf section is got - # @param MacroDict dictionary used to replace macro # @retval True Successfully find section statement # @retval False Not able to find section statement # - def __GetLeafSection(self, Obj, MacroDict = {}): - + def _GetLeafSection(self, Obj): OldPos = self.GetFileBufferPos() - if not self.__IsKeyword( "SECTION"): + if not self._IsKeyword("SECTION"): if len(Obj.SectionList) == 0: - raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("SECTION", self.FileName, self.CurrentLineNumber) else: return False AlignValue = None - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - AlignValue = self.__Token + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + AlignValue = self._Token BuildNum = None - if self.__IsKeyword( "BUILD_NUM"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if self._IsKeyword("BUILD_NUM"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Build number value", self.FileName, self.CurrentLineNumber) - BuildNum = self.__Token + BuildNum = self._Token - if self.__IsKeyword( "VERSION"): + if self._IsKeyword("VERSION"): if AlignValue == 'Auto': raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected version", self.FileName, self.CurrentLineNumber) - VerSectionObj = VerSection.VerSection() + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("version", self.FileName, self.CurrentLineNumber) + VerSectionObj = VerSection() VerSectionObj.Alignment = AlignValue VerSectionObj.BuildNum = BuildNum - if self.__GetStringData(): - VerSectionObj.StringData = self.__Token + if self._GetStringData(): + VerSectionObj.StringData = self._Token else: - VerSectionObj.FileName = self.__Token + VerSectionObj.FileName = self._Token Obj.SectionList.append(VerSectionObj) - - elif self.__IsKeyword( "UI"): + + elif self._IsKeyword(BINARY_FILE_TYPE_UI): if AlignValue == 'Auto': raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected UI", self.FileName, self.CurrentLineNumber) - UiSectionObj = UiSection.UiSection() + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("UI", self.FileName, self.CurrentLineNumber) + UiSectionObj = UiSection() UiSectionObj.Alignment = AlignValue - if self.__GetStringData(): - UiSectionObj.StringData = self.__Token + if self._GetStringData(): + UiSectionObj.StringData = self._Token else: - UiSectionObj.FileName = self.__Token + UiSectionObj.FileName = self._Token Obj.SectionList.append(UiSectionObj) - elif self.__IsKeyword( "FV_IMAGE"): + elif self._IsKeyword("FV_IMAGE"): if AlignValue == 'Auto': raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV name or FV file path", self.FileName, self.CurrentLineNumber) - FvName = self.__Token + FvName = self._Token FvObj = None - if self.__IsToken( "{"): - FvObj = Fv.FV() + if self._IsToken("{"): + FvObj = FV() FvObj.UiFvName = FvName.upper() - self.__GetDefineStatements(FvObj) - MacroDict.update(FvObj.DefineVarDict) - self.__GetBlockStatement(FvObj) - self.__GetSetStatements(FvObj) - self.__GetFvAlignment(FvObj) - self.__GetFvAttributes(FvObj) - self.__GetAprioriSection(FvObj, MacroDict.copy()) - self.__GetAprioriSection(FvObj, MacroDict.copy()) + self._GetDefineStatements(FvObj) + + self._GetBlockStatement(FvObj) + self._GetSetStatements(FvObj) + self._GetFvAlignment(FvObj) + self._GetFvAttributes(FvObj) while True: - IsInf = self.__GetInfStatement(FvObj, MacroDict.copy()) - IsFile = self.__GetFileStatement(FvObj, MacroDict.copy()) + IsInf = self._GetInfStatement(FvObj) + IsFile = self._GetFileStatement(FvObj) if not IsInf and not IsFile: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - FvImageSectionObj = FvImageSection.FvImageSection() + FvImageSectionObj = FvImageSection() FvImageSectionObj.Alignment = AlignValue - if FvObj != None: + if FvObj is not None: FvImageSectionObj.Fv = FvObj FvImageSectionObj.FvName = None else: @@ -2936,81 +2867,81 @@ class FdfParser: Obj.SectionList.append(FvImageSectionObj) - elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"): + elif self._IsKeyword("PEI_DEPEX_EXP") or self._IsKeyword("DXE_DEPEX_EXP") or self._IsKeyword("SMM_DEPEX_EXP"): if AlignValue == 'Auto': raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - DepexSectionObj = DepexSection.DepexSection() + DepexSectionObj = DepexSection() DepexSectionObj.Alignment = AlignValue - DepexSectionObj.DepexType = self.__Token + DepexSectionObj.DepexType = self._Token - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__IsToken( "{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) - if not self.__SkipToToken( "}"): - raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) + if not self._SkipToToken(T_CHAR_BRACE_R): + raise Warning.Expected("Depex expression ending '}'", self.FileName, self.CurrentLineNumber) - DepexSectionObj.Expression = self.__SkippedChars.rstrip('}') + DepexSectionObj.Expression = self._SkippedChars.rstrip(T_CHAR_BRACE_R) Obj.SectionList.append(DepexSectionObj) else: - if not self.__GetNextWord(): - raise Warning("expected section type", self.FileName, self.CurrentLineNumber) + if not self._GetNextWord(): + raise Warning.Expected("section type", self.FileName, self.CurrentLineNumber) # Encapsulation section appear, UndoToken and return - if self.__Token == "COMPRESS" or self.__Token == "GUIDED": + if self._Token == "COMPRESS" or self._Token == "GUIDED": self.SetFileBufferPos(OldPos) return False - if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\ - "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"): - raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'): + if self._Token not in {"COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\ + BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX}: + raise Warning("Unknown section type '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + if AlignValue == 'Auto'and (not self._Token == BINARY_FILE_TYPE_PE32) and (not self._Token == BINARY_FILE_TYPE_TE): raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) # DataSection - DataSectionObj = DataSection.DataSection() + DataSectionObj = DataSection() DataSectionObj.Alignment = AlignValue - DataSectionObj.SecType = self.__Token + DataSectionObj.SecType = self._Token - if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'): - if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType): - if self.__Token == 'RELOCS_STRIPPED': + if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'): + if self._FileCouldHaveRelocFlag(Obj.FvFileType) and self._SectionCouldHaveRelocFlag(DataSectionObj.SecType): + if self._Token == 'RELOCS_STRIPPED': DataSectionObj.KeepReloc = False else: DataSectionObj.KeepReloc = True else: raise Warning("File type %s, section type %s, could not have reloc strip flag%d" % (Obj.FvFileType, DataSectionObj.SecType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) - if self.__IsToken("="): - if not self.__GetNextToken(): - raise Warning("expected section file path", self.FileName, self.CurrentLineNumber) - DataSectionObj.SectFileName = self.__Token - self.__VerifyFile(DataSectionObj.SectFileName) + if self._IsToken(TAB_EQUAL_SPLIT): + if not self._GetNextToken(): + raise Warning.Expected("section file path", self.FileName, self.CurrentLineNumber) + DataSectionObj.SectFileName = self._Token + self._VerifyFile(DataSectionObj.SectFileName) else: - if not self.__GetCglSection(DataSectionObj): + if not self._GetCglSection(DataSectionObj): return False Obj.SectionList.append(DataSectionObj) return True - ## __VerifyFile + ## _VerifyFile # # Check if file exists or not: # If current phase if GenFds, the file must exist; # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist # @param FileName: File path to be verified. # - def __VerifyFile(self, FileName): - if FileName.replace('$(WORKSPACE)', '').find('$') != -1: + def _VerifyFile(self, FileName): + if FileName.replace(TAB_WORKSPACE, '').find('$') != -1: return - if not GlobalData.gAutoGenPhase or not self.__GetMacroValue("OUTPUT_DIRECTORY") in FileName: + if not GlobalData.gAutoGenPhase or not self._GetMacroValue(TAB_DSC_DEFINES_OUTPUT_DIRECTORY) in FileName: ErrorCode, ErrorInfo = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() if ErrorCode != 0: EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - ## __GetCglSection() method + ## _GetCglSection() method # # Get compressed or GUIDed section for Obj # @@ -3020,45 +2951,41 @@ class FdfParser: # @retval True Successfully find section statement # @retval False Not able to find section statement # - def __GetCglSection(self, Obj, AlignValue = None): + def _GetCglSection(self, Obj, AlignValue = None): - if self.__IsKeyword( "COMPRESS"): + if self._IsKeyword("COMPRESS"): type = "PI_STD" - if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"): - type = self.__Token + if self._IsKeyword("PI_STD") or self._IsKeyword("PI_NONE"): + type = self._Token - if not self.__IsToken("{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - CompressSectionObj = CompressSection.CompressSection() + CompressSectionObj = CompressSection() CompressSectionObj.Alignment = AlignValue CompressSectionObj.CompType = type # Recursive sections... while True: - IsLeafSection = self.__GetLeafSection(CompressSectionObj) - IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj) + IsLeafSection = self._GetLeafSection(CompressSectionObj) + IsEncapSection = self._GetEncapsulationSec(CompressSectionObj) if not IsLeafSection and not IsEncapSection: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) Obj.SectionList.append(CompressSectionObj) - -# else: -# raise Warning("Compress type not known") - return True - elif self.__IsKeyword( "GUIDED"): + elif self._IsKeyword("GUIDED"): GuidValue = None - if self.__GetNextGuid(): - GuidValue = self.__Token + if self._GetNextGuid(): + GuidValue = self._Token - AttribDict = self.__GetGuidAttrib() - if not self.__IsToken("{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) - GuidSectionObj = GuidSection.GuidSection() + AttribDict = self._GetGuidAttrib() + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) + GuidSectionObj = GuidSection() GuidSectionObj.Alignment = AlignValue GuidSectionObj.NameGuid = GuidValue GuidSectionObj.SectionType = "GUIDED" @@ -3067,57 +2994,56 @@ class FdfParser: GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"] # Recursive sections... while True: - IsLeafSection = self.__GetLeafSection(GuidSectionObj) - IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj) + IsLeafSection = self._GetLeafSection(GuidSectionObj) + IsEncapSection = self._GetEncapsulationSec(GuidSectionObj) if not IsLeafSection and not IsEncapSection: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) Obj.SectionList.append(GuidSectionObj) return True return False - ## __GetGuidAttri() method + ## _GetGuidAttri() method # # Get attributes for GUID section # # @param self The object pointer # @retval AttribDict Dictionary of key-value pair of section attributes # - def __GetGuidAttrib(self): - + def _GetGuidAttrib(self): AttribDict = {} AttribDict["PROCESSING_REQUIRED"] = "NONE" AttribDict["AUTH_STATUS_VALID"] = "NONE" AttribDict["EXTRA_HEADER_SIZE"] = -1 - while self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID") \ - or self.__IsKeyword("EXTRA_HEADER_SIZE"): - AttribKey = self.__Token + while self._IsKeyword("PROCESSING_REQUIRED") or self._IsKeyword("AUTH_STATUS_VALID") \ + or self._IsKeyword("EXTRA_HEADER_SIZE"): + AttribKey = self._Token - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber) elif AttribKey == "EXTRA_HEADER_SIZE": Base = 10 - if self.__Token[0:2].upper() == "0X": + if self._Token[0:2].upper() == "0X": Base = 16 try: - AttribDict[AttribKey] = int(self.__Token, Base) + AttribDict[AttribKey] = int(self._Token, Base) continue except ValueError: - raise Warning("expected Number", self.FileName, self.CurrentLineNumber) - elif self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"): - raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber) - AttribDict[AttribKey] = self.__Token + raise Warning.Expected("Number", self.FileName, self.CurrentLineNumber) + elif self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}: + raise Warning.Expected("TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber) + AttribDict[AttribKey] = self._Token return AttribDict - ## __GetEncapsulationSec() method + ## _GetEncapsulationSec() method # # Get encapsulation section for FILE # @@ -3126,89 +3052,107 @@ class FdfParser: # @retval True Successfully find section statement # @retval False Not able to find section statement # - def __GetEncapsulationSec(self, FfsFileObj): - + def _GetEncapsulationSec(self, FfsFileObj): OldPos = self.GetFileBufferPos() - if not self.__IsKeyword( "SECTION"): + if not self._IsKeyword("SECTION"): if len(FfsFileObj.SectionList) == 0: - raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("SECTION", self.FileName, self.CurrentLineNumber) else: return False AlignValue = None - if self.__GetAlignment(): - if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - AlignValue = self.__Token + if self._GetAlignment(): + if self._Token not in ALIGNMENT_NOAUTO: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + AlignValue = self._Token - if not self.__GetCglSection(FfsFileObj, AlignValue): + if not self._GetCglSection(FfsFileObj, AlignValue): self.SetFileBufferPos(OldPos) return False else: return True - def __GetFmp(self): - if not self.__GetNextToken(): + def _GetFmp(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if not S.startswith("[FMPPAYLOAD."): - if not S.startswith("[CAPSULE.") and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [FmpPayload.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[FMPPAYLOAD."): + self.SectionParser(S) + self._UndoToken() return False - self.__UndoToken() - self.__SkipToToken("[FMPPAYLOAD.", True) - FmpUiName = self.__GetUiName().upper() + self._UndoToken() + self._SkipToToken("[FMPPAYLOAD.", True) + FmpUiName = self._GetUiName().upper() if FmpUiName in self.Profile.FmpPayloadDict: raise Warning("Duplicated FMP UI name found: %s" % FmpUiName, self.FileName, self.CurrentLineNumber) - FmpData = CapsuleData.CapsulePayload() + FmpData = CapsulePayload() FmpData.UiName = FmpUiName - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): + if not self._GetNextToken(): raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber) - FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE'] - while self.__Token in FmpKeyList: - Name = self.__Token + FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT'] + while self._Token in FmpKeyList: + Name = self._Token FmpKeyList.remove(Name) - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) if Name == 'IMAGE_TYPE_ID': - if not self.__GetNextGuid(): - raise Warning("expected GUID value for IMAGE_TYPE_ID", self.FileName, self.CurrentLineNumber) - FmpData.ImageTypeId = self.__Token + if not self._GetNextGuid(): + raise Warning.Expected("GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber) + FmpData.ImageTypeId = self._Token + elif Name == 'CERTIFICATE_GUID': + if not self._GetNextGuid(): + raise Warning.Expected("GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber) + FmpData.Certificate_Guid = self._Token + if UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID: + raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber) else: - if not self.__GetNextToken(): - raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber) - Value = self.__Token + if not self._GetNextToken(): + raise Warning.Expected("value of %s" % Name, self.FileName, self.CurrentLineNumber) + Value = self._Token if Name == 'IMAGE_HEADER_INIT_VERSION': - FmpData.Version = Value + if FdfParser._Verify(Name, Value, 'UINT8'): + FmpData.Version = Value elif Name == 'IMAGE_INDEX': - FmpData.ImageIndex = Value + if FdfParser._Verify(Name, Value, 'UINT8'): + FmpData.ImageIndex = Value elif Name == 'HARDWARE_INSTANCE': - FmpData.HardwareInstance = Value - if not self.__GetNextToken(): + if FdfParser._Verify(Name, Value, 'UINT8'): + FmpData.HardwareInstance = Value + elif Name == 'MONOTONIC_COUNT': + if FdfParser._Verify(Name, Value, 'UINT64'): + FmpData.MonotonicCount = Value + if FmpData.MonotonicCount.upper().startswith('0X'): + FmpData.MonotonicCount = int(FmpData.MonotonicCount, 16) + else: + FmpData.MonotonicCount = int(FmpData.MonotonicCount) + if not self._GetNextToken(): break else: - self.__UndoToken() - - if FmpKeyList: - raise Warning("Missing keywords %s in FMP payload section" % ', '.join(FmpKeyList), self.FileName, self.CurrentLineNumber) - ImageFile = self.__ParseRawFileStatement() - if not ImageFile: - raise Warning("Missing image file in FMP payload section", self.FileName, self.CurrentLineNumber) - FmpData.ImageFile = ImageFile - VendorCodeFile = self.__ParseRawFileStatement() - if VendorCodeFile: - FmpData.VendorCodeFile = VendorCodeFile + self._UndoToken() + + if (FmpData.MonotonicCount and not FmpData.Certificate_Guid) or (not FmpData.MonotonicCount and FmpData.Certificate_Guid): + EdkLogger.error("FdfParser", FORMAT_INVALID, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.") + + # Only the IMAGE_TYPE_ID is required item + if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList: + raise Warning("'IMAGE_TYPE_ID' in FMP payload section.", self.FileName, self.CurrentLineNumber) + # get the Image file and Vendor code file + self._GetFMPCapsuleData(FmpData) + if not FmpData.ImageFile: + raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber) + # check whether more than one Vendor code file + if len(FmpData.VendorCodeFile) > 1: + raise Warning("Vendor code file max of 1 per FMP payload section.", self.FileName, self.CurrentLineNumber) self.Profile.FmpPayloadDict[FmpUiName] = FmpData return True - ## __GetCapsule() method + ## _GetCapsule() method # # Get capsule section contents and store its data into capsule list of self.Profile # @@ -3216,128 +3160,140 @@ class FdfParser: # @retval True Successfully find a capsule # @retval False Not able to find a capsule # - def __GetCapsule(self): - - if not self.__GetNextToken(): + def _GetCapsule(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[CAPSULE."): - if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[CAPSULE."): + self.SectionParser(S) + self._UndoToken() return False - self.__UndoToken() - if not self.__IsToken("[CAPSULE.", True): + self._UndoToken() + if not self._IsToken("[CAPSULE.", True): FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber) + # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) + raise Warning.Expected("[Capsule.]", self.FileName, self.CurrentLineNumber) - CapsuleObj = Capsule.Capsule() + CapsuleObj = Capsule() - CapsuleName = self.__GetUiName() + CapsuleName = self._GetUiName() if not CapsuleName: - raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("capsule name", self.FileName, self.CurrentLineNumber) CapsuleObj.UiCapsuleName = CapsuleName.upper() - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - if self.__IsKeyword("CREATE_FILE"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if self._IsKeyword("CREATE_FILE"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected file name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("file name", self.FileName, self.CurrentLineNumber) - CapsuleObj.CreateFile = self.__Token + CapsuleObj.CreateFile = self._Token - self.__GetCapsuleStatements(CapsuleObj) + self._GetCapsuleStatements(CapsuleObj) self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj return True - ## __GetCapsuleStatements() method + ## _GetCapsuleStatements() method # # Get statements for capsule # # @param self The object pointer # @param Obj for whom statements are got # - def __GetCapsuleStatements(self, Obj): - self.__GetCapsuleTokens(Obj) - self.__GetDefineStatements(Obj) - self.__GetSetStatements(Obj) - self.__GetCapsuleData(Obj) + def _GetCapsuleStatements(self, Obj): + self._GetCapsuleTokens(Obj) + self._GetDefineStatements(Obj) + self._GetSetStatements(Obj) + self._GetCapsuleData(Obj) - ## __GetCapsuleTokens() method + ## _GetCapsuleTokens() method # # Get token statements for capsule # # @param self The object pointer # @param Obj for whom token statements are got # - def __GetCapsuleTokens(self, Obj): - if not self.__GetNextToken(): + def _GetCapsuleTokens(self, Obj): + if not self._GetNextToken(): return False - while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"): - Name = self.__Token.strip() - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected value", self.FileName, self.CurrentLineNumber) + while self._Token in {"CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"}: + Name = self._Token.strip() + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("value", self.FileName, self.CurrentLineNumber) if Name == 'CAPSULE_FLAGS': - if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"): - raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber) - Value = self.__Token.strip() - while self.__IsToken(","): - Value += ',' - if not self.__GetNextToken(): - raise Warning("expected value", self.FileName, self.CurrentLineNumber) - if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"): - raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber) - Value += self.__Token.strip() + if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}: + raise Warning.Expected("PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber) + Value = self._Token.strip() + while self._IsToken(TAB_COMMA_SPLIT): + Value += TAB_COMMA_SPLIT + if not self._GetNextToken(): + raise Warning.Expected("value", self.FileName, self.CurrentLineNumber) + if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}: + raise Warning.Expected("PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber) + Value += self._Token.strip() elif Name == 'OEM_CAPSULE_FLAGS': - Value = self.__Token.strip() + Value = self._Token.strip() if not Value.upper().startswith('0X'): - raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("hex value starting with 0x", self.FileName, self.CurrentLineNumber) try: Value = int(Value, 0) except ValueError: - raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("hex string failed to convert to value", self.FileName, self.CurrentLineNumber) if not 0x0000 <= Value <= 0xFFFF: - raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber) - Value = self.__Token.strip() + raise Warning.Expected("hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber) + Value = self._Token.strip() else: - Value = self.__Token.strip() - Obj.TokensDict[Name] = Value - if not self.__GetNextToken(): + Value = self._Token.strip() + Obj.TokensDict[Name] = Value + if not self._GetNextToken(): return False - self.__UndoToken() + self._UndoToken() - ## __GetCapsuleData() method + ## _GetCapsuleData() method # # Get capsule data for capsule # # @param self The object pointer # @param Obj for whom capsule data are got # - def __GetCapsuleData(self, Obj): - + def _GetCapsuleData(self, Obj): while True: - IsInf = self.__GetInfStatement(Obj, True) - IsFile = self.__GetFileStatement(Obj, True) - IsFv = self.__GetFvStatement(Obj) - IsFd = self.__GetFdStatement(Obj) - IsAnyFile = self.__GetAnyFileStatement(Obj) - IsAfile = self.__GetAfileStatement(Obj) - IsFmp = self.__GetFmpStatement(Obj) + IsInf = self._GetInfStatement(Obj, True) + IsFile = self._GetFileStatement(Obj, True) + IsFv = self._GetFvStatement(Obj) + IsFd = self._GetFdStatement(Obj) + IsAnyFile = self._GetAnyFileStatement(Obj) + IsAfile = self._GetAfileStatement(Obj) + IsFmp = self._GetFmpStatement(Obj) if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp): break - ## __GetFvStatement() method + ## _GetFMPCapsuleData() method + # + # Get capsule data for FMP capsule + # + # @param self The object pointer + # @param Obj for whom capsule data are got + # + def _GetFMPCapsuleData(self, Obj): + while True: + IsFv = self._GetFvStatement(Obj, True) + IsFd = self._GetFdStatement(Obj, True) + IsAnyFile = self._GetAnyFileStatement(Obj, True) + if not (IsFv or IsFd or IsAnyFile): + break + + ## _GetFvStatement() method # # Get FV for capsule # @@ -3346,26 +3302,31 @@ class FdfParser: # @retval True Successfully find a FV statement # @retval False Not able to find a FV statement # - def __GetFvStatement(self, CapsuleObj): - - if not self.__IsKeyword("FV"): + def _GetFvStatement(self, CapsuleObj, FMPCapsule = False): + if not self._IsKeyword(BINARY_FILE_TYPE_FV): return False - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FV name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in self.Profile.FvDict.keys(): + if self._Token.upper() not in self.Profile.FvDict: raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber) - CapsuleFv = CapsuleData.CapsuleFv() - CapsuleFv.FvName = self.__Token - CapsuleObj.CapsuleDataList.append(CapsuleFv) + myCapsuleFv = CapsuleFv() + myCapsuleFv.FvName = self._Token + if FMPCapsule: + if not CapsuleObj.ImageFile: + CapsuleObj.ImageFile.append(myCapsuleFv) + else: + CapsuleObj.VendorCodeFile.append(myCapsuleFv) + else: + CapsuleObj.CapsuleDataList.append(myCapsuleFv) return True - ## __GetFdStatement() method + ## _GetFdStatement() method # # Get FD for capsule # @@ -3374,65 +3335,73 @@ class FdfParser: # @retval True Successfully find a FD statement # @retval False Not able to find a FD statement # - def __GetFdStatement(self, CapsuleObj): - - if not self.__IsKeyword("FD"): + def _GetFdStatement(self, CapsuleObj, FMPCapsule = False): + if not self._IsKeyword("FD"): return False - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected FD name", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("FD name", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in self.Profile.FdDict.keys(): + if self._Token.upper() not in self.Profile.FdDict: raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber) - CapsuleFd = CapsuleData.CapsuleFd() - CapsuleFd.FdName = self.__Token - CapsuleObj.CapsuleDataList.append(CapsuleFd) + myCapsuleFd = CapsuleFd() + myCapsuleFd.FdName = self._Token + if FMPCapsule: + if not CapsuleObj.ImageFile: + CapsuleObj.ImageFile.append(myCapsuleFd) + else: + CapsuleObj.VendorCodeFile.append(myCapsuleFd) + else: + CapsuleObj.CapsuleDataList.append(myCapsuleFd) return True - def __GetFmpStatement(self, CapsuleObj): - if not self.__IsKeyword("FMP"): - return False + def _GetFmpStatement(self, CapsuleObj): + if not self._IsKeyword("FMP_PAYLOAD"): + if not self._IsKeyword("FMP"): + return False - if not self.__IsKeyword("PAYLOAD"): - self.__UndoToken() - return False + if not self._IsKeyword("PAYLOAD"): + self._UndoToken() + return False - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected payload name after FMP PAYLOAD =", self.FileName, self.CurrentLineNumber) - Payload = self.__Token.upper() + if not self._GetNextToken(): + raise Warning.Expected("payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber) + Payload = self._Token.upper() if Payload not in self.Profile.FmpPayloadDict: - raise Warning("This FMP Payload does not exist: %s" % self.__Token, self.FileName, self.CurrentLineNumber) + raise Warning("This FMP Payload does not exist: %s" % self._Token, self.FileName, self.CurrentLineNumber) CapsuleObj.FmpPayloadList.append(self.Profile.FmpPayloadDict[Payload]) return True - def __ParseRawFileStatement(self): - if not self.__IsKeyword("FILE"): + def _ParseRawFileStatement(self): + if not self._IsKeyword("FILE"): return None - if not self.__IsKeyword("DATA"): - self.__UndoToken() + if not self._IsKeyword("DATA"): + self._UndoToken() return None - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._GetNextToken(): + raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber) + + AnyFileName = self._Token + self._VerifyFile(AnyFileName) + + if not os.path.isabs(AnyFileName): + AnyFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, AnyFileName) - if not self.__GetNextToken(): - raise Warning("expected File name", self.FileName, self.CurrentLineNumber) - - AnyFileName = self.__Token - AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName) - if not os.path.exists(AnyFileName): - raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber) return AnyFileName - ## __GetAnyFileStatement() method + ## _GetAnyFileStatement() method # # Get AnyFile for capsule # @@ -3441,17 +3410,23 @@ class FdfParser: # @retval True Successfully find a Anyfile statement # @retval False Not able to find a AnyFile statement # - def __GetAnyFileStatement(self, CapsuleObj): - AnyFileName = self.__ParseRawFileStatement() + def _GetAnyFileStatement(self, CapsuleObj, FMPCapsule = False): + AnyFileName = self._ParseRawFileStatement() if not AnyFileName: return False - CapsuleAnyFile = CapsuleData.CapsuleAnyFile() - CapsuleAnyFile.FileName = AnyFileName - CapsuleObj.CapsuleDataList.append(CapsuleAnyFile) + myCapsuleAnyFile = CapsuleAnyFile() + myCapsuleAnyFile.FileName = AnyFileName + if FMPCapsule: + if not CapsuleObj.ImageFile: + CapsuleObj.ImageFile.append(myCapsuleAnyFile) + else: + CapsuleObj.VendorCodeFile.append(myCapsuleAnyFile) + else: + CapsuleObj.CapsuleDataList.append(myCapsuleAnyFile) return True - - ## __GetAfileStatement() method + + ## _GetAfileStatement() method # # Get Afile for capsule # @@ -3460,39 +3435,38 @@ class FdfParser: # @retval True Successfully find a Afile statement # @retval False Not able to find a Afile statement # - def __GetAfileStatement(self, CapsuleObj): - - if not self.__IsKeyword("APPEND"): + def _GetAfileStatement(self, CapsuleObj): + if not self._IsKeyword("APPEND"): return False - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber) - - AfileName = self.__Token + if not self._GetNextToken(): + raise Warning.Expected("Afile name", self.FileName, self.CurrentLineNumber) + + AfileName = self._Token AfileBaseName = os.path.basename(AfileName) - - if os.path.splitext(AfileBaseName)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]: - raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \ + + if os.path.splitext(AfileBaseName)[1] not in {".bin", ".BIN", ".Bin", ".dat", ".DAT", ".Dat", ".data", ".DATA", ".Data"}: + raise Warning('invalid binary file type, should be one of "bin",BINARY_FILE_TYPE_BIN,"Bin","dat","DAT","Dat","data","DATA","Data"', \ self.FileName, self.CurrentLineNumber) - + if not os.path.isabs(AfileName): AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName) - self.__VerifyFile(AfileName) + self._VerifyFile(AfileName) else: if not os.path.exists(AfileName): raise Warning('%s does not exist' % AfileName, self.FileName, self.CurrentLineNumber) else: pass - CapsuleAfile = CapsuleData.CapsuleAfile() - CapsuleAfile.FileName = AfileName - CapsuleObj.CapsuleDataList.append(CapsuleAfile) + myCapsuleAfile = CapsuleAfile() + myCapsuleAfile.FileName = AfileName + CapsuleObj.CapsuleDataList.append(myCapsuleAfile) return True - ## __GetRule() method + ## _GetRule() method # # Get Rule section contents and store its data into rule list of self.Profile # @@ -3500,146 +3474,157 @@ class FdfParser: # @retval True Successfully find a Rule # @retval False Not able to find a Rule # - def __GetRule(self): - - if not self.__GetNextToken(): + def _GetRule(self): + if not self._GetNextToken(): return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[RULE."): - if not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[RULE."): + self.SectionParser(S) + self._UndoToken() return False - self.__UndoToken() - if not self.__IsToken("[Rule.", True): + self._UndoToken() + if not self._IsToken("[Rule.", True): FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber) + # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) + raise Warning.Expected("[Rule.]", self.FileName, self.CurrentLineNumber) - if not self.__SkipToToken("."): - raise Warning("expected '.'", self.FileName, self.CurrentLineNumber) + if not self._SkipToToken(TAB_SPLIT): + raise Warning.Expected("'.'", self.FileName, self.CurrentLineNumber) - Arch = self.__SkippedChars.rstrip(".") - if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"): + Arch = self._SkippedChars.rstrip(TAB_SPLIT) + if Arch.upper() not in ARCH_SET_FULL: raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber) - ModuleType = self.__GetModuleType() + ModuleType = self._GetModuleType() TemplateName = "" - if self.__IsToken("."): - if not self.__GetNextWord(): - raise Warning("expected template name", self.FileName, self.CurrentLineNumber) - TemplateName = self.__Token + if self._IsToken(TAB_SPLIT): + if not self._GetNextWord(): + raise Warning.Expected("template name", self.FileName, self.CurrentLineNumber) + TemplateName = self._Token - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - RuleObj = self.__GetRuleFileStatements() + RuleObj = self._GetRuleFileStatements() RuleObj.Arch = Arch.upper() RuleObj.ModuleType = ModuleType RuleObj.TemplateName = TemplateName - if TemplateName == '' : + if TemplateName == '': self.Profile.RuleDict['RULE' + \ - '.' + \ + TAB_SPLIT + \ Arch.upper() + \ - '.' + \ + TAB_SPLIT + \ ModuleType.upper() ] = RuleObj - else : + else: self.Profile.RuleDict['RULE' + \ - '.' + \ + TAB_SPLIT + \ Arch.upper() + \ - '.' + \ + TAB_SPLIT + \ ModuleType.upper() + \ - '.' + \ + TAB_SPLIT + \ TemplateName.upper() ] = RuleObj -# self.Profile.RuleList.append(rule) return True - ## __GetModuleType() method + ## _GetModuleType() method # # Return the module type # # @param self The object pointer # @retval string module type # - def __GetModuleType(self): - - if not self.__GetNextWord(): - raise Warning("expected Module type", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \ - "DXE_DRIVER", "DXE_SAL_DRIVER", \ - "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \ - "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \ - "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \ - "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"): - raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - return self.__Token - - ## __GetFileExtension() method + def _GetModuleType(self): + if not self._GetNextWord(): + raise Warning.Expected("Module type", self.FileName, self.CurrentLineNumber) + if self._Token.upper() not in { + SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, + SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, + SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, + SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_UEFI_DRIVER, + SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, + TAB_DEFAULT, SUP_MODULE_BASE, + EDK_COMPONENT_TYPE_SECURITY_CORE, + EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER, + EDK_COMPONENT_TYPE_PIC_PEIM, + EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, "PE32_PEIM", + EDK_COMPONENT_TYPE_BS_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, + EDK_COMPONENT_TYPE_SAL_RT_DRIVER, + EDK_COMPONENT_TYPE_APPLICATION, "ACPITABLE", + SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, + SUP_MODULE_MM_CORE_STANDALONE}: + raise Warning("Unknown Module type '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + return self._Token + + ## _GetFileExtension() method # # Return the file extension # # @param self The object pointer # @retval string file name extension # - def __GetFileExtension(self): - if not self.__IsToken("."): - raise Warning("expected '.'", self.FileName, self.CurrentLineNumber) + def _GetFileExtension(self): + if not self._IsToken(TAB_SPLIT): + raise Warning.Expected("'.'", self.FileName, self.CurrentLineNumber) Ext = "" - if self.__GetNextToken(): - Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)') - if Pattern.match(self.__Token): - Ext = self.__Token - return '.' + Ext + if self._GetNextToken(): + if FileExtensionPattern.match(self._Token): + Ext = self._Token + return TAB_SPLIT + Ext else: - raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + raise Warning("Unknown file extension '%s'" % self._Token, self.FileName, self.CurrentLineNumber) else: - raise Warning("expected file extension", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("file extension", self.FileName, self.CurrentLineNumber) - ## __GetRuleFileStatement() method + ## _GetRuleFileStatement() method # # Get rule contents # # @param self The object pointer # @retval Rule Rule object # - def __GetRuleFileStatements(self): - - if not self.__IsKeyword("FILE"): - raise Warning("expected FILE", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextWord(): - raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber) - - Type = self.__Token.strip().upper() - if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\ - "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"): - raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + def _GetRuleFileStatements(self): + if not self._IsKeyword("FILE"): + raise Warning.Expected("FILE", self.FileName, self.CurrentLineNumber) + + if not self._GetNextWord(): + raise Warning.Expected("FFS type", self.FileName, self.CurrentLineNumber) + + Type = self._Token.strip().upper() + if Type not in {"RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, + "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE, EDK_COMPONENT_TYPE_APPLICATION, + "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, + SUP_MODULE_MM_CORE_STANDALONE}: + raise Warning("Unknown FV type '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + + if not self._IsKeyword("$(NAMED_GUID)"): + if not self._GetNextWord(): + NamedGuid = self._CurrentLine()[self.CurrentOffsetWithinLine:].split()[0].strip() + if GlobalData.gGuidPatternEnd.match(NamedGuid): + self.CurrentOffsetWithinLine += len(NamedGuid) + self._Token = NamedGuid + else: + raise Warning.Expected("$(NAMED_GUID)", self.FileName, self.CurrentLineNumber) + if self._Token == 'PCD': + if not self._IsToken("("): + raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber) + PcdPair = self._GetNextPcdSettings() + if not self._IsToken(")"): + raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber) + self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')' - if not self.__IsKeyword("$(NAMED_GUID)"): - if not self.__GetNextWord(): - raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber) - if self.__Token == 'PCD': - if not self.__IsToken( "("): - raise Warning("expected '('", self.FileName, self.CurrentLineNumber) - PcdPair = self.__GetNextPcdName() - if not self.__IsToken( ")"): - raise Warning("expected ')'", self.FileName, self.CurrentLineNumber) - self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' - - NameGuid = self.__Token + NameGuid = self._Token KeepReloc = None - if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'): - if self.__FileCouldHaveRelocFlag(Type): - if self.__Token == 'RELOCS_STRIPPED': + if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'): + if self._FileCouldHaveRelocFlag(Type): + if self._Token == 'RELOCS_STRIPPED': KeepReloc = False else: KeepReloc = True @@ -3647,110 +3632,113 @@ class FdfParser: raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) KeyStringList = [] - if self.__GetNextToken(): - Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)') - if Pattern.match(self.__Token): - KeyStringList.append(self.__Token) - if self.__IsToken(","): - while self.__GetNextToken(): - if not Pattern.match(self.__Token): - raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) - KeyStringList.append(self.__Token) - - if not self.__IsToken(","): + if self._GetNextToken(): + if TokenFindPattern.match(self._Token): + KeyStringList.append(self._Token) + if self._IsToken(TAB_COMMA_SPLIT): + while self._GetNextToken(): + if not TokenFindPattern.match(self._Token): + raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber) + KeyStringList.append(self._Token) + + if not self._IsToken(TAB_COMMA_SPLIT): break else: - self.__UndoToken() + self._UndoToken() Fixed = False - if self.__IsKeyword("Fixed", True): + if self._IsKeyword("Fixed", True): Fixed = True CheckSum = False - if self.__IsKeyword("CheckSum", True): + if self._IsKeyword("CheckSum", True): CheckSum = True AlignValue = "" - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) #For FFS, Auto is default option same to "" - if not self.__Token == "Auto": - AlignValue = self.__Token + if not self._Token == "Auto": + AlignValue = self._Token - if self.__IsToken("{"): + if self._IsToken("{"): # Complex file rule expected - Rule = RuleComplexFile.RuleComplexFile() - Rule.FvFileType = Type - Rule.NameGuid = NameGuid - Rule.Alignment = AlignValue - Rule.CheckSum = CheckSum - Rule.Fixed = Fixed - Rule.KeyStringList = KeyStringList - if KeepReloc != None: - Rule.KeepReloc = KeepReloc + NewRule = RuleComplexFile() + NewRule.FvFileType = Type + NewRule.NameGuid = NameGuid + NewRule.Alignment = AlignValue + NewRule.CheckSum = CheckSum + NewRule.Fixed = Fixed + NewRule.KeyStringList = KeyStringList + if KeepReloc is not None: + NewRule.KeepReloc = KeepReloc while True: - IsEncapsulate = self.__GetRuleEncapsulationSection(Rule) - IsLeaf = self.__GetEfiSection(Rule) + IsEncapsulate = self._GetRuleEncapsulationSection(NewRule) + IsLeaf = self._GetEfiSection(NewRule) if not IsEncapsulate and not IsLeaf: break - if not self.__IsToken("}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) - return Rule + return NewRule else: # Simple file rule expected - if not self.__GetNextWord(): - raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber) + if not self._GetNextWord(): + raise Warning.Expected("leaf section type", self.FileName, self.CurrentLineNumber) - SectionName = self.__Token + SectionName = self._Token - if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\ - "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"): + if SectionName not in { + "COMPAT16", BINARY_FILE_TYPE_PE32, + BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", + "RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, + BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", + BINARY_FILE_TYPE_SMM_DEPEX}: raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber) - if self.__IsKeyword("Fixed", True): + if self._IsKeyword("Fixed", True): Fixed = True - if self.__IsKeyword("CheckSum", True): + if self._IsKeyword("CheckSum", True): CheckSum = True SectAlignment = "" - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE): raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - SectAlignment = self.__Token + SectAlignment = self._Token Ext = None - if self.__IsToken('|'): - Ext = self.__GetFileExtension() - elif not self.__GetNextToken(): - raise Warning("expected File name", self.FileName, self.CurrentLineNumber) - - Rule = RuleSimpleFile.RuleSimpleFile() - Rule.SectionType = SectionName - Rule.FvFileType = Type - Rule.NameGuid = NameGuid - Rule.Alignment = AlignValue - Rule.SectAlignment = SectAlignment - Rule.CheckSum = CheckSum - Rule.Fixed = Fixed - Rule.KeyStringList = KeyStringList - if KeepReloc != None: - Rule.KeepReloc = KeepReloc - Rule.FileExtension = Ext - Rule.FileName = self.__Token - return Rule - - ## __GetEfiSection() method + if self._IsToken(TAB_VALUE_SPLIT): + Ext = self._GetFileExtension() + elif not self._GetNextToken(): + raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber) + + NewRule = RuleSimpleFile() + NewRule.SectionType = SectionName + NewRule.FvFileType = Type + NewRule.NameGuid = NameGuid + NewRule.Alignment = AlignValue + NewRule.SectAlignment = SectAlignment + NewRule.CheckSum = CheckSum + NewRule.Fixed = Fixed + NewRule.KeyStringList = KeyStringList + if KeepReloc is not None: + NewRule.KeepReloc = KeepReloc + NewRule.FileExtension = Ext + NewRule.FileName = self._Token + return NewRule + + ## _GetEfiSection() method # # Get section list for Rule # @@ -3759,208 +3747,231 @@ class FdfParser: # @retval True Successfully find section statement # @retval False Not able to find section statement # - def __GetEfiSection(self, Obj): - + def _GetEfiSection(self, Obj): OldPos = self.GetFileBufferPos() - if not self.__GetNextWord(): - return False - SectionName = self.__Token - - if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\ - "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"): - self.__UndoToken() + EfiSectionObj = EfiSection() + if not self._GetNextWord(): + CurrentLine = self._CurrentLine()[self.CurrentOffsetWithinLine:].split()[0].strip() + if self._Token == '{' and Obj.FvFileType == "RAW" and TAB_SPLIT in CurrentLine: + if self._IsToken(TAB_VALUE_SPLIT): + EfiSectionObj.FileExtension = self._GetFileExtension() + elif self._GetNextToken(): + EfiSectionObj.FileName = self._Token + EfiSectionObj.SectionType = BINARY_FILE_TYPE_RAW + Obj.SectionList.append(EfiSectionObj) + return True + else: + return False + SectionName = self._Token + + if SectionName not in { + "COMPAT16", BINARY_FILE_TYPE_PE32, + BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", + "RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, + BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", + BINARY_FILE_TYPE_SMM_DEPEX, BINARY_FILE_TYPE_GUID}: + self._UndoToken() return False if SectionName == "FV_IMAGE": - FvImageSectionObj = FvImageSection.FvImageSection() - if self.__IsKeyword("FV_IMAGE"): + FvImageSectionObj = FvImageSection() + if self._IsKeyword("FV_IMAGE"): pass - if self.__IsToken( "{"): - FvObj = Fv.FV() - self.__GetDefineStatements(FvObj) - self.__GetBlockStatement(FvObj) - self.__GetSetStatements(FvObj) - self.__GetFvAlignment(FvObj) - self.__GetFvAttributes(FvObj) - self.__GetAprioriSection(FvObj) - self.__GetAprioriSection(FvObj) + if self._IsToken("{"): + FvObj = FV() + self._GetDefineStatements(FvObj) + self._GetBlockStatement(FvObj) + self._GetSetStatements(FvObj) + self._GetFvAlignment(FvObj) + self._GetFvAttributes(FvObj) + self._GetAprioriSection(FvObj) + self._GetAprioriSection(FvObj) while True: - IsInf = self.__GetInfStatement(FvObj) - IsFile = self.__GetFileStatement(FvObj) + IsInf = self._GetInfStatement(FvObj) + IsFile = self._GetFileStatement(FvObj) if not IsInf and not IsFile: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) FvImageSectionObj.Fv = FvObj FvImageSectionObj.FvName = None else: - if not self.__IsKeyword("FV"): - raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber) - FvImageSectionObj.FvFileType = self.__Token - - if self.__GetAlignment(): - if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - FvImageSectionObj.Alignment = self.__Token - - if self.__IsToken('|'): - FvImageSectionObj.FvFileExtension = self.__GetFileExtension() - elif self.__GetNextToken(): - if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\ - "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"): - FvImageSectionObj.FvFileName = self.__Token + if not self._IsKeyword(BINARY_FILE_TYPE_FV): + raise Warning.Expected("'FV'", self.FileName, self.CurrentLineNumber) + FvImageSectionObj.FvFileType = self._Token + + if self._GetAlignment(): + if self._Token not in ALIGNMENT_NOAUTO: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + FvImageSectionObj.Alignment = self._Token + + if self._IsToken(TAB_VALUE_SPLIT): + FvImageSectionObj.FvFileExtension = self._GetFileExtension() + elif self._GetNextToken(): + if self._Token not in { + T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32, + BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, + "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX, + BINARY_FILE_TYPE_UI, "VERSION", + BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, + BINARY_FILE_TYPE_SMM_DEPEX}: + FvImageSectionObj.FvFileName = self._Token else: - self.__UndoToken() + self._UndoToken() else: - raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("FV file name", self.FileName, self.CurrentLineNumber) Obj.SectionList.append(FvImageSectionObj) return True - EfiSectionObj = EfiSection.EfiSection() EfiSectionObj.SectionType = SectionName - if not self.__GetNextToken(): - raise Warning("expected file type", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("file type", self.FileName, self.CurrentLineNumber) - if self.__Token == "STRING": - if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType): + if self._Token == "STRING": + if not self._RuleSectionCouldHaveString(EfiSectionObj.SectionType): raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) - if not self.__IsToken('='): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Quoted String", self.FileName, self.CurrentLineNumber) - if self.__GetStringData(): - EfiSectionObj.StringData = self.__Token + if self._GetStringData(): + EfiSectionObj.StringData = self._Token - if self.__IsKeyword("BUILD_NUM"): - if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType): + if self._IsKeyword("BUILD_NUM"): + if not self._RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType): raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Build number", self.FileName, self.CurrentLineNumber) - EfiSectionObj.BuildNum = self.__Token + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Build number", self.FileName, self.CurrentLineNumber) + EfiSectionObj.BuildNum = self._Token else: - EfiSectionObj.FileType = self.__Token - self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType) + EfiSectionObj.FileType = self._Token + self._CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType) - if self.__IsKeyword("Optional"): - if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType): + if self._IsKeyword("Optional"): + if not self._RuleSectionCouldBeOptional(EfiSectionObj.SectionType): raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) EfiSectionObj.Optional = True - if self.__IsKeyword("BUILD_NUM"): - if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType): + if self._IsKeyword("BUILD_NUM"): + if not self._RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType): raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber) - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected Build number", self.FileName, self.CurrentLineNumber) - EfiSectionObj.BuildNum = self.__Token + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("Build number", self.FileName, self.CurrentLineNumber) + EfiSectionObj.BuildNum = self._Token - if self.__GetAlignment(): - if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): - raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): + if self._GetAlignment(): + if self._Token not in ALIGNMENTS: + raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) + if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE): raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) - EfiSectionObj.Alignment = self.__Token + EfiSectionObj.Alignment = self._Token - if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'): - if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType): - if self.__Token == 'RELOCS_STRIPPED': + if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'): + if self._SectionCouldHaveRelocFlag(EfiSectionObj.SectionType): + if self._Token == 'RELOCS_STRIPPED': EfiSectionObj.KeepReloc = False else: EfiSectionObj.KeepReloc = True - if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc: + if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc: raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber) else: raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber) - if self.__IsToken('|'): - EfiSectionObj.FileExtension = self.__GetFileExtension() - elif self.__GetNextToken(): - if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\ - "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"): - - if self.__Token.startswith('PCD'): - self.__UndoToken() - self.__GetNextWord() - - if self.__Token == 'PCD': - if not self.__IsToken( "("): - raise Warning("expected '('", self.FileName, self.CurrentLineNumber) - PcdPair = self.__GetNextPcdName() - if not self.__IsToken( ")"): - raise Warning("expected ')'", self.FileName, self.CurrentLineNumber) - self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' - - EfiSectionObj.FileName = self.__Token - + if self._IsToken(TAB_VALUE_SPLIT): + EfiSectionObj.FileExtension = self._GetFileExtension() + elif self._GetNextToken(): + if self._Token not in { + T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32, + BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, + "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX, + BINARY_FILE_TYPE_UI, "VERSION", + BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, + BINARY_FILE_TYPE_SMM_DEPEX}: + + if self._Token.startswith('PCD'): + self._UndoToken() + self._GetNextWord() + + if self._Token == 'PCD': + if not self._IsToken("("): + raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber) + PcdPair = self._GetNextPcdSettings() + if not self._IsToken(")"): + raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber) + self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')' + + EfiSectionObj.FileName = self._Token + else: - self.__UndoToken() + self._UndoToken() else: - raise Warning("expected section file name", self.FileName, self.CurrentLineNumber) + raise Warning.Expected("section file name", self.FileName, self.CurrentLineNumber) Obj.SectionList.append(EfiSectionObj) return True - ## __RuleSectionCouldBeOptional() method + ## _RuleSectionCouldBeOptional() method # # Get whether a section could be optional # - # @param self The object pointer # @param SectionType The section type to check # @retval True section could be optional # @retval False section never optional # - def __RuleSectionCouldBeOptional(self, SectionType): - if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"): + @staticmethod + def _RuleSectionCouldBeOptional(SectionType): + if SectionType in {BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "RAW", BINARY_FILE_TYPE_SMM_DEPEX}: return True else: return False - ## __RuleSectionCouldHaveBuildNum() method + ## _RuleSectionCouldHaveBuildNum() method # # Get whether a section could have build number information # - # @param self The object pointer # @param SectionType The section type to check # @retval True section could have build number information # @retval False section never have build number information # - def __RuleSectionCouldHaveBuildNum(self, SectionType): - if SectionType in ("VERSION"): + @staticmethod + def _RuleSectionCouldHaveBuildNum(SectionType): + if SectionType == "VERSION": return True else: return False - ## __RuleSectionCouldHaveString() method + ## _RuleSectionCouldHaveString() method # # Get whether a section could have string # - # @param self The object pointer # @param SectionType The section type to check # @retval True section could have string # @retval False section never have string # - def __RuleSectionCouldHaveString(self, SectionType): - if SectionType in ("UI", "VERSION"): + @staticmethod + def _RuleSectionCouldHaveString(SectionType): + if SectionType in {BINARY_FILE_TYPE_UI, "VERSION"}: return True else: return False - ## __CheckRuleSectionFileType() method + ## _CheckRuleSectionFileType() method # # Get whether a section matches a file type # @@ -3968,86 +3979,86 @@ class FdfParser: # @param SectionType The section type to check # @param FileType The file type to check # - def __CheckRuleSectionFileType(self, SectionType, FileType): + def _CheckRuleSectionFileType(self, SectionType, FileType): + WarningString = "Incorrect section file type '%s'" if SectionType == "COMPAT16": - if FileType not in ("COMPAT16", "SEC_COMPAT16"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "PE32": - if FileType not in ("PE32", "SEC_PE32"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "PIC": - if FileType not in ("PIC", "PIC"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "TE": - if FileType not in ("TE", "SEC_TE"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) + if FileType not in {"COMPAT16", "SEC_COMPAT16"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_PE32: + if FileType not in {BINARY_FILE_TYPE_PE32, "SEC_PE32"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_PIC: + if FileType not in {BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_PIC}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_TE: + if FileType not in {BINARY_FILE_TYPE_TE, "SEC_TE"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) elif SectionType == "RAW": - if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX": - if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "UI": - if FileType not in ("UI", "SEC_UI"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) + if FileType not in {BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_DXE_DEPEX or SectionType == BINARY_FILE_TYPE_SMM_DEPEX: + if FileType not in {BINARY_FILE_TYPE_DXE_DEPEX, "SEC_DXE_DEPEX", BINARY_FILE_TYPE_SMM_DEPEX}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_UI: + if FileType not in {BINARY_FILE_TYPE_UI, "SEC_UI"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) elif SectionType == "VERSION": - if FileType not in ("VERSION", "SEC_VERSION"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "PEI_DEPEX": - if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) - elif SectionType == "GUID": - if FileType not in ("PE32", "SEC_GUID"): - raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber) + if FileType not in {"VERSION", "SEC_VERSION"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_PEI_DEPEX: + if FileType not in {BINARY_FILE_TYPE_PEI_DEPEX, "SEC_PEI_DEPEX"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) + elif SectionType == BINARY_FILE_TYPE_GUID: + if FileType not in {BINARY_FILE_TYPE_PE32, "SEC_GUID"}: + raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) - ## __GetRuleEncapsulationSection() method + ## _GetRuleEncapsulationSection() method # # Get encapsulation section for Rule # # @param self The object pointer - # @param Rule for whom section is got + # @param theRule for whom section is got # @retval True Successfully find section statement # @retval False Not able to find section statement # - def __GetRuleEncapsulationSection(self, Rule): - - if self.__IsKeyword( "COMPRESS"): + def _GetRuleEncapsulationSection(self, theRule): + if self._IsKeyword("COMPRESS"): Type = "PI_STD" - if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"): - Type = self.__Token + if self._IsKeyword("PI_STD") or self._IsKeyword("PI_NONE"): + Type = self._Token - if not self.__IsToken("{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) - CompressSectionObj = CompressSection.CompressSection() + CompressSectionObj = CompressSection() CompressSectionObj.CompType = Type # Recursive sections... while True: - IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj) - IsLeaf = self.__GetEfiSection(CompressSectionObj) + IsEncapsulate = self._GetRuleEncapsulationSection(CompressSectionObj) + IsLeaf = self._GetEfiSection(CompressSectionObj) if not IsEncapsulate and not IsLeaf: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) - Rule.SectionList.append(CompressSectionObj) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) + theRule.SectionList.append(CompressSectionObj) return True - elif self.__IsKeyword( "GUIDED"): + elif self._IsKeyword("GUIDED"): GuidValue = None - if self.__GetNextGuid(): - GuidValue = self.__Token + if self._GetNextGuid(): + GuidValue = self._Token - if self.__IsKeyword( "$(NAMED_GUID)"): - GuidValue = self.__Token + if self._IsKeyword("$(NAMED_GUID)"): + GuidValue = self._Token - AttribDict = self.__GetGuidAttrib() + AttribDict = self._GetGuidAttrib() - if not self.__IsToken("{"): - raise Warning("expected '{'", self.FileName, self.CurrentLineNumber) - GuidSectionObj = GuidSection.GuidSection() + if not self._IsToken("{"): + raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber) + GuidSectionObj = GuidSection() GuidSectionObj.NameGuid = GuidValue GuidSectionObj.SectionType = "GUIDED" GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"] @@ -4056,227 +4067,20 @@ class FdfParser: # Efi sections... while True: - IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj) - IsLeaf = self.__GetEfiSection(GuidSectionObj) + IsEncapsulate = self._GetRuleEncapsulationSection(GuidSectionObj) + IsLeaf = self._GetEfiSection(GuidSectionObj) if not IsEncapsulate and not IsLeaf: break - if not self.__IsToken( "}"): - raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) - Rule.SectionList.append(GuidSectionObj) + if not self._IsToken(T_CHAR_BRACE_R): + raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber) + theRule.SectionList.append(GuidSectionObj) return True return False - ## __GetVtf() method - # - # Get VTF section contents and store its data into VTF list of self.Profile - # - # @param self The object pointer - # @retval True Successfully find a VTF - # @retval False Not able to find a VTF - # - def __GetVtf(self): - - if not self.__GetNextToken(): - return False - - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[VTF."): - if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - self.__UndoToken() - return False - - self.__UndoToken() - if not self.__IsToken("[VTF.", True): - FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) - #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \ - # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine) - raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber) - - if not self.__SkipToToken("."): - raise Warning("expected '.'", self.FileName, self.CurrentLineNumber) - - Arch = self.__SkippedChars.rstrip(".").upper() - if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"): - raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber) - - if not self.__GetNextWord(): - raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber) - Name = self.__Token.upper() - - VtfObj = Vtf.Vtf() - VtfObj.UiName = Name - VtfObj.KeyArch = Arch - - if self.__IsToken(","): - if not self.__GetNextWord(): - raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber) - if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"): - raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - VtfObj.ArchList = self.__Token.upper() - - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) - - if self.__IsKeyword("IA32_RST_BIN"): - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber) - - VtfObj.ResetBin = self.__Token - if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1: - #check for file path - ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate() - if ErrorCode != 0: - EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - - while self.__GetComponentStatement(VtfObj): - pass - - self.Profile.VtfList.append(VtfObj) - return True - - ## __GetComponentStatement() method - # - # Get components in VTF - # - # @param self The object pointer - # @param VtfObj for whom component is got - # @retval True Successfully find a component - # @retval False Not able to find a component - # - def __GetComponentStatement(self, VtfObj): - - if not self.__IsKeyword("COMP_NAME"): - return False - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextWord(): - raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber) - - CompStatementObj = ComponentStatement.ComponentStatement() - CompStatementObj.CompName = self.__Token - - if not self.__IsKeyword("COMP_LOC"): - raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - CompStatementObj.CompLoc = "" - if self.__GetNextWord(): - CompStatementObj.CompLoc = self.__Token - if self.__IsToken('|'): - if not self.__GetNextWord(): - raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber) - - if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support - raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - - CompStatementObj.FilePos = self.__Token - else: - self.CurrentLineNumber += 1 - self.CurrentOffsetWithinLine = 0 - - if not self.__IsKeyword("COMP_TYPE"): - raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Component type", self.FileName, self.CurrentLineNumber) - if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"): - if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \ - not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]): - raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - CompStatementObj.CompType = self.__Token - - if not self.__IsKeyword("COMP_VER"): - raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Component version", self.FileName, self.CurrentLineNumber) - - Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL) - if Pattern.match(self.__Token) == None: - raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - CompStatementObj.CompVer = self.__Token - - if not self.__IsKeyword("COMP_CS"): - raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber) - if self.__Token not in ("1", "0"): - raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - CompStatementObj.CompCs = self.__Token - - - if not self.__IsKeyword("COMP_BIN"): - raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Component file", self.FileName, self.CurrentLineNumber) - - CompStatementObj.CompBin = self.__Token - if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1: - #check for file path - ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate() - if ErrorCode != 0: - EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - - if not self.__IsKeyword("COMP_SYM"): - raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber) - - CompStatementObj.CompSym = self.__Token - if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1: - #check for file path - ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate() - if ErrorCode != 0: - EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - - if not self.__IsKeyword("COMP_SIZE"): - raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber) - - if not self.__IsToken("="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if self.__IsToken("-"): - CompStatementObj.CompSize = self.__Token - elif self.__GetNextDecimalNumber(): - CompStatementObj.CompSize = self.__Token - elif self.__GetNextHexNumber(): - CompStatementObj.CompSize = self.__Token - else: - raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - - VtfObj.ComponentStatementList.append(CompStatementObj) - return True - - ## __GetOptionRom() method + ## _GetOptionRom() method # # Get OptionROM section contents and store its data into OptionROM list of self.Profile # @@ -4284,37 +4088,37 @@ class FdfParser: # @retval True Successfully find a OptionROM # @retval False Not able to find a OptionROM # - def __GetOptionRom(self): + def _GetOptionRom(self): + if not self._GetNextToken(): + return False - if not self.__GetNextToken(): + S = self._Token.upper() + if S.startswith(TAB_SECTION_START) and not S.startswith("[OPTIONROM."): + self.SectionParser(S) + self._UndoToken() return False - S = self.__Token.upper() - if S.startswith("[") and not S.startswith("[OPTIONROM."): - raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber) - - self.__UndoToken() - if not self.__IsToken("[OptionRom.", True): - raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + self._UndoToken() + if not self._IsToken("[OptionRom.", True): + raise Warning("Unknown Keyword '%s'" % self._Token, self.FileName, self.CurrentLineNumber) - OptRomName = self.__GetUiName() + OptRomName = self._GetUiName() - if not self.__IsToken( "]"): - raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) + if not self._IsToken(TAB_SECTION_END): + raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber) - OptRomObj = OptionRom.OPTIONROM() - OptRomObj.DriverName = OptRomName + OptRomObj = OPTIONROM(OptRomName) self.Profile.OptRomDict[OptRomName] = OptRomObj while True: - isInf = self.__GetOptRomInfStatement(OptRomObj) - isFile = self.__GetOptRomFileStatement(OptRomObj) + isInf = self._GetOptRomInfStatement(OptRomObj) + isFile = self._GetOptRomFileStatement(OptRomObj) if not isInf and not isFile: break - + return True - ## __GetOptRomInfStatement() method + ## _GetOptRomInfStatement() method # # Get INF statements # @@ -4323,94 +4127,106 @@ class FdfParser: # @retval True Successfully find inf statement # @retval False Not able to find inf statement # - def __GetOptRomInfStatement(self, Obj): - - if not self.__IsKeyword( "INF"): + def _GetOptRomInfStatement(self, Obj): + if not self._IsKeyword("INF"): return False - ffsInf = OptRomInfStatement.OptRomInfStatement() - self.__GetInfOptions( ffsInf) + ffsInf = OptRomInfStatement() + self._GetInfOptions(ffsInf) - if not self.__GetNextToken(): - raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber) - ffsInf.InfFileName = self.__Token - if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1: + if not self._GetNextToken(): + raise Warning.Expected("INF file path", self.FileName, self.CurrentLineNumber) + ffsInf.InfFileName = self._Token + if ffsInf.InfFileName.replace(TAB_WORKSPACE, '').find('$') == -1: #check for file path ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() if ErrorCode != 0: EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) - if not ffsInf.InfFileName in self.Profile.InfList: - self.Profile.InfList.append(ffsInf.InfFileName) + NewFileName = ffsInf.InfFileName + if ffsInf.OverrideGuid: + NewFileName = ProcessDuplicatedInf(PathClass(ffsInf.InfFileName,GenFdsGlobalVariable.WorkSpaceDir), ffsInf.OverrideGuid, GenFdsGlobalVariable.WorkSpaceDir).Path + + if not NewFileName in self.Profile.InfList: + self.Profile.InfList.append(NewFileName) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) self.Profile.InfFileLineList.append(FileLineTuple) + if ffsInf.UseArch: + if ffsInf.UseArch not in self.Profile.InfDict: + self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName] + else: + self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName) + else: + self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName) + + + self._GetOptRomOverrides (ffsInf) - - self.__GetOptRomOverrides (ffsInf) - Obj.FfsList.append(ffsInf) return True - ## __GetOptRomOverrides() method + ## _GetOptRomOverrides() method # # Get overrides for OptROM INF & FILE # # @param self The object pointer # @param FfsInfObj for whom overrides is got # - def __GetOptRomOverrides(self, Obj): - if self.__IsToken('{'): - Overrides = OptionRom.OverrideAttribs() + def _GetOptRomOverrides(self, Obj): + if self._IsToken('{'): + Overrides = OverrideAttribs() while True: - if self.__IsKeyword( "PCI_VENDOR_ID"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber) - Overrides.PciVendorId = self.__Token + if self._IsKeyword("PCI_VENDOR_ID"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex vendor id", self.FileName, self.CurrentLineNumber) + Overrides.PciVendorId = self._Token continue - if self.__IsKeyword( "PCI_CLASS_CODE"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber) - Overrides.PciClassCode = self.__Token + if self._IsKeyword("PCI_CLASS_CODE"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex class code", self.FileName, self.CurrentLineNumber) + Overrides.PciClassCode = self._Token continue - if self.__IsKeyword( "PCI_DEVICE_ID"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber) - - Overrides.PciDeviceId = self.__Token + if self._IsKeyword("PCI_DEVICE_ID"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + # Get a list of PCI IDs + Overrides.PciDeviceId = "" + while (self._GetNextHexNumber()): + Overrides.PciDeviceId = "{} {}".format(Overrides.PciDeviceId, self._Token) + if not Overrides.PciDeviceId: + raise Warning.Expected("one or more Hex device ids", self.FileName, self.CurrentLineNumber) continue - if self.__IsKeyword( "PCI_REVISION"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextHexNumber(): - raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber) - Overrides.PciRevision = self.__Token + if self._IsKeyword("PCI_REVISION"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextHexNumber(): + raise Warning.Expected("Hex revision", self.FileName, self.CurrentLineNumber) + Overrides.PciRevision = self._Token continue - if self.__IsKeyword( "PCI_COMPRESS"): - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - if not self.__GetNextToken(): - raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber) - Overrides.NeedCompress = self.__Token.upper() == 'TRUE' + if self._IsKeyword("PCI_COMPRESS"): + if not self._IsToken(TAB_EQUAL_SPLIT): + raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) + if not self._GetNextToken(): + raise Warning.Expected("TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber) + Overrides.NeedCompress = self._Token.upper() == 'TRUE' continue - if self.__IsToken( "}"): + if self._IsToken(T_CHAR_BRACE_R): break else: EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber) Obj.OverrideAttribs = Overrides - - ## __GetOptRomFileStatement() method + + ## _GetOptRomFileStatement() method # # Get FILE statements # @@ -4419,34 +4235,33 @@ class FdfParser: # @retval True Successfully find FILE statement # @retval False Not able to find FILE statement # - def __GetOptRomFileStatement(self, Obj): - - if not self.__IsKeyword( "FILE"): + def _GetOptRomFileStatement(self, Obj): + if not self._IsKeyword("FILE"): return False - FfsFileObj = OptRomFileStatement.OptRomFileStatement() + FfsFileObj = OptRomFileStatement() - if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"): - raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber) - FfsFileObj.FileType = self.__Token + if not self._IsKeyword("EFI") and not self._IsKeyword(BINARY_FILE_TYPE_BIN): + raise Warning.Expected("Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber) + FfsFileObj.FileType = self._Token - if not self.__GetNextToken(): - raise Warning("expected File path", self.FileName, self.CurrentLineNumber) - FfsFileObj.FileName = self.__Token - if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1: + if not self._GetNextToken(): + raise Warning.Expected("File path", self.FileName, self.CurrentLineNumber) + FfsFileObj.FileName = self._Token + if FfsFileObj.FileName.replace(TAB_WORKSPACE, '').find('$') == -1: #check for file path ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() if ErrorCode != 0: EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if FfsFileObj.FileType == 'EFI': - self.__GetOptRomOverrides(FfsFileObj) - + self._GetOptRomOverrides(FfsFileObj) + Obj.FfsList.append(FfsFileObj) return True - ## __GetCapInFd() method + ## _GetCapInFd() method # # Get Cap list contained in FD # @@ -4454,21 +4269,20 @@ class FdfParser: # @param FdName FD name # @retval CapList List of Capsule in FD # - def __GetCapInFd (self, FdName): - + def _GetCapInFd (self, FdName): CapList = [] - if FdName.upper() in self.Profile.FdDict.keys(): + if FdName.upper() in self.Profile.FdDict: FdObj = self.Profile.FdDict[FdName.upper()] for elementRegion in FdObj.RegionList: if elementRegion.RegionType == 'CAPSULE': for elementRegionData in elementRegion.RegionDataList: if elementRegionData.endswith(".cap"): continue - if elementRegionData != None and elementRegionData.upper() not in CapList: + if elementRegionData is not None and elementRegionData.upper() not in CapList: CapList.append(elementRegionData.upper()) return CapList - ## __GetReferencedFdCapTuple() method + ## _GetReferencedFdCapTuple() method # # Get FV and FD list referenced by a capsule image # @@ -4477,23 +4291,22 @@ class FdfParser: # @param RefFdList referenced FD by section # @param RefFvList referenced FV by section # - def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []): - - for CapsuleDataObj in CapObj.CapsuleDataList : - if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList: + def _GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []): + for CapsuleDataObj in CapObj.CapsuleDataList: + if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName is not None and CapsuleDataObj.FvName.upper() not in RefFvList: RefFvList.append (CapsuleDataObj.FvName.upper()) - elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList: - RefFdList.append (CapsuleDataObj.FdName.upper()) - elif CapsuleDataObj.Ffs != None: - if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement): - if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList: + elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName is not None and CapsuleDataObj.FdName.upper() not in RefFdList: + RefFdList.append (CapsuleDataObj.FdName.upper()) + elif CapsuleDataObj.Ffs is not None: + if isinstance(CapsuleDataObj.Ffs, FileStatement): + if CapsuleDataObj.Ffs.FvName is not None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList: RefFvList.append(CapsuleDataObj.Ffs.FvName.upper()) - elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList: + elif CapsuleDataObj.Ffs.FdName is not None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList: RefFdList.append(CapsuleDataObj.Ffs.FdName.upper()) else: - self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList) + self._GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList) - ## __GetFvInFd() method + ## _GetFvInFd() method # # Get FV list contained in FD # @@ -4501,21 +4314,20 @@ class FdfParser: # @param FdName FD name # @retval FvList list of FV in FD # - def __GetFvInFd (self, FdName): - + def _GetFvInFd (self, FdName): FvList = [] - if FdName.upper() in self.Profile.FdDict.keys(): + if FdName.upper() in self.Profile.FdDict: FdObj = self.Profile.FdDict[FdName.upper()] for elementRegion in FdObj.RegionList: - if elementRegion.RegionType == 'FV': + if elementRegion.RegionType == BINARY_FILE_TYPE_FV: for elementRegionData in elementRegion.RegionDataList: if elementRegionData.endswith(".fv"): continue - if elementRegionData != None and elementRegionData.upper() not in FvList: + if elementRegionData is not None and elementRegionData.upper() not in FvList: FvList.append(elementRegionData.upper()) return FvList - ## __GetReferencedFdFvTuple() method + ## _GetReferencedFdFvTuple() method # # Get FD and FV list referenced by a FFS file # @@ -4524,18 +4336,17 @@ class FdfParser: # @param RefFdList referenced FD by section # @param RefFvList referenced FV by section # - def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []): - + def _GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []): for FfsObj in FvObj.FfsList: - if isinstance(FfsObj, FfsFileStatement.FileStatement): - if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList: + if isinstance(FfsObj, FileStatement): + if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList: RefFvList.append(FfsObj.FvName.upper()) - elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList: + elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList: RefFdList.append(FfsObj.FdName.upper()) else: - self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList) + self._GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList) - ## __GetReferencedFdFvTupleFromSection() method + ## _GetReferencedFdFvTupleFromSection() method # # Get FD and FV list referenced by a FFS section # @@ -4544,20 +4355,18 @@ class FdfParser: # @param FdList referenced FD by section # @param FvList referenced FV by section # - def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []): - - SectionStack = [] - SectionStack.extend(FfsFile.SectionList) + def _GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []): + SectionStack = list(FfsFile.SectionList) while SectionStack != []: SectionObj = SectionStack.pop() - if isinstance(SectionObj, FvImageSection.FvImageSection): - if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList: + if isinstance(SectionObj, FvImageSection): + if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList: FvList.append(SectionObj.FvName.upper()) - if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList: + if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList: FvList.append(SectionObj.Fv.UiFvName.upper()) - self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList) + self._GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList) - if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection): + if isinstance(SectionObj, CompressSection) or isinstance(SectionObj, GuidSection): SectionStack.extend(SectionObj.SectionList) ## CycleReferenceCheck() method @@ -4573,46 +4382,45 @@ class FdfParser: # Check the cycle between FV and FD image # MaxLength = len (self.Profile.FvDict) - for FvName in self.Profile.FvDict.keys(): + for FvName in self.Profile.FvDict: LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName - RefFvStack = [] - RefFvStack.append(FvName) - FdAnalyzedList = [] - + RefFvStack = set(FvName) + FdAnalyzedList = set() + Index = 0 - while RefFvStack != [] and Index < MaxLength: + while RefFvStack and Index < MaxLength: Index = Index + 1 FvNameFromStack = RefFvStack.pop() - if FvNameFromStack.upper() in self.Profile.FvDict.keys(): + if FvNameFromStack.upper() in self.Profile.FvDict: FvObj = self.Profile.FvDict[FvNameFromStack.upper()] else: continue RefFdList = [] RefFvList = [] - self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList) + self._GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList) for RefFdName in RefFdList: if RefFdName in FdAnalyzedList: continue LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName) - FvInFdList = self.__GetFvInFd(RefFdName) + FvInFdList = self._GetFvInFd(RefFdName) if FvInFdList != []: for FvNameInFd in FvInFdList: - LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd) + LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd) if FvNameInFd not in RefFvStack: - RefFvStack.append(FvNameInFd) + RefFvStack.add(FvNameInFd) if FvName in RefFvStack or FvNameFromStack in RefFvStack: EdkLogger.info(LogStr) return True - FdAnalyzedList.append(RefFdName) + FdAnalyzedList.add(RefFdName) for RefFvName in RefFvList: LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName) if RefFvName not in RefFvStack: - RefFvStack.append(RefFvName) + RefFvStack.add(RefFvName) if FvName in RefFvStack or FvNameFromStack in RefFvStack: EdkLogger.info(LogStr) @@ -4622,28 +4430,27 @@ class FdfParser: # Check the cycle between Capsule and FD image # MaxLength = len (self.Profile.CapsuleDict) - for CapName in self.Profile.CapsuleDict.keys(): + for CapName in self.Profile.CapsuleDict: # # Capsule image to be checked. # LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName - RefCapStack = [] - RefCapStack.append(CapName) - FdAnalyzedList = [] - FvAnalyzedList = [] - + RefCapStack = {CapName} + FdAnalyzedList = set() + FvAnalyzedList = set() + Index = 0 - while RefCapStack != [] and Index < MaxLength: + while RefCapStack and Index < MaxLength: Index = Index + 1 CapNameFromStack = RefCapStack.pop() - if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys(): + if CapNameFromStack.upper() in self.Profile.CapsuleDict: CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()] else: continue RefFvList = [] RefFdList = [] - self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList) + self._GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList) FvListLength = 0 FdListLength = 0 @@ -4653,25 +4460,21 @@ class FdfParser: continue LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName) - CapInFdList = self.__GetCapInFd(RefFdName) - if CapInFdList != []: - for CapNameInFd in CapInFdList: - LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd) - if CapNameInFd not in RefCapStack: - RefCapStack.append(CapNameInFd) - - if CapName in RefCapStack or CapNameFromStack in RefCapStack: - EdkLogger.info(LogStr) - return True - - FvInFdList = self.__GetFvInFd(RefFdName) - if FvInFdList != []: - for FvNameInFd in FvInFdList: - LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd) - if FvNameInFd not in RefFvList: - RefFvList.append(FvNameInFd) - - FdAnalyzedList.append(RefFdName) + for CapNameInFd in self._GetCapInFd(RefFdName): + LogStr += "FD %s contains Capsule %s\n" % (RefFdName, CapNameInFd) + if CapNameInFd not in RefCapStack: + RefCapStack.append(CapNameInFd) + + if CapName in RefCapStack or CapNameFromStack in RefCapStack: + EdkLogger.info(LogStr) + return True + + for FvNameInFd in self._GetFvInFd(RefFdName): + LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd) + if FvNameInFd not in RefFvList: + RefFvList.append(FvNameInFd) + + FdAnalyzedList.add(RefFdName) # # the number of the parsed FV and FD image # @@ -4681,29 +4484,33 @@ class FdfParser: if RefFvName in FvAnalyzedList: continue LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName) - if RefFvName.upper() in self.Profile.FvDict.keys(): + if RefFvName.upper() in self.Profile.FvDict: FvObj = self.Profile.FvDict[RefFvName.upper()] else: continue - self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList) - FvAnalyzedList.append(RefFvName) + self._GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList) + FvAnalyzedList.add(RefFvName) return False + def GetAllIncludedFile (self): + global AllIncludeFileList + return AllIncludeFileList + if __name__ == "__main__": import sys try: test_file = sys.argv[1] - except IndexError, v: - print "Usage: %s filename" % sys.argv[0] + except IndexError as v: + print("Usage: %s filename" % sys.argv[0]) sys.exit(1) parser = FdfParser(test_file) try: parser.ParseFile() parser.CycleReferenceCheck() - except Warning, X: - print str(X) + except Warning as X: + print(str(X)) else: - print "Success!" + print("Success!")