Home | History | Annotate | Download | only in Parser
      1 ## @file

      2 # This file is used to define class objects of INF file [Pcds] section. 

      3 # It will consumed by InfParser. 

      4 #

      5 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>

      6 #

      7 # This program and the accompanying materials are licensed and made available 

      8 # under the terms and conditions of the BSD License which accompanies this 

      9 # distribution. The full text of the license may be found at 

     10 # http://opensource.org/licenses/bsd-license.php

     11 #

     12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     14 
     15 '''
     16 InfPcdObject
     17 '''
     18 import os
     19 import re
     20 
     21 from Logger import StringTable as ST
     22 from Logger import ToolError
     23 import Logger.Log as Logger
     24 from Library import GlobalData
     25 from Library import DataType as DT
     26 
     27 from Library.Misc import Sdict
     28 from Library.Misc import GetHelpStringByRemoveHashKey
     29 from Library.ParserValidate import IsValidPcdType
     30 from Library.ParserValidate import IsValidCVariableName
     31 from Library.ParserValidate import IsValidPcdValue
     32 from Library.ParserValidate import IsValidArch
     33 from Library.CommentParsing import ParseComment
     34 from Library.String import GetSplitValueList
     35 from Library.String import IsHexDigitUINT32
     36 from Library.ExpressionValidate import IsValidFeatureFlagExp
     37 from Parser.InfAsBuiltProcess import GetPackageListInfo
     38 from Parser.DecParser import Dec
     39 
     40 from Object.Parser.InfPackagesObject import InfPackageItem
     41 
     42 def ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList):
     43     #

     44     # Validate Arch

     45     #            

     46     if (ArchItem == '' or ArchItem == None):
     47         ArchItem = 'COMMON'
     48 
     49     if PcdTypeItem1.upper != DT.TAB_INF_FEATURE_PCD.upper():
     50         ArchList = GetSplitValueList(ArchItem, ' ')
     51         for ArchItemNew in ArchList:
     52             if not IsValidArch(ArchItemNew):
     53                 Logger.Error("InfParser",
     54                              ToolError.FORMAT_INVALID,
     55                              ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (ArchItemNew),
     56                              File=GlobalData.gINF_MODULE_NAME,
     57                              Line=LineNo,
     58                              ExtraData=ArchItemNew)
     59         SupArchDict[PcdTypeItem1] = ArchList
     60     else:
     61         SupArchList.append(ArchItem)
     62 
     63     return SupArchList, SupArchDict
     64 
     65 def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
     66     CommentInsList = []
     67     PreUsage = None
     68     PreHelpText = ''
     69     BlockFlag = -1
     70     FFEHelpText = ''
     71     CommentItemHelpText = ''
     72     Count = 0
     73     for CommentItem in CommentList:
     74         Count = Count + 1
     75         CommentItemUsage, CommentType, CommentString, CommentItemHelpText = ParseComment(CommentItem,
     76                                                                              DT.ALL_USAGE_TOKENS,
     77                                                                              {},
     78                                                                              [],
     79                                                                              False)
     80         if CommentType and CommentString:
     81             pass
     82 
     83         if PcdTypeItem == 'FeaturePcd':
     84             CommentItemUsage = DT.USAGE_ITEM_CONSUMES
     85             if CommentItemHelpText == None:
     86                 CommentItemHelpText = ''
     87 
     88             if Count == 1:
     89                 FFEHelpText = CommentItemHelpText
     90             else:
     91                 FFEHelpText = FFEHelpText + DT.END_OF_LINE + CommentItemHelpText
     92 
     93             if Count == len(CommentList):
     94                 CommentItemHelpText = FFEHelpText
     95                 BlockFlag = 4
     96             else:
     97                 continue
     98 
     99         if CommentItemHelpText == None:
    100             CommentItemHelpText = ''
    101             if Count == len(CommentList) and CommentItemUsage == DT.ITEM_UNDEFINED:
    102                 CommentItemHelpText = DT.END_OF_LINE
    103 
    104         if Count == len(CommentList) and (BlockFlag == 1 or BlockFlag == 2):
    105             if CommentItemUsage == DT.ITEM_UNDEFINED:
    106                 BlockFlag = 4
    107             else:
    108                 BlockFlag = 3
    109         elif BlockFlag == -1 and Count == len(CommentList):
    110             BlockFlag = 4
    111 
    112         if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:
    113             if CommentItemUsage == DT.ITEM_UNDEFINED:
    114                 if BlockFlag == -1:
    115                     BlockFlag = 1
    116                 elif BlockFlag == 1:
    117                     BlockFlag = 2
    118             else:
    119                 if BlockFlag == 1 or BlockFlag == 2:
    120                     BlockFlag = 3
    121                 elif BlockFlag == -1:
    122                     BlockFlag = 4
    123         #

    124         # Combine two comment line if they are generic comment

    125         #   

    126         if CommentItemUsage == PreUsage == DT.ITEM_UNDEFINED:
    127             CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText
    128 
    129             PreHelpText = CommentItemHelpText
    130 
    131         if BlockFlag == 4:
    132             CommentItemIns = InfPcdItemCommentContent()
    133             CommentItemIns.SetUsageItem(CommentItemUsage)
    134             CommentItemIns.SetHelpStringItem(CommentItemHelpText)
    135             CommentInsList.append(CommentItemIns)
    136 
    137             BlockFlag = -1
    138             PreUsage = None
    139             PreHelpText = ''
    140 
    141         elif BlockFlag == 3:
    142             #

    143             # Add previous help string

    144             # 

    145             CommentItemIns = InfPcdItemCommentContent()
    146             CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)
    147             if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):
    148                 PreHelpText += DT.END_OF_LINE
    149             CommentItemIns.SetHelpStringItem(PreHelpText)
    150             CommentInsList.append(CommentItemIns)
    151             #

    152             # Add Current help string

    153             #

    154             CommentItemIns = InfPcdItemCommentContent()
    155             CommentItemIns.SetUsageItem(CommentItemUsage)
    156             CommentItemIns.SetHelpStringItem(CommentItemHelpText)
    157             CommentInsList.append(CommentItemIns)
    158 
    159             BlockFlag = -1
    160             PreUsage = None
    161             PreHelpText = ''
    162 
    163         else:
    164             PreUsage = CommentItemUsage
    165             PreHelpText = CommentItemHelpText
    166 
    167     PcdItemObj.SetHelpStringList(CommentInsList)
    168 
    169     return PcdItemObj
    170 
    171 class InfPcdItemCommentContent():
    172     def __init__(self):
    173         #

    174         # ## SOMETIMES_CONSUMES ## HelpString 

    175         #

    176         self.UsageItem = ''
    177         #

    178         # Help String

    179         #

    180         self.HelpStringItem = ''
    181 
    182     def SetUsageItem(self, UsageItem):
    183         self.UsageItem = UsageItem
    184     def GetUsageItem(self):
    185         return self.UsageItem
    186 
    187     def SetHelpStringItem(self, HelpStringItem):
    188         self.HelpStringItem = HelpStringItem
    189     def GetHelpStringItem(self):
    190         return self.HelpStringItem
    191 
    192 ## InfPcdItem

    193 #

    194 # This class defined Pcd item used in Module files

    195 #

    196 # @param CName:                Input value for CName, default is ''

    197 # @param Token:                Input value for Token, default is ''

    198 # @param TokenSpaceGuidCName:  Input value for TokenSpaceGuidCName, default 

    199 #                              is ''

    200 # @param DatumType:            Input value for DatumType, default is ''

    201 # @param MaxDatumSize:         Input value for MaxDatumSize, default is ''

    202 # @param DefaultValue:         Input value for DefaultValue, default is ''

    203 # @param ItemType:             Input value for ItemType, default is ''

    204 # @param ValidUsage:           Input value for ValidUsage, default is []

    205 # @param SkuInfoList:          Input value for SkuInfoList, default is {}

    206 # @param SupModuleList:        Input value for SupModuleList, default is []

    207 #

    208 class InfPcdItem():
    209     def __init__(self):
    210         self.CName = ''
    211         self.Token = ''
    212         self.TokenSpaceGuidCName = ''
    213         self.TokenSpaceGuidValue = ''
    214         self.DatumType = ''
    215         self.MaxDatumSize = ''
    216         self.DefaultValue = ''
    217         self.Offset = ''
    218         self.ValidUsage = ''
    219         self.ItemType = ''
    220         self.SupModuleList = []
    221         self.HelpStringList = []
    222         self.FeatureFlagExp = ''
    223         self.SupArchList = []
    224         self.PcdErrorsList = []
    225 
    226     def SetCName(self, CName):
    227         self.CName = CName
    228     def GetCName(self):
    229         return self.CName
    230 
    231     def SetToken(self, Token):
    232         self.Token = Token
    233     def GetToken(self):
    234         return self.Token
    235 
    236     def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):
    237         self.TokenSpaceGuidCName = TokenSpaceGuidCName
    238     def GetTokenSpaceGuidCName(self):
    239         return self.TokenSpaceGuidCName
    240 
    241     def SetTokenSpaceGuidValue(self, TokenSpaceGuidValue):
    242         self.TokenSpaceGuidValue = TokenSpaceGuidValue
    243     def GetTokenSpaceGuidValue(self):
    244         return self.TokenSpaceGuidValue
    245 
    246     def SetDatumType(self, DatumType):
    247         self.DatumType = DatumType
    248     def GetDatumType(self):
    249         return self.DatumType
    250 
    251     def SetMaxDatumSize(self, MaxDatumSize):
    252         self.MaxDatumSize = MaxDatumSize
    253     def GetMaxDatumSize(self):
    254         return self.MaxDatumSize
    255 
    256     def SetDefaultValue(self, DefaultValue):
    257         self.DefaultValue = DefaultValue
    258     def GetDefaultValue(self):
    259         return self.DefaultValue
    260 
    261     def SetPcdErrorsList(self, PcdErrorsList):
    262         self.PcdErrorsList = PcdErrorsList
    263     def GetPcdErrorsList(self):
    264         return self.PcdErrorsList
    265 
    266     def SetItemType(self, ItemType):
    267         self.ItemType = ItemType
    268     def GetItemType(self):
    269         return self.ItemType
    270 
    271     def SetSupModuleList(self, SupModuleList):
    272         self.SupModuleList = SupModuleList
    273     def GetSupModuleList(self):
    274         return self.SupModuleList
    275 
    276     def SetHelpStringList(self, HelpStringList):
    277         self.HelpStringList = HelpStringList
    278     def GetHelpStringList(self):
    279         return self.HelpStringList
    280 
    281     def SetFeatureFlagExp(self, FeatureFlagExp):
    282         self.FeatureFlagExp = FeatureFlagExp
    283     def GetFeatureFlagExp(self):
    284         return self.FeatureFlagExp
    285 
    286     def SetSupportArchList(self, ArchList):
    287         self.SupArchList = ArchList
    288     def GetSupportArchList(self):
    289         return self.SupArchList
    290 
    291     def SetOffset(self, Offset):
    292         self.Offset = Offset
    293     def GetOffset(self):
    294         return self.Offset
    295 
    296     def SetValidUsage(self, ValidUsage):
    297         self.ValidUsage = ValidUsage
    298 
    299     def GetValidUsage(self):
    300         return self.ValidUsage
    301 
    302 ##

    303 #

    304 #

    305 #

    306 class InfPcdObject():
    307     def __init__(self, FileName):
    308         self.Pcds = Sdict()
    309         self.FileName = FileName
    310 
    311     def SetPcds(self, PcdContent, KeysList=None, PackageInfo=None):
    312 
    313         if GlobalData.gIS_BINARY_INF:
    314             self.SetAsBuildPcds(PcdContent, KeysList, PackageInfo)
    315             return True
    316 
    317         #

    318         # Validate Arch

    319         #

    320         SupArchList = []
    321         SupArchDict = {}
    322         PcdTypeItem = ''
    323         for (PcdTypeItem1, ArchItem, LineNo) in KeysList:
    324             SupArchList, SupArchDict = ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList)
    325 
    326             #

    327             # Validate PcdType

    328             #

    329             if (PcdTypeItem1 == '' or PcdTypeItem1 == None):
    330                 return False
    331             else:
    332                 if not IsValidPcdType(PcdTypeItem1):
    333                     Logger.Error("InfParser",
    334                                  ToolError.FORMAT_INVALID,
    335                                  ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR % (DT.PCD_USAGE_TYPE_LIST_OF_MODULE),
    336                                  File=GlobalData.gINF_MODULE_NAME,
    337                                  Line=LineNo,
    338                                  ExtraData=PcdTypeItem1)
    339                     return False
    340 
    341             PcdTypeItem = PcdTypeItem1
    342 
    343             for PcdItem in PcdContent:
    344                 PcdItemObj = InfPcdItem()
    345                 CommentList = PcdItem[1]
    346                 CurrentLineOfPcdItem = PcdItem[2]
    347                 PcdItem = PcdItem[0]
    348 
    349                 if CommentList != None and len(CommentList) != 0:
    350                     PcdItemObj = ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj)
    351                 else:
    352                     CommentItemIns = InfPcdItemCommentContent()
    353                     CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)
    354                     PcdItemObj.SetHelpStringList([CommentItemIns])
    355 
    356                 if len(PcdItem) >= 1 and len(PcdItem) <= 3:
    357                     PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)
    358 
    359                 if len(PcdItem) >= 2 and len(PcdItem) <= 3:
    360                     #

    361                     # Contain PcdName and Value, validate value.

    362                     #

    363                     if IsValidPcdValue(PcdItem[1]) or PcdItem[1].strip() == "":
    364                         PcdItemObj.SetDefaultValue(PcdItem[1])
    365                     else:
    366                         Logger.Error("InfParser",
    367                                      ToolError.FORMAT_INVALID,
    368                                      ST.ERR_INF_PARSER_PCD_VALUE_INVALID,
    369                                      File=CurrentLineOfPcdItem[2],
    370                                      Line=CurrentLineOfPcdItem[1],
    371                                      ExtraData=PcdItem[1])
    372 
    373                 if len(PcdItem) == 3:
    374                     #

    375                     # Contain PcdName, value, and FeatureFlag express

    376                     #

    377                     #

    378                     # Validate Feature Flag Express

    379                     #

    380                     if PcdItem[2].strip() == '':
    381                         Logger.Error("InfParser",
    382                                      ToolError.FORMAT_INVALID,
    383                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,
    384                                      File=CurrentLineOfPcdItem[2],
    385                                      Line=CurrentLineOfPcdItem[1],
    386                                      ExtraData=CurrentLineOfPcdItem[0])
    387                     #

    388                     # Validate FFE    

    389                     #

    390                     FeatureFlagRtv = IsValidFeatureFlagExp(PcdItem[2].strip())
    391                     if not FeatureFlagRtv[0]:
    392                         Logger.Error("InfParser",
    393                                      ToolError.FORMAT_INVALID,
    394                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),
    395                                      File=CurrentLineOfPcdItem[2],
    396                                      Line=CurrentLineOfPcdItem[1],
    397                                      ExtraData=CurrentLineOfPcdItem[0])
    398                     PcdItemObj.SetFeatureFlagExp(PcdItem[2])
    399 
    400                 if len(PcdItem) < 1 or len(PcdItem) > 3:
    401                     Logger.Error("InfParser",
    402                                  ToolError.FORMAT_INVALID,
    403                                  ST.ERR_INF_PARSER_PCD_SECTION_CONTENT_ERROR,
    404                                  File=CurrentLineOfPcdItem[2],
    405                                  Line=CurrentLineOfPcdItem[1],
    406                                  ExtraData=CurrentLineOfPcdItem[0])
    407                     return False
    408 
    409                 if PcdTypeItem.upper != DT.TAB_INF_FEATURE_PCD.upper():
    410                     PcdItemObj.SetSupportArchList(SupArchDict[PcdTypeItem])
    411                 else:
    412                     PcdItemObj.SetSupportArchList(SupArchList)
    413 
    414                 if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):
    415                     PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]
    416                     PcdsList.append(PcdItemObj)
    417                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList
    418                 else:
    419                     PcdsList = []
    420                     PcdsList.append(PcdItemObj)
    421                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList
    422 
    423         return True
    424 
    425     def SetAsBuildPcds(self, PcdContent, KeysList=None, PackageInfo=None):
    426         for PcdItem in PcdContent:
    427             PcdItemObj = InfPcdItem()
    428             CommentList = PcdItem[1]
    429             CurrentLineOfPcdItem = PcdItem[2]
    430             PcdItem = PcdItem[0]
    431             CommentString = ''
    432 
    433             for CommentLine in CommentList:
    434                 CommentString = GetHelpStringByRemoveHashKey(CommentLine)
    435                 CommentItemIns = InfPcdItemCommentContent()
    436                 CommentItemIns.SetHelpStringItem(CommentString)
    437                 CommentItemIns.SetUsageItem(CommentString)
    438                 PcdItemObj.SetHelpStringList(PcdItemObj.GetHelpStringList() + [CommentItemIns])
    439                 if PcdItemObj.GetValidUsage():
    440                     PcdItemObj.SetValidUsage(PcdItemObj.GetValidUsage() + DT.TAB_VALUE_SPLIT + CommentString)
    441                 else:
    442                     PcdItemObj.SetValidUsage(CommentString)
    443 
    444             PcdItemObj.SetItemType(KeysList[0][0])
    445             #

    446             # Set PcdTokenSpaceCName and CName

    447             #

    448             PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)
    449             #

    450             # Set Value/DatumType/OffSet/Token

    451             #

    452             PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem,
    453                                                       CurrentLineOfPcdItem,
    454                                                       PcdItemObj,
    455                                                       KeysList[0][1],
    456                                                       PackageInfo)
    457 
    458             PcdTypeItem = KeysList[0][0]
    459             if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):
    460                 PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]
    461                 PcdsList.append(PcdItemObj)
    462                 self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList
    463             else:
    464                 PcdsList = []
    465                 PcdsList.append(PcdItemObj)
    466                 self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList
    467 
    468     def GetPcds(self):
    469         return self.Pcds
    470 
    471 def ParserPcdInfoInDec(String):
    472     ValueList = GetSplitValueList(String, DT.TAB_VALUE_SPLIT, 3)
    473 
    474     #

    475     # DatumType, Token

    476     #

    477     return ValueList[2], ValueList[3]
    478 
    479 def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo=None):
    480     #

    481     # Package information not been generated currently, we need to parser INF file to get information. 

    482     #

    483     if not PackageInfo:
    484         PackageInfo = []
    485         InfFileName = CurrentLineOfPcdItem[2]
    486         PackageInfoList = GetPackageListInfo(InfFileName, GlobalData.gWORKSPACE, -1)
    487         for PackageInfoListItem in PackageInfoList:
    488             PackageInfoIns = InfPackageItem()
    489             PackageInfoIns.SetPackageName(PackageInfoListItem)
    490             PackageInfo.append(PackageInfoIns)
    491 
    492     PcdInfoInDecHasFound = False
    493     for PackageItem in PackageInfo:
    494         if PcdInfoInDecHasFound:
    495             break
    496         PackageName = PackageItem.PackageName
    497         #

    498         # Open DEC file to get information

    499         #

    500         FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gWORKSPACE, PackageName)))
    501 
    502         DecParser = None
    503         if FullFileName not in GlobalData.gPackageDict:
    504             DecParser = Dec(FullFileName)
    505             GlobalData.gPackageDict[FullFileName] = DecParser
    506         else:
    507             DecParser = GlobalData.gPackageDict[FullFileName]
    508 
    509         #

    510         # Find PCD information.               

    511         #

    512         DecPcdsDict = DecParser.GetPcdSectionObject().ValueDict
    513         for Key in DecPcdsDict.keys():
    514             if (Key[0] == 'PCDSDYNAMICEX' and PcdItemObj.GetItemType() == 'PcdEx') and \
    515                 (Key[1] == 'COMMON' or Key[1] == Arch):
    516                 for PcdInDec in DecPcdsDict[Key]:
    517                     if PcdInDec.TokenCName == PcdItemObj.CName and \
    518                        PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:
    519                         PcdItemObj.SetToken(PcdInDec.TokenValue)
    520                         PcdItemObj.SetDatumType(PcdInDec.DatumType)
    521                         PcdItemObj.SetSupportArchList([Arch])
    522                         PcdItemObj.SetDefaultValue(PcdInDec.DefaultValue)
    523 
    524             if (Key[0] == 'PCDSPATCHABLEINMODULE' and PcdItemObj.GetItemType() == 'PatchPcd') and \
    525            (Key[1] == 'COMMON' or Key[1] == Arch):
    526                 for PcdInDec in DecPcdsDict[Key]:
    527                     if PcdInDec.TokenCName == PcdItemObj.CName and \
    528                        PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:
    529                         PcdItemObj.SetToken(PcdInDec.TokenValue)
    530                         PcdItemObj.SetDatumType(PcdInDec.DatumType)
    531                         PcdItemObj.SetSupportArchList([Arch])
    532 
    533         if PcdItemObj.GetDatumType() == 'VOID*':
    534             if len(PcdItem) > 1:
    535                 PcdItemObj.SetMaxDatumSize('%s' % (len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))
    536 
    537         DecGuidsDict = DecParser.GetGuidSectionObject().ValueDict
    538         for Key in DecGuidsDict.keys():
    539             if Key == 'COMMON' or Key == Arch:
    540                 for GuidInDec in DecGuidsDict[Key]:
    541                     if GuidInDec.GuidCName == PcdItemObj.TokenSpaceGuidCName:
    542                         PcdItemObj.SetTokenSpaceGuidValue(GuidInDec.GuidString)
    543 
    544     if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():
    545         #

    546         # Validate Value.

    547         #

    548         # convert the value from a decimal 0 to a formatted hex value.

    549         if PcdItem[1] == "0":
    550             DatumType = PcdItemObj.GetDatumType()
    551             if DatumType == "UINT8":
    552                 PcdItem[1] = "0x00"
    553             if DatumType == "UINT16":
    554                 PcdItem[1] = "0x0000"
    555             if DatumType == "UINT32":
    556                 PcdItem[1] = "0x00000000"
    557             if DatumType == "UINT64":
    558                 PcdItem[1] = "0x0000000000000000"
    559 
    560         if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):
    561             PcdItemObj.SetDefaultValue(PcdItem[1])
    562         else:
    563             Logger.Error("InfParser",
    564                      ToolError.FORMAT_INVALID,
    565                      ST.ERR_ASBUILD_PCD_VALUE_INVALID % ("\"" + PcdItem[1] + "\"", "\"" +
    566                                                        PcdItemObj.GetDatumType() + "\""),
    567                      File=CurrentLineOfPcdItem[2],
    568                      Line=CurrentLineOfPcdItem[1],
    569                      ExtraData=CurrentLineOfPcdItem[0])
    570         #

    571         # validate offset

    572         #

    573         if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():
    574             if not IsHexDigitUINT32(PcdItem[2]):
    575                 Logger.Error("InfParser",
    576                          ToolError.FORMAT_INVALID,
    577                          ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID % ("\"" + PcdItem[2] + "\""),
    578                          File=CurrentLineOfPcdItem[2],
    579                          Line=CurrentLineOfPcdItem[1],
    580                          ExtraData=CurrentLineOfPcdItem[0])
    581             PcdItemObj.SetOffset(PcdItem[2])
    582 
    583     if PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '':
    584         Logger.Error("InfParser",
    585                      ToolError.FORMAT_INVALID,
    586                      ST.ERR_ASBUILD_PCD_DECLARITION_MISS % ("\"" + PcdItem[0] + "\""),
    587                      File=CurrentLineOfPcdItem[2],
    588                      Line=CurrentLineOfPcdItem[1],
    589                      ExtraData=CurrentLineOfPcdItem[0])
    590 
    591     return PcdItemObj
    592 
    593 def ValidatePcdValueOnDatumType(Value, Type):
    594 
    595     Value = Value.strip()
    596     #

    597     # Boolean type only allow 0x00 or 0x01 as value per INF spec

    598     #

    599     if Type == 'BOOLEAN':
    600         if not (Value == '0x00' or Value == '0x01'):
    601             return False
    602     elif Type == 'VOID*':
    603         if not Value.startswith("{"):
    604             return False
    605         if not Value.endswith("}"):
    606             return False
    607         #

    608         # Strip "{" at head and "}" at tail.

    609         #

    610         Value = Value[1:-1]
    611         ValueList = GetSplitValueList(Value, DT.TAB_COMMA_SPLIT)
    612 
    613         ReIsValidHexByte = re.compile("^0x[0-9a-f]{1,2}$", re.IGNORECASE)
    614         for ValueItem in ValueList:
    615             if not ReIsValidHexByte.match(ValueItem):
    616                 return False
    617 
    618     elif Type == 'UINT8' or Type == 'UINT16' or Type == 'UINT32' or Type == 'UINT64':
    619 
    620         ReIsValidUint8z = re.compile('^0[x|X][a-fA-F0-9]{2}$')
    621         ReIsValidUint16z = re.compile('^0[x|X][a-fA-F0-9]{4}$')
    622         ReIsValidUint32z = re.compile('^0[x|X][a-fA-F0-9]{8}$')
    623         ReIsValidUint64z = re.compile('^0[x|X][a-fA-F0-9]{16}$')
    624 
    625         if not ReIsValidUint8z.match(Value) and Type == 'UINT8':
    626             return False
    627         elif not ReIsValidUint16z.match(Value) and  Type == 'UINT16':
    628             return False
    629         elif not ReIsValidUint32z.match(Value) and  Type == 'UINT32':
    630             return False
    631         elif not ReIsValidUint64z.match(Value) and  Type == 'UINT64':
    632             return False
    633     else:
    634         #

    635         # Since we assume the DEC file always correct, should never go to here.

    636         #

    637         pass
    638 
    639     return True
    640 
    641 def SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj):
    642     #

    643     # Only PCD Name specified 

    644     # <PcdName> ::= <TokenSpaceGuidCName> "." <TokenCName>

    645     #

    646     PcdId = GetSplitValueList(PcdItem[0], DT.TAB_SPLIT)
    647     if len(PcdId) != 2:
    648         Logger.Error("InfParser",
    649                      ToolError.FORMAT_INVALID,
    650                      ST.ERR_INF_PARSER_PCD_NAME_FORMAT_ERROR,
    651                      File=CurrentLineOfPcdItem[2],
    652                      Line=CurrentLineOfPcdItem[1],
    653                      ExtraData=CurrentLineOfPcdItem[0])
    654     else:
    655         #

    656         # Validate PcdTokenSpaceGuidCName

    657         #

    658         if not IsValidCVariableName(PcdId[0]):
    659             Logger.Error("InfParser",
    660                          ToolError.FORMAT_INVALID,
    661                          ST.ERR_INF_PARSER_PCD_CVAR_GUID,
    662                          File=CurrentLineOfPcdItem[2],
    663                          Line=CurrentLineOfPcdItem[1],
    664                          ExtraData=PcdId[0])
    665         if not IsValidCVariableName(PcdId[1]):
    666             Logger.Error("InfParser",
    667                          ToolError.FORMAT_INVALID,
    668                          ST.ERR_INF_PARSER_PCD_CVAR_PCDCNAME,
    669                          File=CurrentLineOfPcdItem[2],
    670                          Line=CurrentLineOfPcdItem[1],
    671                          ExtraData=PcdId[1])
    672         PcdItemObj.SetTokenSpaceGuidCName(PcdId[0])
    673         PcdItemObj.SetCName(PcdId[1])
    674 
    675     return PcdItemObj
    676