]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfPcdObject.py
index fc5227451aa772037fafe5d5775fbae9de4fe836..fd8065fab5f4473ac922389c276f738c02c29a03 100644 (file)
@@ -1,16 +1,10 @@
 ## @file\r
-# This file is used to define class objects of INF file [Pcds] section. \r
-# It will consumed by InfParser. \r
+# This file is used to define class objects of INF file [Pcds] section.\r
+# It will consumed by InfParser.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2018, 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
-# distribution. The full text of the license may be found at \r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 '''\r
 InfPcdObject\r
@@ -21,18 +15,18 @@ import re
 from Logger import StringTable as ST\r
 from Logger import ToolError\r
 import Logger.Log as Logger\r
-from Library import GlobalData \r
+from Library import GlobalData\r
 from Library import DataType as DT\r
 \r
 from Library.Misc import Sdict\r
 from Library.Misc import GetHelpStringByRemoveHashKey\r
-from Library.ParserValidate import IsValidPcdType \r
+from Library.ParserValidate import IsValidPcdType\r
 from Library.ParserValidate import IsValidCVariableName\r
 from Library.ParserValidate import IsValidPcdValue\r
 from Library.ParserValidate import IsValidArch\r
 from Library.CommentParsing import ParseComment\r
-from Library.String import GetSplitValueList\r
-from Library.String import IsHexDigitUINT32\r
+from Library.StringUtils import GetSplitValueList\r
+from Library.StringUtils import IsHexDigitUINT32\r
 from Library.ExpressionValidate import IsValidFeatureFlagExp\r
 from Parser.InfAsBuiltProcess import GetPackageListInfo\r
 from Parser.DecParser import Dec\r
@@ -42,24 +36,24 @@ from Object.Parser.InfPackagesObject import InfPackageItem
 def ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList):\r
     #\r
     # Validate Arch\r
-    #            \r
-    if (ArchItem == '' or ArchItem == None):\r
+    #\r
+    if (ArchItem == '' or ArchItem is None):\r
         ArchItem = 'COMMON'\r
-    \r
+\r
     if PcdTypeItem1.upper != DT.TAB_INF_FEATURE_PCD.upper():\r
         ArchList = GetSplitValueList(ArchItem, ' ')\r
         for ArchItemNew in ArchList:\r
             if not IsValidArch(ArchItemNew):\r
-                Logger.Error("InfParser", \r
+                Logger.Error("InfParser",\r
                              ToolError.FORMAT_INVALID,\r
-                             ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ArchItemNew), \r
+                             ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (ArchItemNew),\r
                              File=GlobalData.gINF_MODULE_NAME,\r
-                             Line=LineNo, \r
+                             Line=LineNo,\r
                              ExtraData=ArchItemNew)\r
-        SupArchDict[PcdTypeItem1] = ArchList            \r
+        SupArchDict[PcdTypeItem1] = ArchList\r
     else:\r
         SupArchList.append(ArchItem)\r
-        \r
+\r
     return SupArchList, SupArchDict\r
 \r
 def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):\r
@@ -68,47 +62,47 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
     PreHelpText = ''\r
     BlockFlag = -1\r
     FFEHelpText = ''\r
-    CommentItemHelpText = '' \r
-    Count = 0   \r
+    CommentItemHelpText = ''\r
+    Count = 0\r
     for CommentItem in CommentList:\r
         Count = Count + 1\r
