]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
BaseTools: Replace StandardError with Expression
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / DecPomAlignment.py
index cb8aa187881bbc1ef1e59bb794e346cdc99ca9e2..074aa311f31da7e9574a8a7245c450d5e27d6353 100644 (file)
@@ -1,7 +1,7 @@
 ## @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
@@ -15,6 +15,7 @@
 '''\r
 DecPomAlignment\r
 '''\r
+from __future__ import print_function\r
 \r
 ##\r
 # Import Modules\r
@@ -23,9 +24,11 @@ import os.path
 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
@@ -36,10 +39,9 @@ from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME
 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
@@ -49,12 +51,34 @@ from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL
 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
@@ -64,6 +88,8 @@ from Object.POM.CommonObject import PpiObject
 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
@@ -78,6 +104,8 @@ class DecPomAlignment(PackageObject):
         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
@@ -104,8 +132,8 @@ class DecPomAlignment(PackageObject):
         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
@@ -164,8 +192,8 @@ class DecPomAlignment(PackageObject):
         # Generate user extensions\r
         #\r
         self.GenUserExtensions()\r
-    \r
-    ## Generate user extention\r
+        \r
+    ## Generate user extension\r
     #\r
     #\r
     def GenUserExtensions(self):\r
@@ -182,6 +210,11 @@ class DecPomAlignment(PackageObject):
             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
@@ -190,7 +223,39 @@ class DecPomAlignment(PackageObject):
             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
@@ -210,7 +275,8 @@ class DecPomAlignment(PackageObject):
             # 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
@@ -221,6 +287,12 @@ class DecPomAlignment(PackageObject):
 #                     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
@@ -232,16 +304,80 @@ class DecPomAlignment(PackageObject):
             )\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
@@ -257,7 +393,7 @@ class DecPomAlignment(PackageObject):
         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
@@ -401,6 +537,8 @@ class DecPomAlignment(PackageObject):
             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
@@ -437,6 +575,8 @@ class DecPomAlignment(PackageObject):
             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
@@ -452,7 +592,6 @@ class DecPomAlignment(PackageObject):
     #\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
@@ -464,6 +603,37 @@ class DecPomAlignment(PackageObject):
             (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
@@ -478,15 +648,234 @@ class DecPomAlignment(PackageObject):
                         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
@@ -514,47 +903,47 @@ class DecPomAlignment(PackageObject):
     # 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
@@ -562,9 +951,11 @@ class DecPomAlignment(PackageObject):
 # @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
@@ -585,10 +976,13 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
     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
@@ -600,8 +994,14 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
         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