Please ignore this patch, sorry for wrong sending. Thanks, Yuwei
> -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Yuwei > Chen > Sent: Thursday, April 1, 2021 3:04 PM > To: devel@edk2.groups.io > Cc: Liang, MingyueX <mingyuex.li...@intel.com>; Feng, Bob C > <bob.c.f...@intel.com>; Liming Gao <gaolim...@byosoft.com.cn> > Subject: [edk2-devel] [PATCH 1/1] BaseTools/Ecc: Update structpcd parsing > method. > > From: mliang2x <mingyuex.li...@intel.com> > > Update the pcdparser method in Dec and DSC files. > > Signed-off-by: Mingyue Liang <mingyuex.li...@intel.com> > Cc: Bob Feng <bob.c.f...@intel.com> > Cc: Liming Gao <gaolim...@byosoft.com.cn> > Cc: Yuwei Chen <yuwei.c...@intel.com> > --- > .../Ecc/MetaFileWorkspace/MetaFileParser.py | 464 ++++++++++-------- > 1 file changed, 265 insertions(+), 199 deletions(-) > > diff --git > a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py > b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py > index 9c27c8e16a05..588d3dbe6ed5 100644 > --- a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py > +++ > b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py > @@ -22,7 +22,7 @@ import Ecc.EccToolError as EccToolError from > CommonDataClass.DataClass import * from Common.DataType import * > from Common.StringUtils import * -from Common.Misc import > GuidStructureStringToGuidString, CheckPcdDatum, PathClass, > AnalyzePcdData > +from Common.Misc import GuidStructureStringToGuidString, > CheckPcdDatum, > +PathClass, AnalyzePcdData, AnalyzeDscPcd, AnalyzePcdExpression, > +ParseFieldValue, StructPattern > from Common.Expression import * > from CommonDataClass.Exceptions import * > > @@ -31,6 +31,8 @@ from GenFds.FdfParser import FdfParser from > Common.LongFilePathSupport import OpenLongFilePath as open from > Common.LongFilePathSupport import CodecOpenLongFilePath > > +CODEPattern = re.compile(r"{CODE\([a-fA-F0-9Xx\{\},\s]*\)}") > + > ## A decorator used to parse macro definition def ParseMacro(Parser): > def MacroParser(self): > @@ -174,6 +176,11 @@ class MetaFileParser(object): > # UNI object and extra UNI object > self._UniObj = None > self._UniExtraObj = None > + # StructPcd var > + self._PcdCodeValue = "" > + self._PcdDataTypeCODE = False > + self._CurrentPcdName = "" > + self._GuidDict = {} # for Parser PCD value > + {GUID(gTokeSpaceGuidName)} > > ## Store the parsed data in table > def _Store(self, *Args): > @@ -395,6 +402,40 @@ class MetaFileParser(object): > Macros.update(self._SectionsMacroDict[(self._SectionType, > Scope1, > Scope2)]) > return Macros > > + def ProcessMultipleLineCODEValue(self, Content): > + CODEBegin = False > + CODELine = "" > + continuelinecount = 0 > + newContent = [] > + for Index in range(0, len(Content)): > + Line = Content[Index] > + if CODEBegin: > + CODELine = CODELine + Line > + continuelinecount +=1 > + if ")}" in Line: > + newContent.append(CODELine) > + for _ in range(continuelinecount): > + newContent.append("") > + CODEBegin = False > + CODELine = "" > + continuelinecount = 0 > + else: > + if not Line: > + newContent.append(Line) > + continue > + if "{CODE(" not in Line: > + newContent.append(Line) > + continue > + elif CODEPattern.findall(Line): > + newContent.append(Line) > + continue > + else: > + CODEBegin = True > + CODELine = Line > + > + return newContent > + > + > _SectionParser = {} > Finished = property(_GetFinished, _SetFinished) > _Macros = property(_GetMacros) > @@ -812,6 +853,8 @@ class DscParser(MetaFileParser): > Content = open(str(self.MetaFile.Path), 'r').readlines() > except: > EdkLogger.error("Parser", FILE_READ_FAILURE, > ExtraData=self.MetaFile) > + > + Content = self.ProcessMultipleLineCODEValue(Content) > # > # Insert a record for file > # > @@ -1018,24 +1061,71 @@ class DscParser(MetaFileParser): > # > @ParseMacro > def _PcdParser(self): > + if self._PcdDataTypeCODE: > + self._PcdCodeValue = self._PcdCodeValue + "\n " + > self._CurrentLine > + if self._CurrentLine.endswith(")}"): > + self._CurrentLine = "|".join((self._CurrentPcdName, > self._PcdCodeValue)) > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._ValueList = None > + return > TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) > + self._CurrentPcdName = TokenList[0] > + if len(TokenList) == 2 and TokenList[1].strip().startswith("{CODE"): > + self._PcdDataTypeCODE = True > + self._PcdCodeValue = TokenList[1].strip() > + > + if self._PcdDataTypeCODE: > + if self._CurrentLine.endswith(")}"): > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._ValueList = None > + return > self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) > + PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT) > + if len(PcdNameTockens) == 2: > + self._ValueList[0], self._ValueList[1] = PcdNameTockens[0], > PcdNameTockens[1] > + elif len(PcdNameTockens) == 3: > + self._ValueList[0], self._ValueList[1] = > ".".join((PcdNameTockens[0], > PcdNameTockens[1])), PcdNameTockens[2] > + elif len(PcdNameTockens) > 3: > + self._ValueList[0], self._ValueList[1] = > + ".".join((PcdNameTockens[0], PcdNameTockens[1])), > + ".".join(PcdNameTockens[2:]) > if len(TokenList) == 2: > self._ValueList[2] = TokenList[1] > if self._ValueList[0] == '' or self._ValueList[1] == '': > EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or > PCD name specified", > ExtraData=self._CurrentLine + " > (<TokenSpaceGuidCName>.<TokenCName>|<PcdValue>)", > - File=self.MetaFile, Line=self._LineIndex+1) > + File=self.MetaFile, Line=self._LineIndex + > + 1) > if self._ValueList[2] == '': > + # > + # The PCD values are optional for FIXEDATBUILD, > PATCHABLEINMODULE, Dynamic/DynamicEx default > + # > + if self._SectionType in (MODEL_PCD_FIXED_AT_BUILD, > MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, > MODEL_PCD_DYNAMIC_EX_DEFAULT): > + return > EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given", > ExtraData=self._CurrentLine + " > (<TokenSpaceGuidCName>.<TokenCName>|<PcdValue>)", > - File=self.MetaFile, Line=self._LineIndex+1) > + File=self.MetaFile, Line=self._LineIndex + > + 1) > + > + # Validate the datum type of Dynamic Defaul PCD and DynamicEx > Default PCD > + ValueList = GetSplitValueList(self._ValueList[2]) > + if len(ValueList) > 1 and ValueList[1] in [TAB_UINT8, TAB_UINT16, > TAB_UINT32, TAB_UINT64] \ > + and self._ItemType in > [MODEL_PCD_DYNAMIC_DEFAULT, > MODEL_PCD_DYNAMIC_EX_DEFAULT]: > + EdkLogger.error('Parser', FORMAT_INVALID, "The datum type '%s' of > PCD is wrong" % ValueList[1], > + ExtraData=self._CurrentLine, > + File=self.MetaFile, Line=self._LineIndex + 1) > + > + # Validate the VariableName of DynamicHii and DynamicExHii for PCD > Entry must not be an empty string > + if self._ItemType in [MODEL_PCD_DYNAMIC_HII, > MODEL_PCD_DYNAMIC_EX_HII]: > + DscPcdValueList = GetSplitValueList(TokenList[1], > TAB_VALUE_SPLIT, > 1) > + if len(DscPcdValueList[0].replace('L', '').replace('"', > '').strip()) == 0: > + EdkLogger.error('Parser', FORMAT_INVALID, "The VariableName > field in the HII format PCD entry must not be an empty string", > + ExtraData=self._CurrentLine, > + File=self.MetaFile, Line=self._LineIndex + 1) > # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', > replace with > integer 1 or 0. > DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) > if DscPcdValueList[0] in ['True', 'true', 'TRUE']: > - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], > '1', 1); > + self._ValueList[2] = > + TokenList[1].replace(DscPcdValueList[0], '1', 1) > elif DscPcdValueList[0] in ['False', 'false', 'FALSE']: > - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], > '0', 1); > + self._ValueList[2] = > + TokenList[1].replace(DscPcdValueList[0], '0', 1) > > ## [components] section parser > @ParseMacro > @@ -1502,6 +1592,10 @@ class DecParser(MetaFileParser): > self._include_flag = False > self._package_flag = False > > + self._AllPCDs = [] # Only for check duplicate PCD > + self._AllPcdDict = {} > + > + > ## Parser starter > def Start(self): > Content = '' > @@ -1510,6 +1604,7 @@ class DecParser(MetaFileParser): > except: > EdkLogger.error("Parser", FILE_READ_FAILURE, > ExtraData=self.MetaFile) > > + Content = self.ProcessMultipleLineCODEValue(Content) > # > # Insert a record for file > # > @@ -1707,51 +1802,6 @@ class DecParser(MetaFileParser): > namelist[2] = ".".join((arrayindex,namelist[2])) > return namelist > > - def StructPcdParser(self): > - self._ValueList[0] = self._CurrentStructurePcdName > - > - if "|" not in self._CurrentLine: > - if "<HeaderFiles>" == self._CurrentLine: > - self._include_flag = True > - self._package_flag = False > - self._ValueList = None > - return > - if "<Packages>" == self._CurrentLine: > - self._package_flag = True > - self._ValueList = None > - self._include_flag = False > - return > - > - if self._include_flag: > - self._ValueList[1] = "<HeaderFiles>_" + > md5(self._CurrentLine.encode('utf-8')).hexdigest() > - self._ValueList[2] = self._CurrentLine > - if self._package_flag and "}" != self._CurrentLine: > - self._ValueList[1] = "<Packages>_" + > md5(self._CurrentLine.encode('utf-8')).hexdigest() > - self._ValueList[2] = self._CurrentLine > - if self._CurrentLine == "}": > - self._package_flag = False > - self._include_flag = False > - self._ValueList = None > - else: > - PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT) > - PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT)) > - if len(PcdNames) == 2: > - if PcdNames[1].strip().endswith("]"): > - PcdName = PcdNames[1][:PcdNames[1].index('[')] > - Index = PcdNames[1][PcdNames[1].index('['):] > - self._ValueList[0] = TAB_SPLIT.join((PcdNames[0], > PcdName)) > - self._ValueList[1] = Index > - self._ValueList[2] = PcdTockens[1] > - else: > - self._CurrentStructurePcdName = "" > - else: > - if self._CurrentStructurePcdName != > TAB_SPLIT.join(PcdNames[:2]): > - EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does > not > match: %s and %s " % ( > - self._CurrentStructurePcdName, > TAB_SPLIT.join(PcdNames[:2])), > - File=self.MetaFile, Line=self._LineIndex > + 1) > - self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:]) > - self._ValueList[2] = PcdTockens[1] > - > ## PCD sections parser > # > # [PcdsFixedAtBuild] > @@ -1763,159 +1813,175 @@ class DecParser(MetaFileParser): > @ParseMacro > def _PcdParser(self): > if self._CurrentStructurePcdName: > - self.StructPcdParser() > - return > - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) > - self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) > - # check PCD information > - if self._ValueList[0] == '' or self._ValueList[1] == '': > - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or > PCD name specified", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - # check PCD datum information > - if len(TokenList) < 2 or TokenList[1] == '': > - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum > information given", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - > - > - ValueRe = re.compile(r'^\s*L?\".*\|.*\"') > - PtrValue = ValueRe.findall(TokenList[1]) > - > - # Has VOID* type string, may contain "|" character in the string. > - if len(PtrValue) != 0: > - ptrValueList = re.sub(ValueRe, '', TokenList[1]) > - ValueList = GetSplitValueList(ptrValueList) > - ValueList[0] = PtrValue[0] > - else: > - ValueList = GetSplitValueList(TokenList[1]) > - > - > - # check if there's enough datum information given > - if len(ValueList) != 3: > - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum > information given", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - # check default value > - if ValueList[0] == '': > - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue > in > PCD Datum information", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - # check datum type > - if ValueList[1] == '': > - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in > PCD Datum information", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - # check token of the PCD > - if ValueList[2] == '': > - EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD > Datum information", > - ExtraData=self._CurrentLine + \ > - " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > - File=self.MetaFile, Line=self._LineIndex+1) > - # check format of default value against the datum type > - IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) > - if not IsValid: > - EdkLogger.error('Parser', FORMAT_INVALID, Cause, > ExtraData=self._CurrentLine, > - File=self.MetaFile, Line=self._LineIndex+1) > - if Cause == "StructurePcd": > - self._CurrentStructurePcdName = > TAB_SPLIT.join(self._ValueList[0:2]) > self._ValueList[0] = self._CurrentStructurePcdName > - self._ValueList[1] = ValueList[1].strip() > > - if EccGlobalData.gConfig.UniCheckPCDInfo == '1' or > EccGlobalData.gConfig.UniCheckAll == '1' or EccGlobalData.gConfig.CheckAll > == '1': > - # check Description, Prompt information > - PatternDesc = re.compile('##\s*([\x21-\x7E\s]*)', re.S) > - PatternPrompt = re.compile('#\s+@Prompt\s+([\x21-\x7E\s]*)', > re.S) > - Description = None > - Prompt = None > - # check @ValidRange, @ValidList and @Expression format valid > - ErrorCodeValid = '0x0 <= %s <= 0xFFFFFFFF' > - PatternValidRangeIn = '(NOT)?\s*(\d+\s*-\s*\d+|0[xX][a-fA-F0- > 9]+\s*-\s*0[xX][a-fA-F0-9]+|LT\s*\d+|LT\s*0[xX][a-fA-F0- > 9]+|GT\s*\d+|GT\s*0[xX][a-fA-F0-9]+|LE\s*\d+|LE\s*0[xX][a-fA-F0- > 9]+|GE\s*\d+|GE\s*0[xX][a-fA-F0-9]+|XOR\s*\d+|XOR\s*0[xX][a-fA-F0- > 9]+|EQ\s*\d+|EQ\s*0[xX][a-fA-F0-9]+)' > - PatternValidRng = re.compile('^' + '(NOT)?\s*' + > PatternValidRangeIn > + '$') > - for Comment in self._Comments: > - Comm = Comment[0].strip() > - if not Comm: > - continue > - if not Description: > - Description = PatternDesc.findall(Comm) > - if not Prompt: > - Prompt = PatternPrompt.findall(Comm) > - if Comm[0] == '#': > - ValidFormt = Comm.lstrip('#') > - ValidFormt = ValidFormt.lstrip() > - if ValidFormt[0:11] == '@ValidRange': > - ValidFormt = ValidFormt[11:] > - ValidFormt = ValidFormt.lstrip() > - try: > - ErrorCode, Expression = ValidFormt.split('|', 1) > - except ValueError: > - ErrorCode = '0x0' > - Expression = ValidFormt > - ErrorCode, Expression = ErrorCode.strip(), > Expression.strip() > - try: > - if not eval(ErrorCodeValid % ErrorCode): > - EdkLogger.warn('Parser', '@ValidRange > ErrorCode(%s) of > PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - except: > - EdkLogger.warn('Parser', '@ValidRange > ErrorCode(%s) of > PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - if not PatternValidRng.search(Expression): > - EdkLogger.warn('Parser', '@ValidRange > Expression(%s) of > PCD %s is incorrect format.' % (Expression, TokenList[0])) > - if ValidFormt[0:10] == '@ValidList': > - ValidFormt = ValidFormt[10:] > - ValidFormt = ValidFormt.lstrip() > - try: > - ErrorCode, Expression = ValidFormt.split('|', 1) > - except ValueError: > - ErrorCode = '0x0' > - Expression = ValidFormt > - ErrorCode, Expression = ErrorCode.strip(), > Expression.strip() > - try: > - if not eval(ErrorCodeValid % ErrorCode): > - EdkLogger.warn('Parser', '@ValidList > ErrorCode(%s) of > PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - except: > - EdkLogger.warn('Parser', '@ValidList > ErrorCode(%s) of PCD %s > is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - Values = Expression.split(',') > - for Value in Values: > - Value = Value.strip() > - try: > - eval(Value) > - except: > - EdkLogger.warn('Parser', '@ValidList > Expression of PCD %s > include a invalid value(%s).' % (TokenList[0], Value)) > - break > - if ValidFormt[0:11] == '@Expression': > - ValidFormt = ValidFormt[11:] > - ValidFormt = ValidFormt.lstrip() > - try: > - ErrorCode, Expression = ValidFormt.split('|', 1) > - except ValueError: > - ErrorCode = '0x0' > - Expression = ValidFormt > - ErrorCode, Expression = ErrorCode.strip(), > Expression.strip() > - try: > - if not eval(ErrorCodeValid % ErrorCode): > - EdkLogger.warn('Parser', '@Expression > ErrorCode(%s) of > PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - except: > - EdkLogger.warn('Parser', '@Expression > ErrorCode(%s) of > PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) > - if not Expression: > - EdkLogger.warn('Parser', '@Expression Expression > of PCD %s > is incorrect format.' % TokenList[0]) > - if not Description: > - EdkLogger.warn('Parser', 'PCD %s Description information is > not > provided.' % TokenList[0]) > - if not Prompt: > - EdkLogger.warn('Parser', 'PCD %s Prompt information is not > provided.' % TokenList[0]) > - # check Description, Prompt localization information > - if self._UniObj: > - self._UniObj.CheckPcdInfo(TokenList[0]) > + if "|" not in self._CurrentLine: > + if "<HeaderFiles>" == self._CurrentLine: > + self._include_flag = True > + self._package_flag = False > + self._ValueList = None > + return > + if "<Packages>" == self._CurrentLine: > + self._package_flag = True > + self._ValueList = None > + self._include_flag = False > + return > > - if ValueList[0] in ['True', 'true', 'TRUE']: > - ValueList[0] = '1' > - elif ValueList[0] in ['False', 'false', 'FALSE']: > - ValueList[0] = '0' > + if self._include_flag: > + self._ValueList[1] = "<HeaderFiles>_" + > md5(self._CurrentLine.encode('utf-8')).hexdigest() > + self._ValueList[2] = self._CurrentLine > + if self._package_flag and "}" != self._CurrentLine: > + self._ValueList[1] = "<Packages>_" + > md5(self._CurrentLine.encode('utf-8')).hexdigest() > + self._ValueList[2] = self._CurrentLine > + if self._CurrentLine == "}": > + self._package_flag = False > + self._include_flag = False > + self._ValueList = None > + return > + else: > + PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT) > + PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT)) > + if len(PcdNames) == 2: > + if PcdNames[1].strip().endswith("]"): > + PcdName = PcdNames[1][:PcdNames[1].index('[')] > + Index = PcdNames[1][PcdNames[1].index('['):] > + self._ValueList[0] = > TAB_SPLIT.join((PcdNames[0],PcdName)) > + self._ValueList[1] = Index > + self._ValueList[2] = PcdTockens[1] > + else: > + self._CurrentStructurePcdName = "" > + else: > + if self._CurrentStructurePcdName != > TAB_SPLIT.join(PcdNames[:2]): > + EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name > does > not match: %s and %s " % (self._CurrentStructurePcdName, > TAB_SPLIT.join(PcdNames[:2])), > + File=self.MetaFile, Line=self._LineIndex + 1) > + self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:]) > + self._ValueList[2] = PcdTockens[1] > > - self._ValueList[2] = ValueList[0].strip() + '|' + > ValueList[1].strip() + '|' + > ValueList[2].strip() > + if not self._CurrentStructurePcdName: > + if self._PcdDataTypeCODE: > + if ")}" in self._CurrentLine: > + ValuePart, RestofValue = self._CurrentLine.split(")}") > + self._PcdCodeValue = self._PcdCodeValue + "\n " + > ValuePart > + self._CurrentLine = "|".join((self._CurrentPcdName, > self._PcdCodeValue, RestofValue)) > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._PcdCodeValue = self._PcdCodeValue + "\n " + > self._CurrentLine > + self._ValueList = None > + return > + TokenList = GetSplitValueList(self._CurrentLine, > TAB_VALUE_SPLIT, 1) > + self._CurrentPcdName = TokenList[0] > + if len(TokenList) == 2 and > TokenList[1].strip().startswith("{CODE"): > + if ")}" in self._CurrentLine: > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._PcdDataTypeCODE = True > + self._PcdCodeValue = TokenList[1].strip() > + self._ValueList = None > + return > + > + self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) > + ValueRe = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*') > + # check PCD information > + if self._ValueList[0] == '' or self._ValueList[1] == '': > + EdkLogger.error('Parser', FORMAT_INVALID, "No token space > GUID > or PCD name specified", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, Line=self._LineIndex+1) > + # check format of token space GUID CName > + if not ValueRe.match(self._ValueList[0]): > + EdkLogger.error('Parser', FORMAT_INVALID, > + "The format of the token space GUID CName is > invalid. The > correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, Line=self._LineIndex + 1) > + # check format of PCD CName > + if not ValueRe.match(self._ValueList[1]): > + EdkLogger.error('Parser', FORMAT_INVALID, > + "The format of the PCD CName is invalid. The > correct format > is '(a-zA-Z_)[a-zA-Z0-9_]*'", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, > + Line=self._LineIndex + 1) > + > + # check PCD datum information > + if len(TokenList) < 2 or TokenList[1] == '': > + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum > information given", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, > + Line=self._LineIndex+1) > + > + > + ValueRe = re.compile(r'^\s*L?\".*\|.*\"') > + PtrValue = ValueRe.findall(TokenList[1]) > + > + # Has VOID* type string, may contain "|" character in the string. > + if len(PtrValue) != 0: > + ptrValueList = re.sub(ValueRe, '', TokenList[1]) > + ValueList = AnalyzePcdExpression(ptrValueList) > + ValueList[0] = PtrValue[0] > + else: > + ValueList = AnalyzePcdExpression(TokenList[1]) > + > + > + # check if there's enough datum information given > + if len(ValueList) != 3: > + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum > information given", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, Line=self._LineIndex + 1) > + # check default value > + if ValueList[0] == '': > + EdkLogger.error('Parser', FORMAT_INVALID, "Missing > DefaultValue > in PCD Datum information", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, Line=self._LineIndex + 1) > + # check datum type > + if ValueList[1] == '': > + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType > in PCD Datum information", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, Line=self._LineIndex + 1) > + # check token of the PCD > + if ValueList[2] == '': > + EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in > PCD > Datum information", > + ExtraData=self._CurrentLine + \ > + " > (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|< > Token>)", > + File=self.MetaFile, > + Line=self._LineIndex + 1) > + > + PcdValue = ValueList[0] > + if PcdValue: > + try: > + self._GuidDict.update(self._AllPcdDict) > + ValueList[0] = ValueExpressionEx(ValueList[0], > ValueList[1], > self._GuidDict)(True) > + except BadExpression as Value: > + EdkLogger.error('Parser', FORMAT_INVALID, Value, > ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) > + # check format of default value against the datum type > + IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) > + if not IsValid: > + EdkLogger.error('Parser', FORMAT_INVALID, Cause, > ExtraData=self._CurrentLine, > + File=self.MetaFile, > + Line=self._LineIndex + 1) > + > + if Cause == "StructurePcd": > + self._CurrentStructurePcdName = > TAB_SPLIT.join(self._ValueList[0:2]) > + self._ValueList[0] = self._CurrentStructurePcdName > + self._ValueList[1] = ValueList[1].strip() > + > + if ValueList[0] in ['True', 'true', 'TRUE']: > + ValueList[0] = '1' > + elif ValueList[0] in ['False', 'false', 'FALSE']: > + ValueList[0] = '0' > + > + # check for duplicate PCD definition > + if (self._Scope[0], self._ValueList[0], self._ValueList[1]) in > self._AllPCDs: > + EdkLogger.error('Parser', FORMAT_INVALID, > + "The same PCD name and GUID have been > already defined", > + ExtraData=self._CurrentLine, > File=self.MetaFile, > Line=self._LineIndex + 1) > + else: > + self._AllPCDs.append((self._Scope[0], self._ValueList[0], > self._ValueList[1])) > + self._AllPcdDict[TAB_SPLIT.join(self._ValueList[0:2])] > + = ValueList[0] > + > + self._ValueList[2] = ValueList[0].strip() + '|' + > + ValueList[1].strip() + '|' + ValueList[2].strip() > > _SectionParser = { > MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, > -- > 2.26.2.windows.1 > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#73601): https://edk2.groups.io/g/devel/message/73601 Mute This Topic: https://groups.io/mt/81770258/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-