-        CommentItemUsage, CommentType, CommentString, CommentItemHelpText =  ParseComment(CommentItem, \r
-                                                                             DT.ALL_USAGE_TOKENS, \r
-                                                                             {}, \r
+        CommentItemUsage, CommentType, CommentString, CommentItemHelpText = ParseComment(CommentItem,\r
+                                                                             DT.ALL_USAGE_TOKENS,\r
+                                                                             {},\r
                                                                              [],\r
                                                                              False)\r
         if CommentType and CommentString:\r
-            pass                      \r
-                     \r
+            pass\r
+\r
         if PcdTypeItem == 'FeaturePcd':\r
             CommentItemUsage = DT.USAGE_ITEM_CONSUMES\r
-            if CommentItemHelpText == None:\r
+            if CommentItemHelpText is None:\r
                 CommentItemHelpText = ''\r
-            \r
+\r
             if Count == 1:\r
                 FFEHelpText = CommentItemHelpText\r
             else:\r
                 FFEHelpText = FFEHelpText + DT.END_OF_LINE + CommentItemHelpText\r
-            \r
+\r
             if Count == len(CommentList):\r
                 CommentItemHelpText = FFEHelpText\r
                 BlockFlag = 4\r
             else:\r
                 continue\r
-                            \r
-        if CommentItemHelpText == None:\r
+\r
+        if CommentItemHelpText is None:\r
             CommentItemHelpText = ''\r
             if Count == len(CommentList) and CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 CommentItemHelpText = DT.END_OF_LINE\r
-                \r
+\r
         if Count == len(CommentList) and (BlockFlag == 1 or BlockFlag == 2):\r
             if CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 BlockFlag = 4\r
             else:\r
                 BlockFlag = 3\r
         elif BlockFlag == -1 and Count == len(CommentList):\r
-            BlockFlag = 4  \r
-            \r
+            BlockFlag = 4\r
+\r
         if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:\r
             if CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 if BlockFlag == -1:\r
@@ -122,30 +116,30 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
                     BlockFlag = 4\r
         #\r
         # Combine two comment line if they are generic comment\r
-        #   \r
+        #\r
         if CommentItemUsage == PreUsage == DT.ITEM_UNDEFINED:\r
             CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r
-            \r
+\r
             PreHelpText = CommentItemHelpText\r
-            \r
-        if BlockFlag == 4:     \r
+\r
+        if BlockFlag == 4:\r
             CommentItemIns = InfPcdItemCommentContent()\r
             CommentItemIns.SetUsageItem(CommentItemUsage)\r
             CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
             CommentInsList.append(CommentItemIns)\r
-            \r
+\r
             BlockFlag = -1\r
             PreUsage = None\r
             PreHelpText = ''\r
-            \r
+\r
         elif BlockFlag == 3:\r
             #\r
             # Add previous help string\r
-            # \r
+            #\r
             CommentItemIns = InfPcdItemCommentContent()\r
             CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
             if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r
-                PreHelpText += DT.END_OF_LINE            \r
+                PreHelpText += DT.END_OF_LINE\r
             CommentItemIns.SetHelpStringItem(PreHelpText)\r
             CommentInsList.append(CommentItemIns)\r
             #\r
@@ -155,47 +149,47 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
             CommentItemIns.SetUsageItem(CommentItemUsage)\r
             CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
             CommentInsList.append(CommentItemIns)\r
-            \r
+\r
             BlockFlag = -1\r
             PreUsage = None\r
-            PreHelpText = ''    \r
-                                                                            \r
+            PreHelpText = ''\r
+\r
         else:\r
             PreUsage = CommentItemUsage\r
             PreHelpText = CommentItemHelpText\r
-           \r
+\r
     PcdItemObj.SetHelpStringList(CommentInsList)\r
-    \r
-    return PcdItemObj               \r
+\r
+    return PcdItemObj\r
 \r
 class InfPcdItemCommentContent():\r
     def __init__(self):\r
         #\r
-        # ## SOMETIMES_CONSUMES ## HelpString \r
+        # ## SOMETIMES_CONSUMES ## HelpString\r
         #\r
         self.UsageItem = ''\r
         #\r
         # Help String\r
         #\r
         self.HelpStringItem = ''\r
-        \r
+\r
     def SetUsageItem(self, UsageItem):\r
         self.UsageItem = UsageItem\r
     def GetUsageItem(self):\r
         return self.UsageItem\r
-      \r
+\r
     def SetHelpStringItem(self, HelpStringItem):\r
         self.HelpStringItem = HelpStringItem\r
     def GetHelpStringItem(self):\r
         return self.HelpStringItem\r
-    \r
+\r
 ## InfPcdItem\r
 #\r
 # This class defined Pcd item used in Module files\r
 #\r
 # @param CName:                Input value for CName, default is ''\r
 # @param Token:                Input value for Token, default is ''\r
-# @param TokenSpaceGuidCName:  Input value for TokenSpaceGuidCName, default \r
+# @param TokenSpaceGuidCName:  Input value for TokenSpaceGuidCName, default\r
 #                              is ''\r
 # @param DatumType:            Input value for DatumType, default is ''\r
 # @param MaxDatumSize:         Input value for MaxDatumSize, default is ''\r
@@ -211,88 +205,94 @@ class InfPcdItem():
         self.Token = ''\r
         self.TokenSpaceGuidCName = ''\r
         self.TokenSpaceGuidValue = ''\r
-        self.DatumType      = ''\r
-        self.MaxDatumSize   = ''\r
-        self.DefaultValue   = ''\r
-        self.Offset         = ''\r
-        self.ValidUsage     = ''\r
-        self.ItemType       = '' \r
-        self.SupModuleList  = []\r
+        self.DatumType = ''\r
+        self.MaxDatumSize = ''\r
+        self.DefaultValue = ''\r
+        self.Offset = ''\r
+        self.ValidUsage = ''\r
+        self.ItemType = ''\r
+        self.SupModuleList = []\r
         self.HelpStringList = []\r
         self.FeatureFlagExp = ''\r
-        self.SupArchList    = []\r
+        self.SupArchList = []\r
         self.PcdErrorsList = []\r
-        \r
+\r
     def SetCName(self, CName):\r
-        self.CName = CName    \r
+        self.CName = CName\r
     def GetCName(self):\r
         return self.CName\r
-    \r
+\r
     def SetToken(self, Token):\r
-        self.Token = Token    \r
+        self.Token = Token\r
     def GetToken(self):\r
         return self.Token\r
-    \r
+\r
     def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):\r
