## @file\r
# This file is used to parse DEC file. It will consumed by DecParser\r
#\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials are licensed and made available \r
# under the terms and conditions of the BSD License which accompanies this \r
from Library.String import GetSplitValueList\r
from Library.String import gMACRO_PATTERN\r
from Library.String import ConvertSpecialChar\r
+from Library.CommentParsing import ParsePcdErrorCode\r
\r
##\r
# _DecBase class for parsing\r
def GetDataObject(self):\r
return self.ItemObject\r
\r
+ def GetLocalMacro(self):\r
+ return self._LocalMacro\r
+ \r
## BlockStart\r
#\r
# Called if a new section starts\r
self._LocalMacro[TokenList[0]] = ''\r
else:\r
self._LocalMacro[TokenList[0]] = self._ReplaceMacro(TokenList[1])\r
- \r
+\r
## _ParseItem\r
#\r
# Parse specified item, this function must be derived by subclass\r
DT.TAB_DEC_DEFINES_PACKAGE_NAME : self._SetPackageName,\r
DT.TAB_DEC_DEFINES_PACKAGE_GUID : self._SetPackageGuid,\r
DT.TAB_DEC_DEFINES_PACKAGE_VERSION : self._SetPackageVersion,\r
+ DT.TAB_DEC_DEFINES_PKG_UNI_FILE : self._SetPackageUni,\r
}\r
\r
def BlockStart(self):\r
Line = self._RawData.CurrentLine\r
TokenList = GetSplitValueList(Line, DT.TAB_EQUAL_SPLIT, 1)\r
if TokenList[0] == DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
- pass\r
+ self.DefineValidation[TokenList[0]](TokenList[1])\r
elif len(TokenList) < 2:\r
self._LoggerError(ST.ERR_DECPARSE_DEFINE_FORMAT)\r
elif TokenList[0] not in self.DefineValidation:\r
self.DefineValidation[TokenList[0]](TokenList[1])\r
\r
DefineItem = DecDefineItemObject()\r
- if TokenList[0] != DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
- DefineItem.Key = TokenList[0]\r
- DefineItem.Value = TokenList[1]\r
- self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
+ DefineItem.Key = TokenList[0]\r
+ DefineItem.Value = TokenList[1]\r
+ self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
return DefineItem\r
\r
def _SetDecSpecification(self, Token):\r
else:\r
if not DT.TAB_SPLIT in Token:\r
Token = Token + '.0'\r
- self.ItemObject._PkgVersion = Token\r
+ self.ItemObject.SetPackageVersion(Token)\r
+ \r
+ def _SetPackageUni(self, Token):\r
+ if self.ItemObject.GetPackageUniFile():\r
+ self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PKG_UNI_FILE)\r
+ self.ItemObject.SetPackageUniFile(Token)\r
\r
## _DecInclude\r
#\r
class Dec(_DecBase, _DecComments): \r
def __init__(self, DecFile, Parse = True): \r
try:\r
- Content = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
+ Content = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
except BaseException:\r
Logger.Error(TOOL_NAME, FILE_OPEN_FAILURE, File=DecFile,\r
ExtraData=ST.ERR_DECPARSE_FILEOPEN % DecFile)\r
_DecComments.__init__(self)\r
_DecBase.__init__(self, RawData)\r
\r
- self.BinaryHeadComment = [] \r
+ self.BinaryHeadComment = []\r
+ self.PcdErrorCommentDict = {}\r
+ \r
self._Define = _DecDefine(RawData)\r
self._Include = _DecInclude(RawData)\r
self._Guid = _DecGuid(RawData)\r
if not SectionParser.CheckRequiredFields():\r
return False\r
return True\r
- \r
+\r
##\r
# Parse DEC file\r
#\r
IsBinaryHeader = False\r
FileHeaderLineIndex = -1\r
BinaryHeaderLineIndex = -1\r
+ TokenSpaceGuidCName = ''\r
+ \r
+ #\r
+ # Parse PCD error comment section\r
+ #\r
while not self._RawData.IsEndOfFile():\r
- Line, Comment = CleanString(self._RawData.GetNextLine())\r
+ self._RawData.CurrentLine = self._RawData.GetNextLine()\r
+ if self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT) and \\r
+ DT.TAB_SECTION_START in self._RawData.CurrentLine and \\r
+ DT.TAB_SECTION_END in self._RawData.CurrentLine:\r
+ self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
\r
+ if self._RawData.CurrentLine[0] == DT.TAB_SECTION_START and \\r
+ self._RawData.CurrentLine[-1] == DT.TAB_SECTION_END:\r
+ RawSection = self._RawData.CurrentLine[1:-1].strip()\r
+ if RawSection.upper().startswith(DT.TAB_PCD_ERROR.upper()+'.'):\r
+ TokenSpaceGuidCName = RawSection.split(DT.TAB_PCD_ERROR+'.')[1].strip()\r
+ continue\r
+\r
+ if TokenSpaceGuidCName and self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT):\r
+ self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
+ if self._RawData.CurrentLine != '':\r
+ if DT.TAB_VALUE_SPLIT not in self._RawData.CurrentLine:\r
+ self._LoggerError(ST.ERR_DECPARSE_PCDERRORMSG_MISS_VALUE_SPLIT) \r
+ \r
+ PcdErrorNumber, PcdErrorMsg = GetSplitValueList(self._RawData.CurrentLine, DT.TAB_VALUE_SPLIT, 1)\r
+ PcdErrorNumber = ParsePcdErrorCode(PcdErrorNumber, self._RawData.Filename, self._RawData.LineIndex)\r
+ if not PcdErrorMsg.strip():\r
+ self._LoggerError(ST.ERR_DECPARSE_PCD_MISS_ERRORMSG)\r
+ \r
+ self.PcdErrorCommentDict[(TokenSpaceGuidCName, PcdErrorNumber)] = PcdErrorMsg.strip()\r
+ else:\r
+ TokenSpaceGuidCName = ''\r
+\r
+ self._RawData.LineIndex = 0\r
+ self._RawData.CurrentLine = ''\r
+ self._RawData.NextLine = ''\r
+\r
+ while not self._RawData.IsEndOfFile():\r
+ Line, Comment = CleanString(self._RawData.GetNextLine())\r
+ \r
#\r
# Header must be pure comment\r
#\r
self._LoggerError(ST.ERR_BINARY_HEADER_ORDER)\r
\r
if FileHeaderLineIndex == -1:\r
+# self._LoggerError(ST.ERR_NO_SOURCE_HEADER)\r
Logger.Error(TOOL_NAME, FORMAT_INVALID, \r
ST.ERR_NO_SOURCE_HEADER,\r
- File=self._RawData.Filename) \r
+ File=self._RawData.Filename)\r
return\r
\r
def _StopCurrentParsing(self, Line):\r
self._SectionHeaderParser()\r
if len(self._RawData.CurrentScope) == 0:\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_EMPTY)\r
-\r
SectionObj = self._SectionParser[self._RawData.CurrentScope[0][0]]\r
-\r
SectionObj.BlockStart()\r
SectionObj.Parse()\r
- \r
return SectionObj.GetDataObject()\r
\r
def _UserExtentionSectionParser(self):\r
self._RawData.CurrentScope = []\r
ArchList = set()\r
Section = self._RawData.CurrentLine[1:-1]\r
- \r
Par = ParserHelper(Section, self._RawData.Filename)\r
while not Par.End():\r
#\r
if Token.upper() != DT.TAB_USER_EXTENSIONS.upper():\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_UE)\r
UserExtension = Token.upper()\r
-\r
- Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
+ Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex) \r
+ \r
#\r
# UserID\r
#\r
if not IsValidUserId(Token):\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_USERID)\r
UserId = Token\r
- \r
Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
#\r
# IdString\r
if not IsValidIdString(Token):\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_IDSTRING)\r
IdString = Token\r
- \r
Arch = 'COMMON'\r
if Par.Expect(DT.TAB_SPLIT):\r
Token = Par.GetToken()\r
if not IsValidArch(Arch):\r
self._LoggerError(ST.ERR_DECPARSE_ARCH)\r
ArchList.add(Arch)\r
- \r
if [UserExtension, UserId, IdString, Arch] not in \\r
self._RawData.CurrentScope:\r
self._RawData.CurrentScope.append(\r
[UserExtension, UserId, IdString, Arch]\r
)\r
- \r
if not Par.Expect(DT.TAB_COMMA_SPLIT):\r
break\r
elif Par.End():\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMA)\r
- \r
Par.AssertEnd(ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
- \r
if 'COMMON' in ArchList and len(ArchList) > 1:\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_IDENTIFY)\r
\r
RawSection = self._RawData.CurrentLine[1:-1].strip().upper()\r
- \r
#\r
# Check defines section which is only allowed to occur once and\r
# no arch can be followed\r
if RawSection.startswith(DT.TAB_DEC_DEFINES.upper()):\r
if RawSection != DT.TAB_DEC_DEFINES.upper():\r
self._LoggerError(ST.ERR_DECPARSE_DEFINE_SECNAME)\r
- \r
#\r
# Check user extension section\r
#\r
if RawSection.startswith(DT.TAB_USER_EXTENSIONS.upper()):\r
return self._UserExtentionSectionParser()\r
- \r
self._RawData.CurrentScope = []\r
SectionNames = []\r
ArchList = set()\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
\r
ItemList = GetSplitValueList(Item, DT.TAB_SPLIT)\r
-\r
#\r
# different types of PCD are permissible in one section\r
#\r
SectionName = ItemList[0]\r
if SectionName not in self._SectionParser:\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_UNKNOW % SectionName)\r
- \r
if SectionName not in SectionNames:\r
SectionNames.append(SectionName)\r
- \r
#\r
# In DEC specification, all section headers have at most two part:\r
# SectionName.Arch except UserExtention\r
#\r
if 'COMMON' in ArchList and len(ArchList) > 1:\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
- \r
if len(SectionNames) == 0:\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
if len(SectionNames) != 1:\r
if not Sec.startswith(DT.TAB_PCDS.upper()):\r
self._LoggerError(ST.ERR_DECPARSE_SECTION_NAME % str(SectionNames))\r
\r
+ def GetDefineSectionMacro(self):\r
+ return self._Define.GetLocalMacro()\r
def GetDefineSectionObject(self):\r
return self._Define.GetDataObject()\r
- \r
def GetIncludeSectionObject(self):\r
return self._Include.GetDataObject()\r
- \r
def GetGuidSectionObject(self):\r
return self._Guid.GetGuidObject()\r
- \r
def GetProtocolSectionObject(self):\r
return self._Guid.GetProtocolObject()\r
- \r
def GetPpiSectionObject(self):\r
return self._Guid.GetPpiObject()\r
- \r
def GetLibraryClassSectionObject(self):\r
return self._LibClass.GetDataObject()\r
- \r
def GetPcdSectionObject(self):\r
return self._Pcd.GetDataObject()\r
- \r
def GetUserExtensionSectionObject(self):\r
return self._UserEx.GetDataObject()\r
- \r
def GetPackageSpecification(self):\r
- return self._Define.GetDataObject().GetPackageSpecification()\r
- \r
+ return self._Define.GetDataObject().GetPackageSpecification() \r
def GetPackageName(self):\r
- return self._Define.GetDataObject().GetPackageName()\r
- \r
+ return self._Define.GetDataObject().GetPackageName() \r
def GetPackageGuid(self):\r
- return self._Define.GetDataObject().GetPackageGuid()\r
- \r
+ return self._Define.GetDataObject().GetPackageGuid() \r
def GetPackageVersion(self):\r
return self._Define.GetDataObject().GetPackageVersion()\r
- \r
def GetPackageUniFile(self):\r
return self._Define.GetDataObject().GetPackageUniFile()\r