2 # This file is used to define class objects of INF file [Pcds] section.
3 # It will consumed by InfParser.
5 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
7 # SPDX-License-Identifier: BSD-2-Clause-Patent
15 from Logger
import StringTable
as ST
16 from Logger
import ToolError
17 import Logger
.Log
as Logger
18 from Library
import GlobalData
19 from Library
import DataType
as DT
21 from Library
.Misc
import Sdict
22 from Library
.Misc
import GetHelpStringByRemoveHashKey
23 from Library
.ParserValidate
import IsValidPcdType
24 from Library
.ParserValidate
import IsValidCVariableName
25 from Library
.ParserValidate
import IsValidPcdValue
26 from Library
.ParserValidate
import IsValidArch
27 from Library
.CommentParsing
import ParseComment
28 from Library
.StringUtils
import GetSplitValueList
29 from Library
.StringUtils
import IsHexDigitUINT32
30 from Library
.ExpressionValidate
import IsValidFeatureFlagExp
31 from Parser
.InfAsBuiltProcess
import GetPackageListInfo
32 from Parser
.DecParser
import Dec
34 from Object
.Parser
.InfPackagesObject
import InfPackageItem
36 def ValidateArch(ArchItem
, PcdTypeItem1
, LineNo
, SupArchDict
, SupArchList
):
40 if (ArchItem
== '' or ArchItem
is None):
43 if PcdTypeItem1
.upper
!= DT
.TAB_INF_FEATURE_PCD
.upper():
44 ArchList
= GetSplitValueList(ArchItem
, ' ')
45 for ArchItemNew
in ArchList
:
46 if not IsValidArch(ArchItemNew
):
47 Logger
.Error("InfParser",
48 ToolError
.FORMAT_INVALID
,
49 ST
.ERR_INF_PARSER_DEFINE_FROMAT_INVALID
% (ArchItemNew
),
50 File
=GlobalData
.gINF_MODULE_NAME
,
52 ExtraData
=ArchItemNew
)
53 SupArchDict
[PcdTypeItem1
] = ArchList
55 SupArchList
.append(ArchItem
)
57 return SupArchList
, SupArchDict
59 def ParsePcdComment(CommentList
, PcdTypeItem
, PcdItemObj
):
65 CommentItemHelpText
= ''
67 for CommentItem
in CommentList
:
69 CommentItemUsage
, CommentType
, CommentString
, CommentItemHelpText
= ParseComment(CommentItem
,
74 if CommentType
and CommentString
:
77 if PcdTypeItem
== 'FeaturePcd':
78 CommentItemUsage
= DT
.USAGE_ITEM_CONSUMES
79 if CommentItemHelpText
is None:
80 CommentItemHelpText
= ''
83 FFEHelpText
= CommentItemHelpText
85 FFEHelpText
= FFEHelpText
+ DT
.END_OF_LINE
+ CommentItemHelpText
87 if Count
== len(CommentList
):
88 CommentItemHelpText
= FFEHelpText
93 if CommentItemHelpText
is None:
94 CommentItemHelpText
= ''
95 if Count
== len(CommentList
) and CommentItemUsage
== DT
.ITEM_UNDEFINED
:
96 CommentItemHelpText
= DT
.END_OF_LINE
98 if Count
== len(CommentList
) and (BlockFlag
== 1 or BlockFlag
== 2):
99 if CommentItemUsage
== DT
.ITEM_UNDEFINED
:
103 elif BlockFlag
== -1 and Count
== len(CommentList
):
106 if BlockFlag
== -1 or BlockFlag
== 1 or BlockFlag
== 2:
107 if CommentItemUsage
== DT
.ITEM_UNDEFINED
:
113 if BlockFlag
== 1 or BlockFlag
== 2:
115 elif BlockFlag
== -1:
118 # Combine two comment line if they are generic comment
120 if CommentItemUsage
== PreUsage
== DT
.ITEM_UNDEFINED
:
121 CommentItemHelpText
= PreHelpText
+ DT
.END_OF_LINE
+ CommentItemHelpText
123 PreHelpText
= CommentItemHelpText
126 CommentItemIns
= InfPcdItemCommentContent()
127 CommentItemIns
.SetUsageItem(CommentItemUsage
)
128 CommentItemIns
.SetHelpStringItem(CommentItemHelpText
)
129 CommentInsList
.append(CommentItemIns
)
137 # Add previous help string
139 CommentItemIns
= InfPcdItemCommentContent()
140 CommentItemIns
.SetUsageItem(DT
.ITEM_UNDEFINED
)
141 if PreHelpText
== '' or PreHelpText
.endswith(DT
.END_OF_LINE
):
142 PreHelpText
+= DT
.END_OF_LINE
143 CommentItemIns
.SetHelpStringItem(PreHelpText
)
144 CommentInsList
.append(CommentItemIns
)
146 # Add Current help string
148 CommentItemIns
= InfPcdItemCommentContent()
149 CommentItemIns
.SetUsageItem(CommentItemUsage
)
150 CommentItemIns
.SetHelpStringItem(CommentItemHelpText
)
151 CommentInsList
.append(CommentItemIns
)
158 PreUsage
= CommentItemUsage
159 PreHelpText
= CommentItemHelpText
161 PcdItemObj
.SetHelpStringList(CommentInsList
)
165 class InfPcdItemCommentContent():
168 # ## SOMETIMES_CONSUMES ## HelpString
174 self
.HelpStringItem
= ''
176 def SetUsageItem(self
, UsageItem
):
177 self
.UsageItem
= UsageItem
178 def GetUsageItem(self
):
179 return self
.UsageItem
181 def SetHelpStringItem(self
, HelpStringItem
):
182 self
.HelpStringItem
= HelpStringItem
183 def GetHelpStringItem(self
):
184 return self
.HelpStringItem
188 # This class defined Pcd item used in Module files
190 # @param CName: Input value for CName, default is ''
191 # @param Token: Input value for Token, default is ''
192 # @param TokenSpaceGuidCName: Input value for TokenSpaceGuidCName, default
194 # @param DatumType: Input value for DatumType, default is ''
195 # @param MaxDatumSize: Input value for MaxDatumSize, default is ''
196 # @param DefaultValue: Input value for DefaultValue, default is ''
197 # @param ItemType: Input value for ItemType, default is ''
198 # @param ValidUsage: Input value for ValidUsage, default is []
199 # @param SkuInfoList: Input value for SkuInfoList, default is {}
200 # @param SupModuleList: Input value for SupModuleList, default is []
206 self
.TokenSpaceGuidCName
= ''
207 self
.TokenSpaceGuidValue
= ''
209 self
.MaxDatumSize
= ''
210 self
.DefaultValue
= ''
214 self
.SupModuleList
= []
215 self
.HelpStringList
= []
216 self
.FeatureFlagExp
= ''
217 self
.SupArchList
= []
218 self
.PcdErrorsList
= []
220 def SetCName(self
, CName
):
225 def SetToken(self
, Token
):
230 def SetTokenSpaceGuidCName(self
, TokenSpaceGuidCName
):
231 self
.TokenSpaceGuidCName
= TokenSpaceGuidCName
232 def GetTokenSpaceGuidCName(self
):
233 return self
.TokenSpaceGuidCName
235 def SetTokenSpaceGuidValue(self
, TokenSpaceGuidValue
):
236 self
.TokenSpaceGuidValue
= TokenSpaceGuidValue
237 def GetTokenSpaceGuidValue(self
):
238 return self
.TokenSpaceGuidValue
240 def SetDatumType(self
, DatumType
):
241 self
.DatumType
= DatumType
242 def GetDatumType(self
):
243 return self
.DatumType
245 def SetMaxDatumSize(self
, MaxDatumSize
):
246 self
.MaxDatumSize
= MaxDatumSize
247 def GetMaxDatumSize(self
):
248 return self
.MaxDatumSize
250 def SetDefaultValue(self
, DefaultValue
):
251 self
.DefaultValue
= DefaultValue
252 def GetDefaultValue(self
):
253 return self
.DefaultValue
255 def SetPcdErrorsList(self
, PcdErrorsList
):
256 self
.PcdErrorsList
= PcdErrorsList
257 def GetPcdErrorsList(self
):
258 return self
.PcdErrorsList
260 def SetItemType(self
, ItemType
):
261 self
.ItemType
= ItemType
262 def GetItemType(self
):
265 def SetSupModuleList(self
, SupModuleList
):
266 self
.SupModuleList
= SupModuleList
267 def GetSupModuleList(self
):
268 return self
.SupModuleList
270 def SetHelpStringList(self
, HelpStringList
):
271 self
.HelpStringList
= HelpStringList
272 def GetHelpStringList(self
):
273 return self
.HelpStringList
275 def SetFeatureFlagExp(self
, FeatureFlagExp
):
276 self
.FeatureFlagExp
= FeatureFlagExp
277 def GetFeatureFlagExp(self
):
278 return self
.FeatureFlagExp
280 def SetSupportArchList(self
, ArchList
):
281 self
.SupArchList
= ArchList
282 def GetSupportArchList(self
):
283 return self
.SupArchList
285 def SetOffset(self
, Offset
):
290 def SetValidUsage(self
, ValidUsage
):
291 self
.ValidUsage
= ValidUsage
293 def GetValidUsage(self
):
294 return self
.ValidUsage
300 class InfPcdObject():
301 def __init__(self
, FileName
):
303 self
.FileName
= FileName
305 def SetPcds(self
, PcdContent
, KeysList
=None, PackageInfo
=None):
307 if GlobalData
.gIS_BINARY_INF
:
308 self
.SetAsBuildPcds(PcdContent
, KeysList
, PackageInfo
)
317 for (PcdTypeItem1
, ArchItem
, LineNo
) in KeysList
:
318 SupArchList
, SupArchDict
= ValidateArch(ArchItem
, PcdTypeItem1
, LineNo
, SupArchDict
, SupArchList
)
323 if (PcdTypeItem1
== '' or PcdTypeItem1
is None):
326 if not IsValidPcdType(PcdTypeItem1
):
327 Logger
.Error("InfParser",
328 ToolError
.FORMAT_INVALID
,
329 ST
.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR
% (DT
.PCD_USAGE_TYPE_LIST_OF_MODULE
),
330 File
=GlobalData
.gINF_MODULE_NAME
,
332 ExtraData
=PcdTypeItem1
)
335 PcdTypeItem
= PcdTypeItem1
337 for PcdItem
in PcdContent
:
338 PcdItemObj
= InfPcdItem()
339 CommentList
= PcdItem
[1]
340 CurrentLineOfPcdItem
= PcdItem
[2]
343 if CommentList
is not None and len(CommentList
) != 0:
344 PcdItemObj
= ParsePcdComment(CommentList
, PcdTypeItem
, PcdItemObj
)
346 CommentItemIns
= InfPcdItemCommentContent()
347 CommentItemIns
.SetUsageItem(DT
.ITEM_UNDEFINED
)
348 PcdItemObj
.SetHelpStringList([CommentItemIns
])
350 if len(PcdItem
) >= 1 and len(PcdItem
) <= 3:
351 PcdItemObj
= SetPcdName(PcdItem
, CurrentLineOfPcdItem
, PcdItemObj
)
353 if len(PcdItem
) >= 2 and len(PcdItem
) <= 3:
355 # Contain PcdName and Value, validate value.
357 if IsValidPcdValue(PcdItem
[1]) or PcdItem
[1].strip() == "":
358 PcdItemObj
.SetDefaultValue(PcdItem
[1])
360 Logger
.Error("InfParser",
361 ToolError
.FORMAT_INVALID
,
362 ST
.ERR_INF_PARSER_PCD_VALUE_INVALID
,
363 File
=CurrentLineOfPcdItem
[2],
364 Line
=CurrentLineOfPcdItem
[1],
365 ExtraData
=PcdItem
[1])
367 if len(PcdItem
) == 3:
369 # Contain PcdName, value, and FeatureFlag express
372 # Validate Feature Flag Express
374 if PcdItem
[2].strip() == '':
375 Logger
.Error("InfParser",
376 ToolError
.FORMAT_INVALID
,
377 ST
.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING
,
378 File
=CurrentLineOfPcdItem
[2],
379 Line
=CurrentLineOfPcdItem
[1],
380 ExtraData
=CurrentLineOfPcdItem
[0])
384 FeatureFlagRtv
= IsValidFeatureFlagExp(PcdItem
[2].strip())
385 if not FeatureFlagRtv
[0]:
386 Logger
.Error("InfParser",
387 ToolError
.FORMAT_INVALID
,
388 ST
.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID
% (FeatureFlagRtv
[1]),
389 File
=CurrentLineOfPcdItem
[2],
390 Line
=CurrentLineOfPcdItem
[1],
391 ExtraData
=CurrentLineOfPcdItem
[0])
392 PcdItemObj
.SetFeatureFlagExp(PcdItem
[2])
394 if len(PcdItem
) < 1 or len(PcdItem
) > 3:
395 Logger
.Error("InfParser",
396 ToolError
.FORMAT_INVALID
,
397 ST
.ERR_INF_PARSER_PCD_SECTION_CONTENT_ERROR
,
398 File
=CurrentLineOfPcdItem
[2],
399 Line
=CurrentLineOfPcdItem
[1],
400 ExtraData
=CurrentLineOfPcdItem
[0])
403 if PcdTypeItem
.upper
!= DT
.TAB_INF_FEATURE_PCD
.upper():
404 PcdItemObj
.SetSupportArchList(SupArchDict
[PcdTypeItem
])
406 PcdItemObj
.SetSupportArchList(SupArchList
)
408 if (PcdTypeItem
, PcdItemObj
) in self
.Pcds
:
409 PcdsList
= self
.Pcds
[PcdTypeItem
, PcdItemObj
]
410 PcdsList
.append(PcdItemObj
)
411 self
.Pcds
[PcdTypeItem
, PcdItemObj
] = PcdsList
414 PcdsList
.append(PcdItemObj
)
415 self
.Pcds
[PcdTypeItem
, PcdItemObj
] = PcdsList
419 def SetAsBuildPcds(self
, PcdContent
, KeysList
=None, PackageInfo
=None):
420 for PcdItem
in PcdContent
:
421 PcdItemObj
= InfPcdItem()
422 CommentList
= PcdItem
[1]
423 CurrentLineOfPcdItem
= PcdItem
[2]
427 for CommentLine
in CommentList
:
428 CommentString
= GetHelpStringByRemoveHashKey(CommentLine
)
429 CommentItemIns
= InfPcdItemCommentContent()
430 CommentItemIns
.SetHelpStringItem(CommentString
)
431 CommentItemIns
.SetUsageItem(CommentString
)
432 PcdItemObj
.SetHelpStringList(PcdItemObj
.GetHelpStringList() + [CommentItemIns
])
433 if PcdItemObj
.GetValidUsage():
434 PcdItemObj
.SetValidUsage(PcdItemObj
.GetValidUsage() + DT
.TAB_VALUE_SPLIT
+ CommentString
)
436 PcdItemObj
.SetValidUsage(CommentString
)
438 PcdItemObj
.SetItemType(KeysList
[0][0])
440 # Set PcdTokenSpaceCName and CName
442 PcdItemObj
= SetPcdName(PcdItem
, CurrentLineOfPcdItem
, PcdItemObj
)
444 # Set Value/DatumType/OffSet/Token
446 PcdItemObj
= SetValueDatumTypeMaxSizeToken(PcdItem
,
447 CurrentLineOfPcdItem
,
452 PcdTypeItem
= KeysList
[0][0]
453 if (PcdTypeItem
, PcdItemObj
) in self
.Pcds
:
454 PcdsList
= self
.Pcds
[PcdTypeItem
, PcdItemObj
]
455 PcdsList
.append(PcdItemObj
)
456 self
.Pcds
[PcdTypeItem
, PcdItemObj
] = PcdsList
459 PcdsList
.append(PcdItemObj
)
460 self
.Pcds
[PcdTypeItem
, PcdItemObj
] = PcdsList
465 def ParserPcdInfoInDec(String
):
466 ValueList
= GetSplitValueList(String
, DT
.TAB_VALUE_SPLIT
, 3)
471 return ValueList
[2], ValueList
[3]
473 def SetValueDatumTypeMaxSizeToken(PcdItem
, CurrentLineOfPcdItem
, PcdItemObj
, Arch
, PackageInfo
=None):
475 # Package information not been generated currently, we need to parser INF file to get information.
479 InfFileName
= CurrentLineOfPcdItem
[2]
480 PackageInfoList
= GetPackageListInfo(InfFileName
, GlobalData
.gWORKSPACE
, -1)
481 for PackageInfoListItem
in PackageInfoList
:
482 PackageInfoIns
= InfPackageItem()
483 PackageInfoIns
.SetPackageName(PackageInfoListItem
)
484 PackageInfo
.append(PackageInfoIns
)
486 PcdInfoInDecHasFound
= False
487 for PackageItem
in PackageInfo
:
488 if PcdInfoInDecHasFound
:
490 PackageName
= PackageItem
.PackageName
492 # Open DEC file to get information
494 FullFileName
= os
.path
.normpath(os
.path
.realpath(os
.path
.join(GlobalData
.gWORKSPACE
, PackageName
)))
497 if FullFileName
not in GlobalData
.gPackageDict
:
498 DecParser
= Dec(FullFileName
)
499 GlobalData
.gPackageDict
[FullFileName
] = DecParser
501 DecParser
= GlobalData
.gPackageDict
[FullFileName
]
504 # Find PCD information.
506 DecPcdsDict
= DecParser
.GetPcdSectionObject().ValueDict
507 for Key
in DecPcdsDict
.keys():
508 if (Key
[0] == 'PCDSDYNAMICEX' and PcdItemObj
.GetItemType() == 'PcdEx') and \
509 (Key
[1] == 'COMMON' or Key
[1] == Arch
):
510 for PcdInDec
in DecPcdsDict
[Key
]:
511 if PcdInDec
.TokenCName
== PcdItemObj
.CName
and \
512 PcdInDec
.TokenSpaceGuidCName
== PcdItemObj
.TokenSpaceGuidCName
:
513 PcdItemObj
.SetToken(PcdInDec
.TokenValue
)
514 PcdItemObj
.SetDatumType(PcdInDec
.DatumType
)
515 PcdItemObj
.SetSupportArchList([Arch
])
516 PcdItemObj
.SetDefaultValue(PcdInDec
.DefaultValue
)
518 if (Key
[0] == 'PCDSPATCHABLEINMODULE' and PcdItemObj
.GetItemType() == 'PatchPcd') and \
519 (Key
[1] == 'COMMON' or Key
[1] == Arch
):
520 for PcdInDec
in DecPcdsDict
[Key
]:
521 if PcdInDec
.TokenCName
== PcdItemObj
.CName
and \
522 PcdInDec
.TokenSpaceGuidCName
== PcdItemObj
.TokenSpaceGuidCName
:
523 PcdItemObj
.SetToken(PcdInDec
.TokenValue
)
524 PcdItemObj
.SetDatumType(PcdInDec
.DatumType
)
525 PcdItemObj
.SetSupportArchList([Arch
])
527 if PcdItemObj
.GetDatumType() == 'VOID*':
529 PcdItemObj
.SetMaxDatumSize('%s' % (len(GetSplitValueList(PcdItem
[1], DT
.TAB_COMMA_SPLIT
))))
531 DecGuidsDict
= DecParser
.GetGuidSectionObject().ValueDict
532 for Key
in DecGuidsDict
.keys():
533 if Key
== 'COMMON' or Key
== Arch
:
534 for GuidInDec
in DecGuidsDict
[Key
]:
535 if GuidInDec
.GuidCName
== PcdItemObj
.TokenSpaceGuidCName
:
536 PcdItemObj
.SetTokenSpaceGuidValue(GuidInDec
.GuidString
)
538 if PcdItemObj
.GetItemType().upper() == DT
.TAB_INF_PATCH_PCD
.upper():
542 # convert the value from a decimal 0 to a formatted hex value.
543 if PcdItem
[1] == "0":
544 DatumType
= PcdItemObj
.GetDatumType()
545 if DatumType
== "UINT8":
547 if DatumType
== "UINT16":
548 PcdItem
[1] = "0x0000"
549 if DatumType
== "UINT32":
550 PcdItem
[1] = "0x00000000"
551 if DatumType
== "UINT64":
552 PcdItem
[1] = "0x0000000000000000"
554 if ValidatePcdValueOnDatumType(PcdItem
[1], PcdItemObj
.GetDatumType()):
555 PcdItemObj
.SetDefaultValue(PcdItem
[1])
557 Logger
.Error("InfParser",
558 ToolError
.FORMAT_INVALID
,
559 ST
.ERR_ASBUILD_PCD_VALUE_INVALID
% ("\"" + PcdItem
[1] + "\"", "\"" +
560 PcdItemObj
.GetDatumType() + "\""),
561 File
=CurrentLineOfPcdItem
[2],
562 Line
=CurrentLineOfPcdItem
[1],
563 ExtraData
=CurrentLineOfPcdItem
[0])
567 if PcdItemObj
.GetItemType().upper() == DT
.TAB_INF_PATCH_PCD
.upper():
568 if not IsHexDigitUINT32(PcdItem
[2]):
569 Logger
.Error("InfParser",
570 ToolError
.FORMAT_INVALID
,
571 ST
.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID
% ("\"" + PcdItem
[2] + "\""),
572 File
=CurrentLineOfPcdItem
[2],
573 Line
=CurrentLineOfPcdItem
[1],
574 ExtraData
=CurrentLineOfPcdItem
[0])
575 PcdItemObj
.SetOffset(PcdItem
[2])
577 if PcdItemObj
.GetToken() == '' or PcdItemObj
.GetDatumType() == '':
578 Logger
.Error("InfParser",
579 ToolError
.FORMAT_INVALID
,
580 ST
.ERR_ASBUILD_PCD_DECLARITION_MISS
% ("\"" + PcdItem
[0] + "\""),
581 File
=CurrentLineOfPcdItem
[2],
582 Line
=CurrentLineOfPcdItem
[1],
583 ExtraData
=CurrentLineOfPcdItem
[0])
587 def ValidatePcdValueOnDatumType(Value
, Type
):
589 Value
= Value
.strip()
591 # Boolean type only allow 0x00 or 0x01 as value per INF spec
593 if Type
== 'BOOLEAN':
594 if not (Value
== '0x00' or Value
== '0x01'):
596 elif Type
== 'VOID*':
597 if not Value
.startswith("{"):
599 if not Value
.endswith("}"):
602 # Strip "{" at head and "}" at tail.
605 ValueList
= GetSplitValueList(Value
, DT
.TAB_COMMA_SPLIT
)
607 ReIsValidHexByte
= re
.compile("^0x[0-9a-f]{1,2}$", re
.IGNORECASE
)
608 for ValueItem
in ValueList
:
609 if not ReIsValidHexByte
.match(ValueItem
):
612 elif Type
== 'UINT8' or Type
== 'UINT16' or Type
== 'UINT32' or Type
== 'UINT64':
614 ReIsValidUint8z
= re
.compile('^0[x|X][a-fA-F0-9]{2}$')
615 ReIsValidUint16z
= re
.compile('^0[x|X][a-fA-F0-9]{4}$')
616 ReIsValidUint32z
= re
.compile('^0[x|X][a-fA-F0-9]{8}$')
617 ReIsValidUint64z
= re
.compile('^0[x|X][a-fA-F0-9]{16}$')
619 if not ReIsValidUint8z
.match(Value
) and Type
== 'UINT8':
621 elif not ReIsValidUint16z
.match(Value
) and Type
== 'UINT16':
623 elif not ReIsValidUint32z
.match(Value
) and Type
== 'UINT32':
625 elif not ReIsValidUint64z
.match(Value
) and Type
== 'UINT64':
629 # Since we assume the DEC file always correct, should never go to here.
635 def SetPcdName(PcdItem
, CurrentLineOfPcdItem
, PcdItemObj
):
637 # Only PCD Name specified
638 # <PcdName> ::= <TokenSpaceGuidCName> "." <TokenCName>
640 PcdId
= GetSplitValueList(PcdItem
[0], DT
.TAB_SPLIT
)
642 Logger
.Error("InfParser",
643 ToolError
.FORMAT_INVALID
,
644 ST
.ERR_INF_PARSER_PCD_NAME_FORMAT_ERROR
,
645 File
=CurrentLineOfPcdItem
[2],
646 Line
=CurrentLineOfPcdItem
[1],
647 ExtraData
=CurrentLineOfPcdItem
[0])
650 # Validate PcdTokenSpaceGuidCName
652 if not IsValidCVariableName(PcdId
[0]):
653 Logger
.Error("InfParser",
654 ToolError
.FORMAT_INVALID
,
655 ST
.ERR_INF_PARSER_PCD_CVAR_GUID
,
656 File
=CurrentLineOfPcdItem
[2],
657 Line
=CurrentLineOfPcdItem
[1],
659 if not IsValidCVariableName(PcdId
[1]):
660 Logger
.Error("InfParser",
661 ToolError
.FORMAT_INVALID
,
662 ST
.ERR_INF_PARSER_PCD_CVAR_PCDCNAME
,
663 File
=CurrentLineOfPcdItem
[2],
664 Line
=CurrentLineOfPcdItem
[1],
666 PcdItemObj
.SetTokenSpaceGuidCName(PcdId
[0])
667 PcdItemObj
.SetCName(PcdId
[1])