-        self.TokenSpaceGuidCName = TokenSpaceGuidCName    \r
+        self.TokenSpaceGuidCName = TokenSpaceGuidCName\r
     def GetTokenSpaceGuidCName(self):\r
         return self.TokenSpaceGuidCName\r
-    \r
+\r
     def SetTokenSpaceGuidValue(self, TokenSpaceGuidValue):\r
-        self.TokenSpaceGuidValue = TokenSpaceGuidValue    \r
+        self.TokenSpaceGuidValue = TokenSpaceGuidValue\r
     def GetTokenSpaceGuidValue(self):\r
         return self.TokenSpaceGuidValue\r
-    \r
+\r
     def SetDatumType(self, DatumType):\r
-        self.DatumType = DatumType        \r
+        self.DatumType = DatumType\r
     def GetDatumType(self):\r
         return self.DatumType\r
-    \r
+\r
     def SetMaxDatumSize(self, MaxDatumSize):\r
-        self.MaxDatumSize = MaxDatumSize    \r
+        self.MaxDatumSize = MaxDatumSize\r
     def GetMaxDatumSize(self):\r
         return self.MaxDatumSize\r
 \r
     def SetDefaultValue(self, DefaultValue):\r
-        self.DefaultValue = DefaultValue        \r
+        self.DefaultValue = DefaultValue\r
     def GetDefaultValue(self):\r
         return self.DefaultValue\r
-    \r
+\r
     def SetPcdErrorsList(self, PcdErrorsList):\r
-        self.PcdErrorsList = PcdErrorsList    \r
+        self.PcdErrorsList = PcdErrorsList\r
     def GetPcdErrorsList(self):\r
         return self.PcdErrorsList\r
 \r
     def SetItemType(self, ItemType):\r
-        self.ItemType = ItemType        \r
+        self.ItemType = ItemType\r
     def GetItemType(self):\r
         return self.ItemType\r
 \r
     def SetSupModuleList(self, SupModuleList):\r
-        self.SupModuleList = SupModuleList      \r
+        self.SupModuleList = SupModuleList\r
     def GetSupModuleList(self):\r
         return self.SupModuleList\r
-    \r
+\r
     def SetHelpStringList(self, HelpStringList):\r
         self.HelpStringList = HelpStringList\r
     def GetHelpStringList(self):\r
         return self.HelpStringList\r
-    \r
+\r
     def SetFeatureFlagExp(self, FeatureFlagExp):\r
         self.FeatureFlagExp = FeatureFlagExp\r
     def GetFeatureFlagExp(self):\r
         return self.FeatureFlagExp\r
-    \r
+\r
     def SetSupportArchList(self, ArchList):\r
         self.SupArchList = ArchList\r
     def GetSupportArchList(self):\r
         return self.SupArchList\r
-    \r
+\r
     def SetOffset(self, Offset):\r
         self.Offset = Offset\r
     def GetOffset(self):\r
         return self.Offset\r
 \r
+    def SetValidUsage(self, ValidUsage):\r
+        self.ValidUsage = ValidUsage\r
+\r
+    def GetValidUsage(self):\r
+        return self.ValidUsage\r
+\r
 ##\r
 #\r
 #\r
