## @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
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
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
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
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
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
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
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
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
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
# 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
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
# 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
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
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
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
#\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
# 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