4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to parse DEC file. It will consumed by DecParser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# under the terms and conditions of the BSD License which accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDecParser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Import modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport Logger.Log as Logger
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger.ToolError import FILE_PARSE_FAILURE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger.ToolError import FILE_OPEN_FAILURE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger import StringTable as ST
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport Library.DataType as DT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidToken
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidPath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidCFormatGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidIdString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidUserId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidArch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidWord
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import TOOL_NAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import CleanString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import IsValidPcdDatum
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import ParserHelper
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import StripRoot
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import VERSION_PATTERN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import CVAR_PATTERN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import PCD_TOKEN_PATTERN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import MACRO_PATTERN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParserMisc import FileContent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import _DecComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecDefineObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecDefineItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecIncludeObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecIncludeItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecLibraryclassObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecLibraryclassItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecGuidObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecPpiObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecProtocolObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecGuidItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecUserExtensionObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecUserExtensionItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecPcdObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.DecObject import DecPcdItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.Misc import GuidStructureStringToGuidString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.Misc import CheckGuidRegFormat
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import ReplaceMacro
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import GetSplitValueList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import gMACRO_PATTERN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import ConvertSpecialChar
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# _DecBase class for parsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecBase:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData = RawData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._ItemDict = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Data parsed by 'self' are saved to this object
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetDataObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.ItemObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## BlockStart
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Called if a new section starts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def BlockStart(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## _CheckReDefine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Key: to be checked if multi-defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Scope: Format: [[SectionName, Arch], ...].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # If scope is none, use global scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _CheckReDefine(self, Key, Scope = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Scope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Scope = self._RawData.CurrentScope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SecArch = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Copy scope to SecArch, avoid Scope be changed outside
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SecArch[0:1] = Scope[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Key not in self._ItemDict:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._ItemDict[Key] = [[SecArch, self._RawData.LineIndex]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Value in self._ItemDict[Key]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for SubValue in Scope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # If current is common section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SubValue[-1] == 'COMMON':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Other in Value[0]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Key in common cannot be redefined in other arches
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # [:-1] means stripping arch info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Other[:-1] == SubValue[:-1]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_REDEFINE % (Key, Value[1]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommonScope = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommonScope[0:1] = SubValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommonScope[-1] = 'COMMON'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Cannot be redefined if this key already defined in COMMON Or defined in same arch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SubValue in Value[0] or CommonScope in Value[0]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_REDEFINE % (Key, Value[1]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._ItemDict[Key].append([SecArch, self._RawData.LineIndex])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## CheckRequiredFields
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Some sections need to check if some fields exist, define section for example
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Derived class can re-implement, top parser will call this function after all parsing done
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def CheckRequiredFields(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## IsItemRequired
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # In DEC spec, sections must have at least one statement except user
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # extension.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # For example: "[guids" [<attribs>] "]" <EOL> <statements>+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # sub class can override this method to indicate if statement is a must.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _IsStatementRequired(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _LoggerError(self, ErrorString):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE, File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.LineIndex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ErrorString + ST.ERR_DECPARSE_LINE % self._RawData.CurrentLine)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ReplaceMacro(self, String):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if gMACRO_PATTERN.findall(String):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = ReplaceMacro(String, self._LocalMacro, False,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileName = self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = ['', self._RawData.LineIndex])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = ReplaceMacro(String, self._RawData.Macros, False,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileName = self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = ['', self._RawData.LineIndex])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacroUsed = gMACRO_PATTERN.findall(String)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if MacroUsed:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.LineIndex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData = ST.ERR_DECPARSE_MACRO_RESOLVE % (str(MacroUsed), String))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _MacroParser(self, String):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(String, ' ', 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) < 2 or TokenList[1] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_MACRO_PAIR)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(TokenList[1], DT.TAB_EQUAL_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[0] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_MACRO_NAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif not IsValidToken(MACRO_PATTERN, TokenList[0]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_MACRO_NAME_UPPER % TokenList[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) == 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro[TokenList[0]] = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro[TokenList[0]] = self._ReplaceMacro(TokenList[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## _ParseItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Parse specified item, this function must be derived by subclass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Should never be called
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## _TailCommentStrategy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # This function can be derived to parse tail comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # default is it will not consume any lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Comment: Comment of current line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _TailCommentStrategy(self, Comment):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## _StopCurrentParsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Called in Parse if current parsing should be stopped when encounter some
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # keyword
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Default is section start and end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Line: Current line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _StopCurrentParsing(self, Line):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Line[0] == DT.TAB_SECTION_START and Line[-1] == DT.TAB_SECTION_END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## _TryBackSlash
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Split comment and DEC content, concatenate lines if end of char is '\'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param ProcessedLine: ProcessedLine line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param ProcessedComments: ProcessedComments line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _TryBackSlash(self, ProcessedLine, ProcessedComments):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CatLine = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = ProcessedLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentList = ProcessedComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while not self._RawData.IsEndOfFile():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_BACKSLASH_EMPTY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentList.append((Comment, self._RawData.LineIndex))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line[-1] != DT.TAB_SLASH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CatLine += Line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif len(Line) < 2 or Line[-2] != ' ':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_BACKSLASH)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CatLine += Line[:-1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line, Comment = CleanString(self._RawData.GetNextLine())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Reach end of content
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData.IsEndOfFile():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not CatLine:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ProcessedLine[-1] == DT.TAB_SLASH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_BACKSLASH_EMPTY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CatLine = ProcessedLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Line or Line[-1] == DT.TAB_SLASH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_BACKSLASH_EMPTY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CatLine += Line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentLine = self._ReplaceMacro(CatLine)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return CatLine, CommentList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## Parse
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # This is a template method in which other member functions which might
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # override by sub class are called. It is responsible for reading file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # line by line, and call other member functions to parse. This function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # should not be re-implement by sub class.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def Parse(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeadComments = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailComments = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #======================================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # CurComments may pointer to HeadComments or TailComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #======================================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments = HeadComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurObj = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNum = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FromBuf = False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #======================================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Used to report error information if empty section found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #======================================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = self._RawData.LineIndex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineStr = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while not self._RawData.IsEndOfFile() or self._RawData.NextLine:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData.NextLine:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Have processed line in buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.NextLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeadComments.extend(self._RawData.HeadComment)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailComments.extend(self._RawData.TailComment)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.ResetNext()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FromBuf = True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # No line in buffer, read next line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line, Comment = CleanString(self._RawData.GetNextLine())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FromBuf = False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not FromBuf and CurObj and TailComments:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Set tail comments to previous statement if not empty.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurObj.SetTailComment(CurObj.GetTailComment()+TailComments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not FromBuf:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del TailComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments = TailComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comments = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comments = [(Comment, self._RawData.LineIndex)]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Try if last char of line has backslash
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line, Comments = self._TryBackSlash(Line, Comments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments.extend(Comments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Macro found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==============================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.startswith('DEFINE '):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._MacroParser(Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del HeadComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del TailComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments = HeadComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._StopCurrentParsing(Line):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # This line does not belong to this parse,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Save it, can be used by next parse
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.SetNext(Line, HeadComments, TailComments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Obj = self._ParseItem()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNum += 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Obj:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Obj.SetHeadComment(Obj.GetHeadComment()+HeadComments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Obj.SetTailComment(Obj.GetTailComment()+TailComments)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del HeadComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del TailComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurObj = Obj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurObj = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if id(CurComments) == id(TailComments):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Check if this comment belongs to tail comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #==========================================================
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self._TailCommentStrategy(Comment):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments = HeadComments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurComments.append(((Comment, self._RawData.LineIndex)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync del CurComments[:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._IsStatementRequired() and ItemNum == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TOOL_NAME, FILE_PARSE_FAILURE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line=Index,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_STATEMENT_EMPTY % LineStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecDefine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse define section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecDefine(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = DecDefineObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro = self._RawData.Macros
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._DefSecNum = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Each field has a function to validate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DefineValidation = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_DEC_DEFINES_DEC_SPECIFICATION : self._SetDecSpecification,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_DEC_DEFINES_PACKAGE_NAME : self._SetPackageName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_DEC_DEFINES_PACKAGE_GUID : self._SetPackageGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_DEC_DEFINES_PACKAGE_VERSION : self._SetPackageVersion,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def BlockStart(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._DefSecNum += 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._DefSecNum > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_MULTISEC)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## CheckRequiredFields
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Check required fields: DEC_SPECIFICATION, PACKAGE_NAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # PACKAGE_GUID, PACKAGE_VERSION
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def CheckRequiredFields(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.ItemObject.GetPackageSpecification() == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE, File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_DEFINE_REQUIRED % DT.TAB_DEC_DEFINES_DEC_SPECIFICATION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif self.ItemObject.GetPackageName() == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE, File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_DEFINE_REQUIRED % DT.TAB_DEC_DEFINES_PACKAGE_NAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif self.ItemObject.GetPackageGuid() == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE, File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_DEFINE_REQUIRED % DT.TAB_DEC_DEFINES_PACKAGE_GUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif self.ItemObject.GetPackageVersion() == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_PARSE_FAILURE, File=self._RawData.Filename,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_DEFINE_REQUIRED % DT.TAB_DEC_DEFINES_PACKAGE_VERSION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(Line, DT.TAB_EQUAL_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[0] == DT.TAB_DEC_DEFINES_PKG_UNI_FILE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif len(TokenList) < 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_FORMAT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif TokenList[0] not in self.DefineValidation:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_UNKNOWKEY % TokenList[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DefineValidation[TokenList[0]](TokenList[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefineItem = DecDefineItemObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[0] != DT.TAB_DEC_DEFINES_PKG_UNI_FILE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefineItem.Key = TokenList[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefineItem.Value = TokenList[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DefineItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _SetDecSpecification(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.ItemObject.GetPackageSpecification():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_DEC_SPECIFICATION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken('0[xX][0-9a-fA-F]{8}', Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_SPEC)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.SetPackageSpecification(Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _SetPackageName(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.ItemObject.GetPackageName():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PACKAGE_NAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidWord(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_PKGNAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.SetPackageName(Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _SetPackageGuid(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.ItemObject.GetPackageGuid():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PACKAGE_GUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not CheckGuidRegFormat(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_PKGGUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.SetPackageGuid(Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _SetPackageVersion(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.ItemObject.GetPackageVersion():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PACKAGE_VERSION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken(VERSION_PATTERN, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_PKGVERSION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not DT.TAB_SPLIT in Token:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Token + '.0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject._PkgVersion = Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecInclude
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse include section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecInclude(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = DecIncludeObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidPath(Line, self._RawData.PackagePath):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_INCLUDE % Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = DecIncludeItemObject(StripRoot(self._RawData.PackagePath, Line), self._RawData.PackagePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.AddItem(Item, self._RawData.CurrentScope)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecLibraryclass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse library class section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecLibraryclass(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = DecLibraryclassObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(Line, DT.TAB_VALUE_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_LIBCLASS_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[0] == '' or TokenList[1] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_LIBCLASS_EMPTY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken('[A-Z][0-9A-Za-z]*', TokenList[0]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_LIBCLASS_LIB)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CheckReDefine(TokenList[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = TokenList[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Must end with .h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Value.endswith('.h'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_LIBCLASS_PATH_EXT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Path must be existed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidPath(Value, self._RawData.PackagePath):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_INCLUDE % Value)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = DecLibraryclassItemObject(TokenList[0], StripRoot(self._RawData.PackagePath, Value),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.PackagePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.AddItem(Item, self._RawData.CurrentScope)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecPcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse PCD section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecPcd(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = DecPcdObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Used to check duplicate token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Key is token space and token number (integer), value is C name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.TokenMap = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = Line.split(DT.TAB_VALUE_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) < 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Token space guid C name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdName = GetSplitValueList(TokenList[0], DT.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(PcdName) != 2 or PcdName[0] == '' or PcdName[1] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_NAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Guid = PcdName[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken(CVAR_PATTERN, Guid):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_CVAR_GUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # PCD C name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CName = PcdName[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken(CVAR_PATTERN, CName):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_CVAR_PCDCNAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CheckReDefine(Guid + DT.TAB_SPLIT + CName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Default value, may be C array, string or number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = DT.TAB_VALUE_SPLIT.join(TokenList[1:-2]).strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # PCD data type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType = TokenList[-2].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Valid, Cause = IsValidPcdDatum(DataType, Data)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Valid:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(Cause)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdType = self._RawData.CurrentScope[0][0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PcdType == DT.TAB_PCDS_FEATURE_FLAG_NULL.upper() and DataType != 'BOOLEAN':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_FEATUREFLAG)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Token value is the last element in list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = TokenList[-1].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken(PCD_TOKEN_PATTERN, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_TOKEN % Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif not Token.startswith('0x') and not Token.startswith('0X'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if long(Token) > 4294967295:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_TOKEN_INT % Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = hex(long(Token))[:-1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IntToken = long(Token, 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Guid, IntToken) in self.TokenMap:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.TokenMap[Guid, IntToken] != CName:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_TOKEN_UNIQUE%(Token))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.TokenMap[Guid, IntToken] = CName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = DecPcdItemObject(Guid, CName, Data, DataType, Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.AddItem(Item, self._RawData.CurrentScope)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse GUID, PPI, Protocol section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecGuid(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GuidObj = DecGuidObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.PpiObj = DecPpiObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ProtocolObj = DecProtocolObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ObjectDict = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_GUIDS.upper() : self.GuidObj,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PPIS.upper() : self.PpiObj,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PROTOCOLS.upper() : self.ProtocolObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetDataObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData.CurrentScope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.ObjectDict[self._RawData.CurrentScope[0][0]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetGuidObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.GuidObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPpiObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.PpiObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetProtocolObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.ProtocolObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(Line, DT.TAB_EQUAL_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) < 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_CGUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[0] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_CGUID_NAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[1] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_CGUID_GUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidToken(CVAR_PATTERN, TokenList[0]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_PCD_CVAR_GUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CheckReDefine(TokenList[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[1][0] != '{':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not CheckGuidRegFormat(TokenList[1]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_PKGGUID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidString = TokenList[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Convert C format GUID to GUID string and Simple error check
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidString = GuidStructureStringToGuidString(TokenList[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenList[1][0] != '{' or TokenList[1][-1] != '}' or GuidString == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_CGUID_GUIDFORMAT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Check C format GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidCFormatGuid(TokenList[1]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_CGUID_GUIDFORMAT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = DecGuidItemObject(TokenList[0], TokenList[1], GuidString)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemObject = self.ObjectDict[self._RawData.CurrentScope[0][0]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemObject.AddItem(Item, self._RawData.CurrentScope)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _DecUserExtension
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse user extention section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _DecUserExtension(_DecBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, RawData):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject = DecUserExtensionObject(RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Headers = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CurItems = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def BlockStart(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CurItems = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Header in self._RawData.CurrentScope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Header in self._Headers:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_UE_DUPLICATE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Headers.append(Header)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in self._CurItems:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item.UserId == Header[1] and Item.IdString == Header[2]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.ArchAndModuleType.append(Header[3])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = DecUserExtensionItemObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.UserId = Header[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.IdString = Header[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.ArchAndModuleType.append(Header[3])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._CurItems.append(Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ItemObject.AddItem(Item, None)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LocalMacro = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = self._RawData.CurrentLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in self._CurItems:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item.UserString:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.UserString = '\n'.join([Item.UserString, Line])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item.UserString = Line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Dec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Top dec parser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass Dec(_DecBase, _DecComments):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, DecFile, Parse = True):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = ConvertSpecialChar(open(DecFile, 'rb').readlines())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except BaseException:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error(TOOL_NAME, FILE_OPEN_FAILURE, File=DecFile,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=ST.ERR_DECPARSE_FILEOPEN % DecFile)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RawData = FileContent(DecFile, Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecComments.__init__(self)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DecBase.__init__(self, RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Define = _DecDefine(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Include = _DecInclude(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Guid = _DecGuid(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LibClass = _DecLibraryclass(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._Pcd = _DecPcd(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._UserEx = _DecUserExtension(RawData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # DEC file supported data types (one type per section)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._SectionParser = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_DEC_DEFINES.upper() : self._Define,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_INCLUDES.upper() : self._Include,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_LIBRARY_CLASSES.upper() : self._LibClass,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_GUIDS.upper() : self._Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PPIS.upper() : self._Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PROTOCOLS.upper() : self._Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : self._Pcd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : self._Pcd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PCDS_FEATURE_FLAG_NULL.upper() : self._Pcd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PCDS_DYNAMIC_NULL.upper() : self._Pcd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_PCDS_DYNAMIC_EX_NULL.upper() : self._Pcd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DT.TAB_USER_EXTENSIONS.upper() : self._UserEx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Parse:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ParseDecComment()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Parse()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Parsing done, check required fields
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.CheckRequiredFields()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def CheckRequiredFields(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for SectionParser in self._SectionParser.values():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not SectionParser.CheckRequiredFields():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Parse DEC file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def ParseDecComment(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while not self._RawData.IsEndOfFile():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line, Comment = CleanString(self._RawData.GetNextLine())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Header must be pure comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.UndoNextLine()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._HeadComment.append((Comment, self._RawData.LineIndex))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Double '#' indicates end of header comments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Comment or Comment == DT.TAB_SPECIAL_COMMENT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _StopCurrentParsing(self, Line):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _ParseItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._SectionHeaderParser()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(self._RawData.CurrentScope) == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_EMPTY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionObj = self._SectionParser[self._RawData.CurrentScope[0][0]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionObj.BlockStart()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionObj.Parse()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SectionObj.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _UserExtentionSectionParser(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentScope = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList = set()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Section = self._RawData.CurrentLine[1:-1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Par = ParserHelper(Section, self._RawData.Filename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while not Par.End():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # User extention
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Par.GetToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Token.upper() != DT.TAB_USER_EXTENSIONS.upper():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_UE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserExtension = Token.upper()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # UserID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Par.GetToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidUserId(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_USERID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UserId = Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # IdString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Par.GetToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidIdString(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_IDSTRING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IdString = Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = 'COMMON'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Par.Expect(DT.TAB_SPLIT):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Par.GetToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = Token.upper()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidArch(Arch):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_ARCH)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList.add(Arch)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if [UserExtension, UserId, IdString, Arch] not in \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentScope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentScope.append(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [UserExtension, UserId, IdString, Arch]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Par.Expect(DT.TAB_COMMA_SPLIT):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Par.End():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMA)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Par.AssertEnd(ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 'COMMON' in ArchList and len(ArchList) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## Section header parser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # The section header is always in following format:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # [section_name.arch<.platform|module_type>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _SectionHeaderParser(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self._RawData.CurrentLine[0] != DT.TAB_SECTION_START or self._RawData.CurrentLine[-1] != DT.TAB_SECTION_END:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_IDENTIFY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RawSection = self._RawData.CurrentLine[1:-1].strip().upper()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Check defines section which is only allowed to occur once and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # no arch can be followed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RawSection.startswith(DT.TAB_DEC_DEFINES.upper()):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RawSection != DT.TAB_DEC_DEFINES.upper():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_DEFINE_SECNAME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Check user extension section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RawSection.startswith(DT.TAB_USER_EXTENSIONS.upper()):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._UserExtentionSectionParser()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentScope = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionNames = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList = set()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in GetSplitValueList(RawSection, DT.TAB_COMMA_SPLIT):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemList = GetSplitValueList(Item, DT.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # different types of PCD are permissible in one section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionName = ItemList[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SectionName not in self._SectionParser:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_UNKNOW % SectionName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SectionName not in SectionNames:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionNames.append(SectionName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # In DEC specification, all section headers have at most two part:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # SectionName.Arch except UserExtention
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(ItemList) > 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBTOOMANY % Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if DT.TAB_PCDS_FEATURE_FLAG_NULL.upper() in SectionNames and len(SectionNames) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_FEATUREFLAG % DT.TAB_PCDS_FEATURE_FLAG_NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # S1 is always Arch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(ItemList) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str1 = ItemList[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not IsValidArch(Str1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_ARCH)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str1 = 'COMMON'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList.add(Str1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if [SectionName, Str1] not in self._RawData.CurrentScope:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._RawData.CurrentScope.append([SectionName, Str1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # 'COMMON' must not be used with specific ARCHs at the same section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 'COMMON' in ArchList and len(ArchList) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(SectionNames) == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(SectionNames) != 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Sec in SectionNames:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Sec.startswith(DT.TAB_PCDS.upper()):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self._LoggerError(ST.ERR_DECPARSE_SECTION_NAME % str(SectionNames))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetDefineSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetIncludeSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Include.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetGuidSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Guid.GetGuidObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetProtocolSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Guid.GetProtocolObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPpiSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Guid.GetPpiObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetLibraryClassSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._LibClass.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPcdSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Pcd.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetUserExtensionSectionObject(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._UserEx.GetDataObject()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPackageSpecification(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject().GetPackageSpecification()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPackageName(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject().GetPackageName()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPackageGuid(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject().GetPackageGuid()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPackageVersion(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject().GetPackageVersion()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GetPackageUniFile(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._Define.GetDataObject().GetPackageUniFile()