@@ -301,13 +301,13 @@ class InfPcdObject():
     def __init__(self, FileName):\r
         self.Pcds = Sdict()\r
         self.FileName = FileName\r
-        \r
-    def SetPcds(self, PcdContent, KeysList = None, PackageInfo = None):\r
-        \r
+\r
+    def SetPcds(self, PcdContent, KeysList=None, PackageInfo=None):\r
+\r
         if GlobalData.gIS_BINARY_INF:\r
             self.SetAsBuildPcds(PcdContent, KeysList, PackageInfo)\r
             return True\r
-        \r
+\r
         #\r
         # Validate Arch\r
         #\r
@@ -316,40 +316,40 @@ class InfPcdObject():
         PcdTypeItem = ''\r
         for (PcdTypeItem1, ArchItem, LineNo) in KeysList:\r
             SupArchList, SupArchDict = ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList)\r
-             \r
+\r
             #\r
             # Validate PcdType\r
             #\r
-            if (PcdTypeItem1 == '' or PcdTypeItem1 == None):\r
+            if (PcdTypeItem1 == '' or PcdTypeItem1 is None):\r
                 return False\r
             else:\r
                 if not IsValidPcdType(PcdTypeItem1):\r
-                    Logger.Error("InfParser", \r
-                                 ToolError.FORMAT_INVALID, \r
-                                 ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR%(DT.PCD_USAGE_TYPE_LIST_OF_MODULE),\r
-                                 File=GlobalData.gINF_MODULE_NAME, \r
-                                 Line=LineNo, \r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR % (DT.PCD_USAGE_TYPE_LIST_OF_MODULE),\r
+                                 File=GlobalData.gINF_MODULE_NAME,\r
+                                 Line=LineNo,\r
                                  ExtraData=PcdTypeItem1)\r
                     return False\r
-            \r
+\r
             PcdTypeItem = PcdTypeItem1\r
-            \r
+\r
             for PcdItem in PcdContent:\r
                 PcdItemObj = InfPcdItem()\r
                 CommentList = PcdItem[1]\r
                 CurrentLineOfPcdItem = PcdItem[2]\r
                 PcdItem = PcdItem[0]\r
-                \r
-                if CommentList != None and len(CommentList) != 0:\r
+\r
+                if CommentList is not None and len(CommentList) != 0:\r
                     PcdItemObj = ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj)\r
                 else:\r
                     CommentItemIns = InfPcdItemCommentContent()\r
                     CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
                     PcdItemObj.SetHelpStringList([CommentItemIns])\r
-                \r
+\r
                 if len(PcdItem) >= 1 and len(PcdItem) <= 3:\r
                     PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)\r
-                    \r
+\r
                 if len(PcdItem) >= 2 and len(PcdItem) <= 3:\r
                     #\r
                     # Contain PcdName and Value, validate value.\r
@@ -357,13 +357,13 @@ class InfPcdObject():
                     if IsValidPcdValue(PcdItem[1]) or PcdItem[1].strip() == "":\r
                         PcdItemObj.SetDefaultValue(PcdItem[1])\r
                     else:\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
                                      ST.ERR_INF_PARSER_PCD_VALUE_INVALID,\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=PcdItem[1])\r
-                \r
+\r
                 if len(PcdItem) == 3:\r
                     #\r
                     # Contain PcdName, value, and FeatureFlag express\r
@@ -372,40 +372,40 @@ class InfPcdObject():
                     # Validate Feature Flag Express\r
                     #\r
                     if PcdItem[2].strip() == '':\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=CurrentLineOfPcdItem[0])\r
                     #\r
-                    # Validate FFE    \r
+                    # Validate FFE\r
                     #\r
                     FeatureFlagRtv = IsValidFeatureFlagExp(PcdItem[2].strip())\r
                     if not FeatureFlagRtv[0]:\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
-                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=CurrentLineOfPcdItem[0])\r
                     PcdItemObj.SetFeatureFlagExp(PcdItem[2])\r
-                \r
+\r
                 if len(PcdItem) < 1 or len(PcdItem) > 3:\r
