## @file DecPomAlignment.py\r
# This file contained the adapter for convert INF parser object to POM Object\r
#\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2016, 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
'''\r
DecPomAlignment\r
'''\r
+from __future__ import print_function\r
\r
##\r
# Import Modules\r
from os import sep\r
import platform\r
\r
+import re\r
import Logger.Log as Logger\r
from Logger import StringTable as ST\r
from Logger.ToolError import UPT_MUL_DEC_ERROR\r
+from Logger.ToolError import FORMAT_INVALID\r
\r
from Library.Parsing import NormPath\r
from Library.DataType import ARCH_LIST\r
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
+from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
from Library.DataType import TAB_ARCH_COMMON\r
-from Library.CommentParsing import ParseHeaderCommentSection\r
from Library.DataType import TAB_INCLUDES\r
-from Library.CommentParsing import ParseGenericComment\r
from Library.DataType import TAB_LIBRARY_CLASSES\r
from Library.DataType import TAB_PCDS\r
from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
from Library.DataType import TAB_PTR_TYPE_PCD\r
from Library.DataType import ITEM_UNDEFINED\r
+from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
+from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
+from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
+from Library.DataType import TAB_BINARY_HEADER_USERID\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_LANGUAGE_EN\r
+from Library.DataType import TAB_STR_TOKENCNAME\r
+from Library.DataType import TAB_STR_TOKENPROMPT\r
+from Library.DataType import TAB_STR_TOKENHELP\r
+from Library.DataType import TAB_STR_TOKENERR\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import TAB_SPLIT\r
+import Library.DataType as DT\r
+from Library.CommentParsing import ParseHeaderCommentSection\r
+from Library.CommentParsing import ParseGenericComment\r
from Library.CommentParsing import ParseDecPcdGenericComment\r
from Library.CommentParsing import ParseDecPcdTailComment\r
from Library.Misc import GetFiles\r
from Library.Misc import Sdict\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import PathClass\r
+from Library.Misc import ValidateUNIFilePath\r
+from Library.UniClassObject import UniFileClassObject\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
+from Library.ParserValidate import IsValidPath\r
from Parser.DecParser import Dec\r
-\r
from Object.POM.PackageObject import PackageObject\r
from Object.POM.CommonObject import UserExtensionObject\r
from Object.POM.CommonObject import IncludeObject\r
from Object.POM.CommonObject import LibraryClassObject\r
from Object.POM.CommonObject import PcdObject\r
from Object.POM.CommonObject import TextObject\r
+from Object.POM.CommonObject import MiscFileObject\r
+from Object.POM.CommonObject import FileObject\r
\r
\r
## DecPomAlignment\r
self.SupArchList = ARCH_LIST\r
self.CheckMulDec = CheckMulDec\r
self.DecParser = None\r
+ self.UniFileClassObject = None\r
+ self.PcdDefaultValueDict = {}\r
\r
#\r
# Load Dec file\r
self.SetFullPath(Filename)\r
self.SetRelaPath(Path)\r
self.SetFileName(Name)\r
- self.SetPackagePath(Path[Path.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
- self.SetCombinePath(Filename[Filename.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
+ self.SetPackagePath(GetRelativePath(Path, self.WorkspaceDir)) \r
+ self.SetCombinePath(GetRelativePath(Filename, self.WorkspaceDir))\r
\r
self.DecParser = Dec(Filename)\r
\r
# Generate user extensions\r
#\r
self.GenUserExtensions()\r
- \r
- ## Generate user extention\r
+ \r
+ ## Generate user extension\r
#\r
#\r
def GenUserExtensions(self):\r
Identifier = Item.IdString\r
if Identifier.startswith('"') and Identifier.endswith('"'):\r
Identifier = Identifier[1:-1]\r
+ #\r
+ # Generate miscellaneous files of DEC file\r
+ #\r
+ if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
+ self.GenMiscFiles(Item.UserString)\r
UserExtension.SetIdentifier(Identifier)\r
UserExtension.SetStatement(Item.UserString)\r
UserExtension.SetSupArchList(\r
self.SetUserExtensionList(\r
self.GetUserExtensionList() + [UserExtension]\r
)\r
- \r
+\r
+ # Add Private sections to UserExtension\r
+ if self.DecParser.GetPrivateSections():\r
+ PrivateUserExtension = UserExtensionObject()\r
+ PrivateUserExtension.SetStatement(self.DecParser.GetPrivateSections())\r
+ PrivateUserExtension.SetIdentifier(DT.TAB_PRIVATE)\r
+ PrivateUserExtension.SetUserID(DT.TAB_INTEL)\r
+ self.SetUserExtensionList(self.GetUserExtensionList() + [PrivateUserExtension])\r
+ \r
+ ## Generate miscellaneous files on DEC file\r
+ #\r
+ #\r
+ def GenMiscFiles(self, Content):\r
+ MiscFileObj = MiscFileObject()\r
+ for Line in Content.splitlines():\r
+ FileName = ''\r
+ if '#' in Line:\r
+ FileName = Line[:Line.find('#')]\r
+ else:\r
+ FileName = Line\r
+ if FileName:\r
+ if IsValidPath(FileName, self.GetRelaPath()):\r
+ FileObj = FileObject()\r
+ FileObj.SetURI(FileName)\r
+ MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
+ else:\r
+ Logger.Error("InfParser", \r
+ FORMAT_INVALID,\r
+ ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
+ File=self.GetFileName(),\r
+ ExtraData=Line) \r
+ self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
+ \r
## Generate Package Header\r
#\r
# Gen Package Header of Dec as <Key> = <Value>\r
# put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
#\r
SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
- TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, TAB_DEC_DEFINES_DEC_SPECIFICATION]\r
+ TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, \\r
+ TAB_DEC_DEFINES_DEC_SPECIFICATION, TAB_DEC_DEFINES_PKG_UNI_FILE]\r
if Item.Key in SkipItemList:\r
continue\r
DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
# DefObj.GetPackageVersion())\r
self.SetName(os.path.splitext(self.GetFileName())[0])\r
self.SetGuid(DefObj.GetPackageGuid())\r
+ if DefObj.GetPackageUniFile():\r
+ ValidateUNIFilePath(DefObj.GetPackageUniFile())\r
+ self.UniFileClassObject = \\r
+ UniFileClassObject([PathClass(os.path.join(DefObj.GetPackagePath(), DefObj.GetPackageUniFile()))])\r
+ else:\r
+ self.UniFileClassObject = None\r
\r
if DefinesDict:\r
UserExtension = UserExtensionObject()\r
)\r
\r
#\r
- # Get All header comment section information\r
+ # Get File header information\r
#\r
+ if self.UniFileClassObject:\r
+ Lang = TAB_LANGUAGE_EN_X\r
+ else:\r
+ Lang = TAB_LANGUAGE_EN_US\r
Abstract, Description, Copyright, License = \\r
ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
ContainerFile)\r
- self.SetAbstract(Abstract)\r
- self.SetDescription(Description)\r
- self.SetCopyright(Copyright)\r
- self.SetLicense(License)\r
+ if Abstract:\r
+ self.SetAbstract((Lang, Abstract))\r
+ if Description:\r
+ self.SetDescription((Lang, Description))\r
+ if Copyright:\r
+ self.SetCopyright(('', Copyright))\r
+ if License:\r
+ self.SetLicense(('', License))\r
\r
+ #\r
+ # Get Binary header information\r
+ #\r
+ if self.DecParser.BinaryHeadComment:\r
+ Abstract, Description, Copyright, License = \\r
+ ParseHeaderCommentSection(self.DecParser.BinaryHeadComment,\r
+ ContainerFile, True)\r
+ \r
+ if not Abstract or not Description or not Copyright or not License:\r
+ Logger.Error('MkPkg',\r
+ FORMAT_INVALID,\r
+ ST.ERR_INVALID_BINARYHEADER_FORMAT,\r
+ ContainerFile)\r
+ else:\r
+ self.SetBinaryHeaderAbstract((Lang, Abstract))\r
+ self.SetBinaryHeaderDescription((Lang, Description))\r
+ self.SetBinaryHeaderCopyright(('', Copyright))\r
+ self.SetBinaryHeaderLicense(('', License))\r
+\r
+ BinaryAbstractList = []\r
+ BinaryDescriptionList = []\r
+ \r
+ #Get Binary header from UNI file\r
+ # Initialize the UniStrDict dictionary, top keys are language codes\r
+ UniStrDict = {}\r
+ if self.UniFileClassObject:\r
+ UniStrDict = self.UniFileClassObject.OrderedStringList\r
+ for Lang in UniStrDict:\r
+ for StringDefClassObject in UniStrDict[Lang]:\r
+ Lang = GetLanguageCode1766(Lang)\r
+ if StringDefClassObject.StringName == TAB_DEC_BINARY_ABSTRACT:\r
+ if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+ not in self.GetBinaryHeaderAbstract():\r
+ BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+ if StringDefClassObject.StringName == TAB_DEC_BINARY_DESCRIPTION:\r
+ if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+ not in self.GetBinaryHeaderDescription():\r
+ BinaryDescriptionList.append((Lang, \r
+ ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+ #Combine Binary header from DEC file and UNI file\r
+ BinaryAbstractList = self.GetBinaryHeaderAbstract() + BinaryAbstractList\r
+ BinaryDescriptionList = self.GetBinaryHeaderDescription() + BinaryDescriptionList\r
+ BinaryCopyrightList = self.GetBinaryHeaderCopyright()\r
+ BinaryLicenseList = self.GetBinaryHeaderLicense()\r
+ #Generate the UserExtensionObject for TianoCore."BinaryHeader"\r
+ if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
+ BinaryUserExtension = UserExtensionObject()\r
+ BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
+ BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
+ BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
+ BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
+ BinaryUserExtension.SetIdentifier(TAB_BINARY_HEADER_IDENTIFIER)\r
+ BinaryUserExtension.SetUserID(TAB_BINARY_HEADER_USERID)\r
+ self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
+ \r
+ \r
## GenIncludes\r
#\r
# Gen Includes of Dec\r
IncObj = self.DecParser.GetIncludeSectionObject()\r
for Item in IncObj.GetAllIncludes():\r
IncludePath = os.path.normpath(Item.File)\r
- if platform.system() != 'Windows':\r
+ if platform.system() != 'Windows' and platform.system() != 'Microsoft':\r
IncludePath = IncludePath.replace('\\', '/')\r
if IncludePath in IncludesDict:\r
if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
# \r
PackagePath = os.path.split(self.GetFullPath())[0]\r
IncludePathList = \\r
- [os.path.normpath(Path) + sep for Path in IncludesDict.keys()]\r
- IncludePathList.sort()\r
+ sorted([os.path.normpath(Path) + sep for Path in IncludesDict.keys()])\r
\r
#\r
# get a non-overlap set of include path, IncludePathList should be \r
ListObject.SetGuid(Value)\r
ListObject.SetSupArchList(Item.GetArchList())\r
if HelpTxt:\r
+ if self.UniFileClassObject:\r
+ HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
ListObject.SetHelpTextList([HelpTxt])\r
\r
DeclarationsList.append(ListObject)\r
HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
Item.GetTailComment(), None, '@libraryclass')\r
if HelpTxt:\r
+ if self.UniFileClassObject:\r
+ HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
LibraryClass.SetHelpTextList([HelpTxt])\r
LibraryClassDeclarations.append(LibraryClass)\r
\r
#\r
def GenPcds(self, ContainerFile):\r
Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
- \r
PcdObj = self.DecParser.GetPcdSectionObject()\r
#\r
# Get all Pcds\r
(TAB_PCDS_FEATURE_FLAG_NULL, 'FeaturePcd'),\r
(TAB_PCDS_DYNAMIC_EX_NULL, 'PcdEx'), \r
(TAB_PCDS_DYNAMIC_NULL, 'Pcd')]\r
+ \r
+ PromptStrList = []\r
+ HelpStrList = []\r
+ PcdErrStrList = []\r
+ # Initialize UniStrDict dictionary, top keys are language codes\r
+ UniStrDict = {}\r
+ StrList = []\r
+ \r
+ Language = ''\r
+ if self.UniFileClassObject:\r
+ Language = TAB_LANGUAGE_EN_X\r
+ else:\r
+ Language = TAB_LANGUAGE_EN_US\r
+ \r
+ if self.UniFileClassObject:\r
+ UniStrDict = self.UniFileClassObject.OrderedStringList\r
+ for Lang in UniStrDict:\r
+ for StringDefClassObject in UniStrDict[Lang]:\r
+ StrList = StringDefClassObject.StringName.split('_')\r
+ # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_PROMPT\r
+ if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENPROMPT:\r
+ PromptStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+ StringDefClassObject.StringValue))\r
+ # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_HELP\r
+ if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENHELP:\r
+ HelpStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+ StringDefClassObject.StringValue))\r
+ # StringName format is STR_<TOKENSPACECNAME>_ERR_##\r
+ if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[2] == TAB_STR_TOKENERR:\r
+ PcdErrStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+ StringDefClassObject.StringValue))\r
#\r
# For each PCD type\r
#\r
ContainerFile,\r
(Item.TokenSpaceGuidCName, Item.TokenCName,\r
Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
- Type, Item.GetHeadComment(), Item.GetTailComment(),\r
- '')\r
- )\r
+ Type, Item.GetHeadComment(), Item.GetTailComment(), ''),\r
+ Language,\r
+ self.DecParser.GetDefineSectionMacro()\r
+ )\r
PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
+ \r
+ #\r
+ # Get PCD error message from PCD error comment section in DEC file\r
+ #\r
+ for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+ if (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber()) \\r
+ in self.DecParser.PcdErrorCommentDict:\r
+ Key = (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber())\r
+ PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+ [(Language, self.DecParser.PcdErrorCommentDict[Key])])\r
+ \r
+ for Index in range(0, len(PromptStrList)):\r
+ StrNameList = PromptStrList[Index][1].split('_')\r
+ if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+ StrNameList[2].lower() == Item.TokenCName.lower():\r
+ TxtObj = TextObject()\r
+ TxtObj.SetLang(PromptStrList[Index][0])\r
+ TxtObj.SetString(PromptStrList[Index][2])\r
+ for Prompt in PcdDeclaration.GetPromptList():\r
+ if Prompt.GetLang() == TxtObj.GetLang() and \\r
+ Prompt.GetString() == TxtObj.GetString():\r
+ break\r
+ else:\r
+ PcdDeclaration.SetPromptList(PcdDeclaration.GetPromptList() + [TxtObj])\r
+ \r
+ for Index in range(0, len(HelpStrList)):\r
+ StrNameList = HelpStrList[Index][1].split('_')\r
+ if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+ StrNameList[2].lower() == Item.TokenCName.lower():\r
+ TxtObj = TextObject()\r
+ TxtObj.SetLang(HelpStrList[Index][0])\r
+ TxtObj.SetString(HelpStrList[Index][2])\r
+ for HelpStrObj in PcdDeclaration.GetHelpTextList():\r
+ if HelpStrObj.GetLang() == TxtObj.GetLang() and \\r
+ HelpStrObj.GetString() == TxtObj.GetString():\r
+ break\r
+ else:\r
+ PcdDeclaration.SetHelpTextList(PcdDeclaration.GetHelpTextList() + [TxtObj])\r
+\r
+ #\r
+ # Get PCD error message from UNI file\r
+ #\r
+ for Index in range(0, len(PcdErrStrList)):\r
+ StrNameList = PcdErrStrList[Index][1].split('_')\r
+ if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+ StrNameList[2].lower() == TAB_STR_TOKENERR.lower():\r
+ for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+ if PcdErr.GetErrorNumber().lower() == (TAB_HEX_START + StrNameList[3]).lower() and \\r
+ (PcdErrStrList[Index][0], PcdErrStrList[Index][2]) not in PcdErr.GetErrorMessageList():\r
+ PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+ [(PcdErrStrList[Index][0], PcdErrStrList[Index][2])])\r
+ \r
+ #\r
+ # Check to prevent missing error message if a Pcd has the error code.\r
+ #\r
+ for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+ if PcdErr.GetErrorNumber().strip():\r
+ if not PcdErr.GetErrorMessageList():\r
+ Logger.Error('UPT',\r
+ FORMAT_INVALID,\r
+ ST.ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE % PcdErr.GetErrorNumber(),\r
+ ContainerFile,\r
+ PcdErr.GetLineNum(),\r
+ PcdErr.GetFileLine()) \r
+ \r
PcdDeclarations.append(PcdDeclaration)\r
- \r
self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
+ self.CheckPcdValue()\r
+ \r
+ ##\r
+ # Get error message via language\r
+ # @param ErrorMessageList: Error message tuple list the language and its message\r
+ # @param Lang: the language of setting\r
+ # @return: the error message described in the related UNI file\r
+ def GetEnErrorMessage(self, ErrorMessageList):\r
+ if self.FullPath:\r
+ pass\r
+ Lang = TAB_LANGUAGE_EN_US\r
+ for (Language, Message) in ErrorMessageList:\r
+ if Language == Lang:\r
+ return Message\r
+ for (Language, Message) in ErrorMessageList:\r
+ if Language.find(TAB_LANGUAGE_EN) >= 0:\r
+ return Message\r
+ else:\r
+ try:\r
+ return ErrorMessageList[0][1]\r
+ except IndexError:\r
+ return ''\r
+ return '' \r
+ \r
+ ##\r
+ # Replace the strings for Python eval function.\r
+ # @param ReplaceValue: The string that needs to be replaced. \r
+ # @return: The string was replaced, then eval function is always making out it. \r
+ def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r
+ if self.FullPath:\r
+ pass\r
+ #\r
+ # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT" \r
+ #\r
+ NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r
+ NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r
+ NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r
+ NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r
+ NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r
+ NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r
+ ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r
+ \r
+ if IsRange:\r
+ ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r
+ ReplaceValue = ReplaceValue.replace('LT', 'x <')\r
+ ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r
+ ReplaceValue = ReplaceValue.replace('GT', 'x >')\r
+ ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r
+ ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r
+ elif IsExpr:\r
+ ReplaceValue = ReplaceValue.replace('EQ', '==')\r
+ ReplaceValue = ReplaceValue.replace('NE', '!=')\r
+ ReplaceValue = ReplaceValue.replace('LT', '<')\r
+ ReplaceValue = ReplaceValue.replace('LE', '<=')\r
+ ReplaceValue = ReplaceValue.replace('GT', '>')\r
+ ReplaceValue = ReplaceValue.replace('GE', '>=') \r
+ ReplaceValue = ReplaceValue.replace('XOR', '^') \r
+ \r
+ ReplaceValue = ReplaceValue.replace('AND', 'and')\r
+ ReplaceValue = ReplaceValue.replace('&&', ' and ')\r
+ ReplaceValue = ReplaceValue.replace('xor', '^')\r
+ ReplaceValue = ReplaceValue.replace('OR', 'or')\r
+ ReplaceValue = ReplaceValue.replace('||', ' or ')\r
+ ReplaceValue = ReplaceValue.replace('NOT', 'not')\r
+ if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r
+ ReplaceValue = ReplaceValue.replace('!', ' not ') \r
+ if '.' in ReplaceValue:\r
+ Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r
+ MatchedList = re.findall(Pattern, ReplaceValue)\r
+ for MatchedItem in MatchedList:\r
+ if MatchedItem not in self.PcdDefaultValueDict:\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r
+ File=self.FullPath)\r
+ \r
+ ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r
+\r
+ return ReplaceValue\r
+\r
+ ##\r
+ # Check pcd's default value according to the pcd's description\r
+ #\r
+ def CheckPcdValue(self):\r
+ for Pcd in self.GetPcdList():\r
+ self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r
+ Pcd.GetDefaultValue()\r
+ \r
+ for Pcd in self.GetPcdList():\r
+ ValidationExpressions = []\r
+ PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r
+ Valids = Pcd.GetPcdErrorsList()\r
+ for Valid in Valids:\r
+ Expression = Valid.GetExpression()\r
+ if Expression:\r
+ #\r
+ # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+ #\r
+ QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+ QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r
+ if QuotedMatchedObj:\r
+ MatchedStr = QuotedMatchedObj.group().strip()\r
+ if MatchedStr.startswith('L'):\r
+ Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip()) \r
+\r
+ Expression = self.ReplaceForEval(Expression, IsExpr=True)\r
+ Expression = Expression.replace(PcdGuidName, 'x')\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((Expression, Message)) \r
+ \r
+ ValidList = Valid.GetValidValue()\r
+ if ValidList:\r
+ ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((ValidValue, Message))\r
+ \r
+ ValidValueRange = Valid.GetValidValueRange() \r
+ if ValidValueRange:\r
+ ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r
+ if ValidValueRange.find('-') >= 0:\r
+ ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r
+ elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r
+ and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r
+ ValidValueRange = 'x %s' % ValidValueRange\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((ValidValueRange, Message))\r
+ \r
+ DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r
+ #\r
+ # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+ #\r
+ QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+ QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r
+ if QuotedMatchedObj:\r
+ MatchedStr = QuotedMatchedObj.group().strip()\r
+ if MatchedStr.startswith('L'):\r
+ DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r
+ \r
+ try:\r
+ DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r
+ .replace('FALSE', 'False').replace('false', 'False'))\r
+ except BaseException:\r
+ pass\r
+\r
+ for (Expression, Msg) in ValidationExpressions:\r
+ try:\r
+ if not eval(Expression, {'x':DefaultValue}):\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r
+ (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r
+ except TypeError:\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r
+ Message=Msg, File=self.FullPath)\r
\r
- \r
## GenModuleFileList\r
#\r
def GenModuleFileList(self, ContainerFile): \r
# Print all members and their values of Package class\r
#\r
def ShowPackage(self):\r
- print '\nName =', self.GetName()\r
- print '\nBaseName =', self.GetBaseName()\r
- print '\nVersion =', self.GetVersion() \r
- print '\nGuid =', self.GetGuid()\r
+ print('\nName =', self.GetName())\r
+ print('\nBaseName =', self.GetBaseName())\r
+ print('\nVersion =', self.GetVersion())\r
+ print('\nGuid =', self.GetGuid())\r
\r
- print '\nStandardIncludes = %d ' \\r
- % len(self.GetStandardIncludeFileList()),\r
+ print('\nStandardIncludes = %d ' \\r
+ % len(self.GetStandardIncludeFileList()), end=' ')\r
for Item in self.GetStandardIncludeFileList():\r
- print Item.GetFilePath(), ' ', Item.GetSupArchList()\r
- print '\nPackageIncludes = %d \n' \\r
- % len(self.GetPackageIncludeFileList()),\r
+ print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r
+ print('\nPackageIncludes = %d \n' \\r
+ % len(self.GetPackageIncludeFileList()), end=' ')\r
for Item in self.GetPackageIncludeFileList():\r
- print Item.GetFilePath(), ' ', Item.GetSupArchList()\r
+ print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r
\r
- print '\nGuids =', self.GetGuidList()\r
+ print('\nGuids =', self.GetGuidList())\r
for Item in self.GetGuidList():\r
- print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
- print '\nProtocols =', self.GetProtocolList()\r
+ print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+ print('\nProtocols =', self.GetProtocolList())\r
for Item in self.GetProtocolList():\r
- print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
- print '\nPpis =', self.GetPpiList()\r
+ print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+ print('\nPpis =', self.GetPpiList())\r
for Item in self.GetPpiList():\r
- print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
- print '\nLibraryClasses =', self.GetLibraryClassList()\r
+ print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+ print('\nLibraryClasses =', self.GetLibraryClassList())\r
for Item in self.GetLibraryClassList():\r
- print Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
- Item.GetSupArchList()\r
- print '\nPcds =', self.GetPcdList()\r
+ print(Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
+ Item.GetSupArchList())\r
+ print('\nPcds =', self.GetPcdList())\r
for Item in self.GetPcdList():\r
- print 'CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
+ print('CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
Item.GetTokenSpaceGuidCName(), \\r
'DefaultValue=', Item.GetDefaultValue(), \\r
'ValidUsage=', Item.GetValidUsage(), \\r
'SupArchList', Item.GetSupArchList(), \\r
- 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType()\r
+ 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType())\r
\r
for Item in self.GetMiscFileList():\r
- print Item.GetName()\r
+ print(Item.GetName())\r
for FileObjectItem in Item.GetFileList():\r
- print FileObjectItem.GetURI()\r
- print '****************\n'\r
+ print(FileObjectItem.GetURI())\r
+ print('****************\n')\r
\r
## GenPcdDeclaration\r
#\r
# @param PcdInfo: Pcd information, of format (TokenGuidCName, \r
# TokenName, Value, DatumType, Token, Type, \r
# GenericComment, TailComment, Arch)\r
+# @param Language: The language of HelpText, Prompt \r
# \r
-def GenPcdDeclaration(ContainerFile, PcdInfo):\r
+def GenPcdDeclaration(ContainerFile, PcdInfo, Language, MacroReplaceDict):\r
HelpStr = ''\r
+ PromptStr = ''\r
TailHelpStr = ''\r
TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
GenericComment, TailComment, Arch = PcdInfo\r
Pcd.SetSupArchList(SupArchList)\r
\r
if GenericComment:\r
- HelpStr, PcdErr = ParseDecPcdGenericComment(GenericComment, \r
- ContainerFile)\r
- if PcdErr:\r
- Pcd.SetPcdErrorsList([PcdErr])\r
+ HelpStr, PcdErrList, PromptStr = ParseDecPcdGenericComment(GenericComment, \r
+ ContainerFile, \r
+ TokenGuidCName, \r
+ TokenName,\r
+ MacroReplaceDict)\r
+ if PcdErrList:\r
+ Pcd.SetPcdErrorsList(PcdErrList)\r
\r
if TailComment:\r
SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r
HelpStr += '\n'\r
HelpStr += TailHelpStr\r
if HelpStr:\r
- HelpTxtObj = TextObject() \r
+ HelpTxtObj = TextObject()\r
+ HelpTxtObj.SetLang(Language) \r
HelpTxtObj.SetString(HelpStr)\r
Pcd.SetHelpTextList([HelpTxtObj])\r
+ if PromptStr:\r
+ TxtObj = TextObject()\r
+ TxtObj.SetLang(Language)\r
+ TxtObj.SetString(PromptStr)\r
+ Pcd.SetPromptList([TxtObj])\r
\r
return Pcd\r