diff options
author | Hess Chen <hesheng.chen@intel.com> | 2014-08-26 05:58:02 +0000 |
---|---|---|
committer | hchen30 <hchen30@6f19259b-4bc3-4df7-8a09-765794883524> | 2014-08-26 05:58:02 +0000 |
commit | 421ccda3079077dd613308526e02d797f5cc356a (patch) | |
tree | ecf0907550f140643cb5ab965fd3b87d837b8ee4 /BaseTools/Source/Python/UPT/Xml/PcdXml.py | |
parent | f0aa06e385c41743ac805bed9469aac336a6ec4c (diff) | |
download | edk2-platforms-421ccda3079077dd613308526e02d797f5cc356a.tar.xz |
This patch is going to:
1. Add a recovery mode for UPT failure
2. Add UNI file support
3. Add binary file header support
4. Add support for PCD error message
5. Add support for replace
6. Format generated INF/DEC files
7. Update dependency check
8. Other minor fixes
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hess Chen <hesheng.chen@intel.com>
Reviewed-by: Gao, Liming <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15896 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'BaseTools/Source/Python/UPT/Xml/PcdXml.py')
-rw-r--r-- | BaseTools/Source/Python/UPT/Xml/PcdXml.py | 168 |
1 files changed, 163 insertions, 5 deletions
diff --git a/BaseTools/Source/Python/UPT/Xml/PcdXml.py b/BaseTools/Source/Python/UPT/Xml/PcdXml.py index d1f1332726..4603918bab 100644 --- a/BaseTools/Source/Python/UPT/Xml/PcdXml.py +++ b/BaseTools/Source/Python/UPT/Xml/PcdXml.py @@ -1,7 +1,7 @@ ## @file
# This file is used to parse a PCD file of .PKG file
#
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License which accompanies this
@@ -32,8 +32,11 @@ from Library import GlobalData from Object.POM.CommonObject import PcdObject
from Object.POM.CommonObject import PcdErrorObject
from Xml.CommonXml import HelpTextXml
+from Xml.CommonXml import PromptXml
from Xml.CommonXml import CommonDefinesXml
from Xml.XmlParserMisc import GetHelpTextList
+from Xml.XmlParserMisc import GetPromptList
+import re
##
# PcdErrorXml
@@ -51,7 +54,7 @@ class PcdErrorXml(object): self.ValidValueList = XmlElement(Item, '%s/ValidValueList' % Key)
self.ValidValueListLang = \
XmlAttribute(XmlNode(Item, '%s/ValidValueList' % Key), 'Lang')
- self.ValidValueRange = XmlElement(Item, '%s/ValidValueRange' % Key)
+ self.ValidValueRange = self.TransferValidEpxr2ValidRange(XmlElement(Item, '%s/ValidValueRange' % Key))
self.Expression = XmlElement(Item, '%s/Expression' % Key)
self.ErrorNumber = XmlElement(Item, '%s/ErrorNumber' % Key)
for ErrMsg in XmlList(Item, '%s/ErrorMessage' % Key):
@@ -81,9 +84,12 @@ class PcdErrorXml(object): [['Lang', PcdError.GetValidValueLang()]])
NodeList.append(Element1)
if PcdError.GetValidValueRange():
+ TansferedRangeStr = self.TransferValidRange2Expr(PcdError.GetTokenSpaceGuidCName(),
+ PcdError.GetCName(),
+ PcdError.GetValidValueRange())
Element1 = \
CreateXmlElement('ValidValueRange', \
- PcdError.GetValidValueRange(), [], [])
+ TansferedRangeStr, [], [])
NodeList.append(Element1)
if PcdError.GetExpression():
NodeList.append(['Expression', PcdError.GetExpression()])
@@ -96,6 +102,147 @@ class PcdErrorXml(object): Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
return Root
+
+ def TransferValidRange2Expr(self, TokenSpaceGuidCName, CName, ValidRange):
+ if self.Expression:
+ pass
+ INT_RANGE_PATTERN1 = '[\t\s]*[0-9]+[\t\s]*-[\t\s]*[0-9]+'
+ INT_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'
+ HEX_RANGE_PATTERN1 = \
+ '[\t\s]*0[xX][a-fA-F0-9]+[\t\s]*-[\t\s]*0[xX][a-fA-F0-9]+'
+ HEX_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][a-fA-F0-9]+[\t\s]*'
+ IntMatch1 = re.compile(INT_RANGE_PATTERN1)
+ IntMatch2 = re.compile(INT_RANGE_PATTERN2)
+ HexMatch1 = re.compile(HEX_RANGE_PATTERN1)
+ HexMatch2 = re.compile(HEX_RANGE_PATTERN2)
+ PcdName = '.'.join([TokenSpaceGuidCName, CName])
+ HexMatchedList = []
+ IntMatchedList = []
+ #
+ # Convert HEX2 format range
+ #
+ if HexMatch2:
+ for MatchObj in HexMatch2.finditer(ValidRange):
+ MatchStr = MatchObj.group()
+ TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr)
+ #
+ # Convert INT2 format range
+ #
+ if IntMatch2:
+ for MatchObj in IntMatch2.finditer(ValidRange):
+ MatchStr = MatchObj.group()
+ TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr)
+ #
+ # Convert HEX1 format range
+ #
+ if HexMatch1:
+ HexMatchedList += HexMatch1.findall(ValidRange)
+
+ for MatchStr in HexMatchedList:
+ RangeItemList = MatchStr.strip().split('-')
+ TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \
+ (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr)
+ #
+ # Convert INT1 format range
+ #
+ if IntMatch1:
+ IntMatchedList += IntMatch1.findall(ValidRange)
+
+ for MatchStr in IntMatchedList:
+ RangeItemList = MatchStr.strip().split('-')
+ TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \
+ (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr)
+
+ return ValidRange
+
+ def TransferValidEpxr2ValidRange(self, ValidRangeExpr):
+ if self.Expression:
+ pass
+
+ PCD_PATTERN = \
+ '[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*\.[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*'
+ IntPattern1 = \
+ '[\t\s]*\([\t\s]*'+PCD_PATTERN+'[\t\s]+GE[\t\s]+\d+[\t\s]*\)[\t\s]+AND[\t\s]+\([\t\s]*'+\
+ PCD_PATTERN+'[\t\s]+LE[\t\s]+\d+[\t\s]*\)'
+ IntPattern1 = IntPattern1.replace(' ', '')
+ IntPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'
+
+ HexPattern1 = \
+ '[\t\s]*\([\t\s]*'+PCD_PATTERN+'[\t\s]+GE[\t\s]+0[xX][0-9a-fA-F]+[\t\s]*\)[\t\s]+AND[\t\s]+\([\t\s]*'+\
+ PCD_PATTERN+'[\t\s]+LE[\t\s]+0[xX][0-9a-fA-F]+[\t\s]*\)'
+ HexPattern1 = HexPattern1.replace(' ', '')
+ HexPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][0-9a-zA-Z]+[\t\s]*'
+
+ #
+ # Do the Hex1 conversion
+ #
+ HexMatchedList = re.compile(HexPattern1).findall(ValidRangeExpr)
+ HexRangeDict = {}
+ for HexMatchedItem in HexMatchedList:
+ #
+ # To match items on both sides of '-'
+ #
+ RangeItemList = re.compile('[\t\s]*0[xX][0-9a-fA-F]+[\t\s]*').findall(HexMatchedItem)
+ if RangeItemList and len(RangeItemList) == 2:
+ HexRangeDict[HexMatchedItem] = RangeItemList
+
+ for Key in HexRangeDict.keys():
+ MaxItem = MixItem = ''
+ if int(HexRangeDict[Key][0], 16) > int(HexRangeDict[Key][1], 16):
+ MaxItem = HexRangeDict[Key][0]
+ MixItem = HexRangeDict[Key][1]
+ else:
+ MaxItem = HexRangeDict[Key][1]
+ MixItem = HexRangeDict[Key][0]
+
+ Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())
+ ValidRangeExpr = ValidRangeExpr.replace(Key, Range)
+ #
+ # Do the INT1 conversion
+ #
+ IntRangeDict = {}
+ IntMatchList = re.compile(IntPattern1).findall(ValidRangeExpr)
+ for MatchedItem in IntMatchList:
+ #
+ # To match items on both sides of '-'
+ #
+ RangeItemList = re.compile('[\t\s]*\d+[\t\s]*').findall(MatchedItem)
+ if RangeItemList and len(RangeItemList) == 2:
+ IntRangeDict[MatchedItem] = RangeItemList
+
+ for Key in IntRangeDict.keys():
+ MaxItem = MixItem = ''
+ if int(IntRangeDict[Key][0]) > int(IntRangeDict[Key][1]):
+ MaxItem = IntRangeDict[Key][0]
+ MixItem = IntRangeDict[Key][1]
+ else:
+ MaxItem = IntRangeDict[Key][1]
+ MixItem = IntRangeDict[Key][0]
+
+ Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())
+ ValidRangeExpr = ValidRangeExpr.replace(Key, Range)
+ #
+ # Do the HEX2 conversion
+ #
+ for MatchObj in re.compile(HexPattern2).finditer(ValidRangeExpr):
+ MatchStr = MatchObj.group()
+ Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)
+ ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)
+ #
+ # Do the INT2 conversion
+ #
+ for MatchObj in re.compile(IntPattern2).finditer(ValidRangeExpr):
+ MatchStr = MatchObj.group()
+ Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)
+ ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)
+
+ return ValidRangeExpr
+
+
def __str__(self):
return "ValidValueList = %s ValidValueListLang = %s ValidValueRange \
@@ -122,6 +269,7 @@ class PcdEntryXml(object): self.Value = ''
self.Offset = ''
self.CommonDefines = CommonDefinesXml()
+ self.Prompt = []
self.HelpText = []
self.PcdError = []
@@ -149,6 +297,7 @@ class PcdEntryXml(object): self.Value = XmlElement(Item, '%s/Value' % Key)
self.Offset = XmlElement(Item, '%s/Offset' % Key)
self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)
+
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
HelpTextObj = HelpTextXml()
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
@@ -192,6 +341,10 @@ class PcdEntryXml(object): self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key)
self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key)
self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)
+ for PromptItem in XmlList(Item, '%s/Prompt' % Key):
+ PromptObj = PromptXml()
+ PromptObj.FromXml(PromptItem, '%s/Prompt' % Key)
+ self.Prompt.append(PromptObj)
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
HelpTextObj = HelpTextXml()
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
@@ -214,7 +367,8 @@ class PcdEntryXml(object): PcdEntry.SetDefaultValue(self.DefaultValue)
PcdEntry.SetMaxDatumSize(self.MaxDatumSize)
PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))
-
+
+ PcdEntry.SetPromptList(GetPromptList(self.Prompt))
PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText))
PcdEntry.SetPcdErrorsList(self.PcdError)
@@ -311,6 +465,10 @@ class PcdEntryXml(object): ['DefaultValue', DefaultValue],
['MaxDatumSize', PcdEntry.GetMaxDatumSize()],
]
+ for Item in PcdEntry.GetPromptList():
+ Tmp = PromptXml()
+ NodeList.append(Tmp.ToXml(Item))
+
for Item in PcdEntry.GetHelpTextList():
Tmp = HelpTextXml()
NodeList.append(Tmp.ToXml(Item))
@@ -400,4 +558,4 @@ class PcdEntryXml(object): Str = Str + "\n\t" + str(Item)
for Item in self.PcdError:
Str = Str + "\n\tPcdError:" + str(Item)
- return Str
\ No newline at end of file + return Str
|