-                    Logger.Error("InfParser", \r
-                                 ToolError.FORMAT_INVALID, \r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
                                  ST.ERR_INF_PARSER_PCD_SECTION_CONTENT_ERROR,\r
-                                 File=CurrentLineOfPcdItem[2], \r
-                                 Line=CurrentLineOfPcdItem[1], \r
+                                 File=CurrentLineOfPcdItem[2],\r
+                                 Line=CurrentLineOfPcdItem[1],\r
                                  ExtraData=CurrentLineOfPcdItem[0])\r
-                    return False       \r
-                \r
+                    return False\r
+\r
                 if PcdTypeItem.upper != DT.TAB_INF_FEATURE_PCD.upper():\r
                     PcdItemObj.SetSupportArchList(SupArchDict[PcdTypeItem])\r
                 else:\r
                     PcdItemObj.SetSupportArchList(SupArchList)\r
-                \r
-                if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):           \r
+\r
+                if (PcdTypeItem, PcdItemObj) in self.Pcds:\r
                     PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]\r
                     PcdsList.append(PcdItemObj)\r
                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
@@ -413,58 +413,66 @@ class InfPcdObject():
                     PcdsList = []\r
                     PcdsList.append(PcdItemObj)\r
                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
-            \r
+\r
         return True\r
-    \r
-    def SetAsBuildPcds(self, PcdContent, KeysList = None, PackageInfo = None):\r
+\r
+    def SetAsBuildPcds(self, PcdContent, KeysList=None, PackageInfo=None):\r
         for PcdItem in PcdContent:\r
             PcdItemObj = InfPcdItem()\r
             CommentList = PcdItem[1]\r
             CurrentLineOfPcdItem = PcdItem[2]\r
             PcdItem = PcdItem[0]\r
             CommentString = ''\r
-            for CommmentLine in CommentList:\r
-                CommentString += GetHelpStringByRemoveHashKey(CommmentLine)\r
-            \r
-            PcdItemObj.SetHelpStringList(CommentString)\r
+\r
+            for CommentLine in CommentList:\r
+                CommentString = GetHelpStringByRemoveHashKey(CommentLine)\r
+                CommentItemIns = InfPcdItemCommentContent()\r
+                CommentItemIns.SetHelpStringItem(CommentString)\r
+                CommentItemIns.SetUsageItem(CommentString)\r
+                PcdItemObj.SetHelpStringList(PcdItemObj.GetHelpStringList() + [CommentItemIns])\r
+                if PcdItemObj.GetValidUsage():\r
+                    PcdItemObj.SetValidUsage(PcdItemObj.GetValidUsage() + DT.TAB_VALUE_SPLIT + CommentString)\r
+                else:\r
+                    PcdItemObj.SetValidUsage(CommentString)\r
+\r
             PcdItemObj.SetItemType(KeysList[0][0])\r
             #\r
             # Set PcdTokenSpaceCName and CName\r
             #\r
-            PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)           \r
+            PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)\r
             #\r
-            # Set Value/DatumType/MaxDatumSize/Token\r
+            # Set Value/DatumType/OffSet/Token\r
             #\r
-            PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem, \r
-                                                      CurrentLineOfPcdItem, \r
+            PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem,\r
+                                                      CurrentLineOfPcdItem,\r
                                                       PcdItemObj,\r
                                                       KeysList[0][1],\r
                                                       PackageInfo)\r
-        \r
+\r
             PcdTypeItem = KeysList[0][0]\r
-            if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):           \r
+            if (PcdTypeItem, PcdItemObj) in self.Pcds:\r
                 PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]\r
                 PcdsList.append(PcdItemObj)\r
                 self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
             else:\r
                 PcdsList = []\r
                 PcdsList.append(PcdItemObj)\r
-                self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList            \r
-  \r
+                self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
+\r
     def GetPcds(self):\r
         return self.Pcds\r
 \r
 def ParserPcdInfoInDec(String):\r
     ValueList = GetSplitValueList(String, DT.TAB_VALUE_SPLIT, 3)\r
-    \r
+\r
     #\r
     # DatumType, Token\r
     #\r
     return ValueList[2], ValueList[3]\r
 \r
-def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo = None):\r
+def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo=None):\r
     #\r
-    # Package information not been generated currently, we need to parser INF file to get information. \r
+    # Package information not been generated currently, we need to parser INF file to get information.\r
     #\r
     if not PackageInfo:\r
         PackageInfo = []\r
@@ -484,10 +492,16 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
         # Open DEC file to get information\r
         #\r
         FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gWORKSPACE, PackageName)))\r
