## @file\r
# This file is used to parse a PCD file of .PKG file\r
#\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, 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
from Object.POM.CommonObject import PcdObject\r
from Object.POM.CommonObject import PcdErrorObject\r
from Xml.CommonXml import HelpTextXml\r
+from Xml.CommonXml import PromptXml\r
from Xml.CommonXml import CommonDefinesXml\r
from Xml.XmlParserMisc import GetHelpTextList\r
+from Xml.XmlParserMisc import GetPromptList\r
+import re\r
\r
##\r
# PcdErrorXml\r
self.ValidValueList = XmlElement(Item, '%s/ValidValueList' % Key)\r
self.ValidValueListLang = \\r
XmlAttribute(XmlNode(Item, '%s/ValidValueList' % Key), 'Lang')\r
- self.ValidValueRange = XmlElement(Item, '%s/ValidValueRange' % Key)\r
+ self.ValidValueRange = self.TransferValidEpxr2ValidRange(XmlElement(Item, '%s/ValidValueRange' % Key))\r
self.Expression = XmlElement(Item, '%s/Expression' % Key)\r
self.ErrorNumber = XmlElement(Item, '%s/ErrorNumber' % Key)\r
for ErrMsg in XmlList(Item, '%s/ErrorMessage' % Key):\r
[['Lang', PcdError.GetValidValueLang()]])\r
NodeList.append(Element1)\r
if PcdError.GetValidValueRange():\r
+ TansferedRangeStr = self.TransferValidRange2Expr(PcdError.GetTokenSpaceGuidCName(),\r
+ PcdError.GetCName(),\r
+ PcdError.GetValidValueRange())\r
Element1 = \\r
CreateXmlElement('ValidValueRange', \\r
- PcdError.GetValidValueRange(), [], [])\r
+ TansferedRangeStr, [], [])\r
NodeList.append(Element1)\r
if PcdError.GetExpression():\r
NodeList.append(['Expression', PcdError.GetExpression()])\r
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
\r
return Root\r
+ \r
+ def TransferValidRange2Expr(self, TokenSpaceGuidCName, CName, ValidRange):\r
+ if self.Expression:\r
+ pass\r
+ INT_RANGE_PATTERN1 = '[\t\s]*[0-9]+[\t\s]*-[\t\s]*[0-9]+'\r
+ INT_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'\r
+ HEX_RANGE_PATTERN1 = \\r
+ '[\t\s]*0[xX][a-fA-F0-9]+[\t\s]*-[\t\s]*0[xX][a-fA-F0-9]+'\r
+ HEX_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][a-fA-F0-9]+[\t\s]*'\r
+ IntMatch1 = re.compile(INT_RANGE_PATTERN1)\r
+ IntMatch2 = re.compile(INT_RANGE_PATTERN2)\r
+ HexMatch1 = re.compile(HEX_RANGE_PATTERN1)\r
+ HexMatch2 = re.compile(HEX_RANGE_PATTERN2)\r
+ PcdName = '.'.join([TokenSpaceGuidCName, CName])\r
+ HexMatchedList = []\r
+ IntMatchedList = []\r
+ #\r
+ # Convert HEX2 format range\r
+ #\r
+ if HexMatch2:\r
+ for MatchObj in HexMatch2.finditer(ValidRange):\r
+ MatchStr = MatchObj.group()\r
+ TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])\r
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+ #\r
+ # Convert INT2 format range\r
+ #\r
+ if IntMatch2:\r
+ for MatchObj in IntMatch2.finditer(ValidRange):\r
+ MatchStr = MatchObj.group()\r
+ TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])\r
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+ #\r
+ # Convert HEX1 format range\r
+ #\r
+ if HexMatch1:\r
+ HexMatchedList += HexMatch1.findall(ValidRange)\r
+ \r
+ for MatchStr in HexMatchedList:\r
+ RangeItemList = MatchStr.strip().split('-')\r
+ TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \\r
+ (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())\r
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+ #\r
+ # Convert INT1 format range\r
+ #\r
+ if IntMatch1:\r
+ IntMatchedList += IntMatch1.findall(ValidRange)\r
+ \r
+ for MatchStr in IntMatchedList:\r
+ RangeItemList = MatchStr.strip().split('-')\r
+ TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \\r
+ (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())\r
+ ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+ \r
+ return ValidRange\r
+ \r
+ def TransferValidEpxr2ValidRange(self, ValidRangeExpr):\r
+ if self.Expression:\r
+ pass\r
+ \r
+ PCD_PATTERN = \\r
+ '[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*\.[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*'\r
+ IntPattern1 = \\r
+ '[\t\s]*\([\t\s]*'+PCD_PATTERN+'[\t\s]+GE[\t\s]+\d+[\t\s]*\)[\t\s]+AND[\t\s]+\([\t\s]*'+\\r
+ PCD_PATTERN+'[\t\s]+LE[\t\s]+\d+[\t\s]*\)'\r
+ IntPattern1 = IntPattern1.replace(' ', '')\r
+ IntPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'\r
+ \r
+ HexPattern1 = \\r
+ '[\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]*'+\\r
+ PCD_PATTERN+'[\t\s]+LE[\t\s]+0[xX][0-9a-fA-F]+[\t\s]*\)'\r
+ HexPattern1 = HexPattern1.replace(' ', '')\r
+ HexPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][0-9a-zA-Z]+[\t\s]*'\r
+ \r
+ #\r
+ # Do the Hex1 conversion\r
+ # \r
+ HexMatchedList = re.compile(HexPattern1).findall(ValidRangeExpr)\r
+ HexRangeDict = {}\r
+ for HexMatchedItem in HexMatchedList:\r
+ #\r
+ # To match items on both sides of '-'\r
+ #\r
+ RangeItemList = re.compile('[\t\s]*0[xX][0-9a-fA-F]+[\t\s]*').findall(HexMatchedItem)\r
+ if RangeItemList and len(RangeItemList) == 2:\r
+ HexRangeDict[HexMatchedItem] = RangeItemList \r
+ \r
+ for Key in HexRangeDict.keys():\r
+ MaxItem = MixItem = ''\r
+ if int(HexRangeDict[Key][0], 16) > int(HexRangeDict[Key][1], 16):\r
+ MaxItem = HexRangeDict[Key][0]\r
+ MixItem = HexRangeDict[Key][1]\r
+ else:\r
+ MaxItem = HexRangeDict[Key][1]\r
+ MixItem = HexRangeDict[Key][0]\r
+ \r
+ Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())\r
+ ValidRangeExpr = ValidRangeExpr.replace(Key, Range)\r
+ #\r
+ # Do the INT1 conversion\r
+ #\r
+ IntRangeDict = {}\r
+ IntMatchList = re.compile(IntPattern1).findall(ValidRangeExpr)\r
+ for MatchedItem in IntMatchList:\r
+ #\r
+ # To match items on both sides of '-'\r
+ #\r
+ RangeItemList = re.compile('[\t\s]*\d+[\t\s]*').findall(MatchedItem)\r
+ if RangeItemList and len(RangeItemList) == 2: \r
+ IntRangeDict[MatchedItem] = RangeItemList\r
+ \r
+ for Key in IntRangeDict.keys():\r
+ MaxItem = MixItem = ''\r
+ if int(IntRangeDict[Key][0]) > int(IntRangeDict[Key][1]):\r
+ MaxItem = IntRangeDict[Key][0]\r
+ MixItem = IntRangeDict[Key][1]\r
+ else:\r
+ MaxItem = IntRangeDict[Key][1]\r
+ MixItem = IntRangeDict[Key][0]\r
+ \r
+ Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())\r
+ ValidRangeExpr = ValidRangeExpr.replace(Key, Range)\r
+ #\r
+ # Do the HEX2 conversion \r
+ #\r
+ for MatchObj in re.compile(HexPattern2).finditer(ValidRangeExpr):\r
+ MatchStr = MatchObj.group()\r
+ Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)\r
+ ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)\r
+ #\r
+ # Do the INT2 conversion\r
+ #\r
+ for MatchObj in re.compile(IntPattern2).finditer(ValidRangeExpr):\r
+ MatchStr = MatchObj.group()\r
+ Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)\r
+ ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)\r
+\r
+ return ValidRangeExpr\r
+ \r
+ \r
\r
def __str__(self):\r
return "ValidValueList = %s ValidValueListLang = %s ValidValueRange \\r
self.Value = ''\r
self.Offset = ''\r
self.CommonDefines = CommonDefinesXml()\r
+ self.Prompt = []\r
self.HelpText = []\r
self.PcdError = []\r
\r
self.Value = XmlElement(Item, '%s/Value' % Key)\r
self.Offset = XmlElement(Item, '%s/Offset' % Key)\r
self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
+ \r
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
HelpTextObj = HelpTextXml()\r
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key)\r
self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key)\r
self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
+ for PromptItem in XmlList(Item, '%s/Prompt' % Key):\r
+ PromptObj = PromptXml()\r
+ PromptObj.FromXml(PromptItem, '%s/Prompt' % Key)\r
+ self.Prompt.append(PromptObj)\r
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
HelpTextObj = HelpTextXml()\r
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
PcdEntry.SetDefaultValue(self.DefaultValue)\r
PcdEntry.SetMaxDatumSize(self.MaxDatumSize)\r
PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
-\r
+ \r
+ PcdEntry.SetPromptList(GetPromptList(self.Prompt))\r
PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText))\r
PcdEntry.SetPcdErrorsList(self.PcdError)\r
\r
['DefaultValue', DefaultValue],\r
['MaxDatumSize', PcdEntry.GetMaxDatumSize()],\r
]\r
+ for Item in PcdEntry.GetPromptList():\r
+ Tmp = PromptXml()\r
+ NodeList.append(Tmp.ToXml(Item))\r
+ \r
for Item in PcdEntry.GetHelpTextList():\r
Tmp = HelpTextXml()\r
NodeList.append(Tmp.ToXml(Item))\r
Str = Str + "\n\t" + str(Item)\r
for Item in self.PcdError:\r
Str = Str + "\n\tPcdError:" + str(Item)\r
- return Str
\ No newline at end of file
+ return Str\r