]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Xml/PcdXml.py
BaseTools: add '!include' support to tools_def.txt parser
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / PcdXml.py
index d1f1332726fc9823c85fe7c73cc74f43c4aae041..4603918babcbf5bfe2404070b7861b39a7017245 100644 (file)
@@ -1,7 +1,7 @@
 ## @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
@@ -32,8 +32,11 @@ from Library import GlobalData
 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
@@ -51,7 +54,7 @@ class PcdErrorXml(object):
         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
@@ -81,9 +84,12 @@ class PcdErrorXml(object):
                              [['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
@@ -96,6 +102,147 @@ class PcdErrorXml(object):
         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
@@ -122,6 +269,7 @@ class PcdEntryXml(object):
         self.Value = ''\r
         self.Offset = ''\r
         self.CommonDefines = CommonDefinesXml()\r
+        self.Prompt = []\r
         self.HelpText = []\r
         self.PcdError = []\r
 \r
@@ -149,6 +297,7 @@ class PcdEntryXml(object):
         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
@@ -192,6 +341,10 @@ class PcdEntryXml(object):
         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
@@ -214,7 +367,8 @@ class PcdEntryXml(object):
         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
@@ -311,6 +465,10 @@ class PcdEntryXml(object):
                     ['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
@@ -400,4 +558,4 @@ class PcdEntryXml(object):
             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