-        \r
-        DecParser = Dec(FullFileName)\r
+\r
+        DecParser = None\r
+        if FullFileName not in GlobalData.gPackageDict:\r
+            DecParser = Dec(FullFileName)\r
+            GlobalData.gPackageDict[FullFileName] = DecParser\r
+        else:\r
+            DecParser = GlobalData.gPackageDict[FullFileName]\r
+\r
         #\r
-        # Find PCD information.               \r
+        # Find PCD information.\r
         #\r
         DecPcdsDict = DecParser.GetPcdSectionObject().ValueDict\r
         for Key in DecPcdsDict.keys():\r
@@ -499,7 +513,8 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                         PcdItemObj.SetToken(PcdInDec.TokenValue)\r
                         PcdItemObj.SetDatumType(PcdInDec.DatumType)\r
                         PcdItemObj.SetSupportArchList([Arch])\r
-                        \r
+                        PcdItemObj.SetDefaultValue(PcdInDec.DefaultValue)\r
+\r
             if (Key[0] == 'PCDSPATCHABLEINMODULE' and PcdItemObj.GetItemType() == 'PatchPcd') and \\r
            (Key[1] == 'COMMON' or Key[1] == Arch):\r
                 for PcdInDec in DecPcdsDict[Key]:\r
@@ -507,11 +522,12 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                        PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:\r
                         PcdItemObj.SetToken(PcdInDec.TokenValue)\r
                         PcdItemObj.SetDatumType(PcdInDec.DatumType)\r
-                        PcdItemObj.SetSupportArchList([Arch]) \r
-        \r
+                        PcdItemObj.SetSupportArchList([Arch])\r
+\r
         if PcdItemObj.GetDatumType() == 'VOID*':\r
-            PcdItemObj.SetMaxDatumSize('%s'%(len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))\r
-                                                                     \r
+            if len(PcdItem) > 1:\r
+                PcdItemObj.SetMaxDatumSize('%s' % (len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))\r
+\r
         DecGuidsDict = DecParser.GetGuidSectionObject().ValueDict\r
         for Key in DecGuidsDict.keys():\r
             if Key == 'COMMON' or Key == Arch:\r
@@ -519,51 +535,64 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                     if GuidInDec.GuidCName == PcdItemObj.TokenSpaceGuidCName:\r
                         PcdItemObj.SetTokenSpaceGuidValue(GuidInDec.GuidString)\r
 \r
-    #\r
-    # Validate Value.\r
-    #\r
-    if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):         \r
-        PcdItemObj.SetDefaultValue(PcdItem[1])\r
-    else:\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
-                     ST.ERR_ASBUILD_PCD_VALUE_INVALID%("\"" + PcdItem[1] + "\"", "\"" + \r
-                                                       PcdItemObj.GetDatumType() + "\""),\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
-                     ExtraData=CurrentLineOfPcdItem[0])                \r
-    #\r
-    # validate offset\r
-    #\r
     if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():\r
-        if not IsHexDigitUINT32(PcdItem[2]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
-                         ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID%("\"" + PcdItem[2] + "\""),\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
-                         ExtraData=CurrentLineOfPcdItem[0])            \r
-        PcdItemObj.SetOffset(PcdItem[2])\r
-        \r
+        #\r
+        # Validate Value.\r
+        #\r
+        # convert the value from a decimal 0 to a formatted hex value.\r
+        if PcdItem[1] == "0":\r
+            DatumType = PcdItemObj.GetDatumType()\r
+            if DatumType == "UINT8":\r
+                PcdItem[1] = "0x00"\r
+            if DatumType == "UINT16":\r
+                PcdItem[1] = "0x0000"\r
+            if DatumType == "UINT32":\r
+                PcdItem[1] = "0x00000000"\r
+            if DatumType == "UINT64":\r
+                PcdItem[1] = "0x0000000000000000"\r
+\r
+        if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):\r
+            PcdItemObj.SetDefaultValue(PcdItem[1])\r
+        else:\r
+            Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
+                     ST.ERR_ASBUILD_PCD_VALUE_INVALID % ("\"" + PcdItem[1] + "\"", "\"" +\r
+                                                       PcdItemObj.GetDatumType() + "\""),\r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
+                     ExtraData=CurrentLineOfPcdItem[0])\r
+        #\r
+        # validate offset\r
+        #\r
+        if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():\r
+            if not IsHexDigitUINT32(PcdItem[2]):\r
+                Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
+                         ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID % ("\"" + PcdItem[2] + "\""),\r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
+                         ExtraData=CurrentLineOfPcdItem[0])\r
+            PcdItemObj.SetOffset(PcdItem[2])\r
+\r
     if PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '':\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
-                     ST.ERR_ASBUILD_PCD_DECLARITION_MISS%("\"" + PcdItem[0] + "\""),\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
+        Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
+                     ST.ERR_ASBUILD_PCD_DECLARITION_MISS % ("\"" + PcdItem[0] + "\""),\r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
                      ExtraData=CurrentLineOfPcdItem[0])\r
-        \r
+\r
     return PcdItemObj\r
 \r
 def ValidatePcdValueOnDatumType(Value, Type):\r
-    \r
+\r
     Value = Value.strip()\r
     #\r
     # Boolean type only allow 0x00 or 0x01 as value per INF spec\r
     #\r
     if Type == 'BOOLEAN':\r
         if not (Value == '0x00' or Value == '0x01'):\r
-            return False    \r
+            return False\r
     elif Type == 'VOID*':\r
         if not Value.startswith("{"):\r
             return False\r
@@ -572,23 +601,23 @@ def ValidatePcdValueOnDatumType(Value, Type):
         #\r
         # Strip "{" at head and "}" at tail.\r
         #\r
-        Value = Value[1:-1] \r
+        Value = Value[1:-1]\r
         ValueList = GetSplitValueList(Value, DT.TAB_COMMA_SPLIT)\r
-        \r
+\r
         ReIsValidHexByte = re.compile("^0x[0-9a-f]{1,2}$", re.IGNORECASE)\r
         for ValueItem in ValueList:\r
             if not ReIsValidHexByte.match(ValueItem):\r
                 return False\r
-        \r
+\r
     elif Type == 'UINT8' or Type == 'UINT16' or Type == 'UINT32' or Type == 'UINT64':\r
-        \r
+\r
         ReIsValidUint8z = re.compile('^0[x|X][a-fA-F0-9]{2}$')\r
         ReIsValidUint16z = re.compile('^0[x|X][a-fA-F0-9]{4}$')\r
         ReIsValidUint32z = re.compile('^0[x|X][a-fA-F0-9]{8}$')\r
         ReIsValidUint64z = re.compile('^0[x|X][a-fA-F0-9]{16}$')\r
-        \r
+\r
         if not ReIsValidUint8z.match(Value) and Type == 'UINT8':\r
-            return False  \r
+            return False\r
         elif not ReIsValidUint16z.match(Value) and  Type == 'UINT16':\r
             return False\r
         elif not ReIsValidUint32z.match(Value) and  Type == 'UINT32':\r
@@ -600,41 +629,41 @@ def ValidatePcdValueOnDatumType(Value, Type):
         # Since we assume the DEC file always correct, should never go to here.\r
         #\r
         pass\r
-    \r
-    return True    \r
\r
+\r
+    return True\r
+\r
 def SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj):\r
     #\r
-    # Only PCD Name specified \r
+    # Only PCD Name specified\r
     # <PcdName> ::= <TokenSpaceGuidCName> "." <TokenCName>\r
     #\r
     PcdId = GetSplitValueList(PcdItem[0], DT.TAB_SPLIT)\r
-    if len(PcdId) != 2:                       \r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
+    if len(PcdId) != 2:\r
+        Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
                      ST.ERR_INF_PARSER_PCD_NAME_FORMAT_ERROR,\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
                      ExtraData=CurrentLineOfPcdItem[0])\r
     else:\r
         #\r
         # Validate PcdTokenSpaceGuidCName\r
         #\r
         if not IsValidCVariableName(PcdId[0]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
+            Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_PCD_CVAR_GUID,\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
                          ExtraData=PcdId[0])\r
         if not IsValidCVariableName(PcdId[1]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
+            Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_PCD_CVAR_PCDCNAME,\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
                          ExtraData=PcdId[1])\r
         PcdItemObj.SetTokenSpaceGuidCName(PcdId[0])\r
         PcdItemObj.SetCName(PcdId[1])\r
-    \r
-    return PcdItemObj      
\ No newline at end of file
+\r
+    return PcdItemObj\r