\r
from .WorkspaceCommon import GetDeclaredPcd\r
from Common.Misc import AnalyzeDscPcd\r
-from Common.Misc import ProcessDuplicatedInf\r
+from Common.Misc import ProcessDuplicatedInf,RemoveCComments\r
import re\r
from Common.Parsing import IsValidWord\r
from Common.VariableAttributes import VariableAttributes\r
\r
for str_pcd_obj in S_pcd_set.values():\r
\r
- str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
+ str_pcd_obj.MaxDatumSize = DscBuildData.GetStructurePcdMaxSize(str_pcd_obj)\r
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True\r
\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
return Pcds\r
\r
- def GetStructurePcdMaxSize(self, str_pcd):\r
+ @staticmethod\r
+ def GetStructurePcdMaxSize(str_pcd):\r
pcd_default_value = str_pcd.DefaultValue\r
- sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
+ sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
sku_values.append(pcd_default_value)\r
\r
def get_length(value):\r
return len(Value[2:-1])\r
if Value[0] == '"' and Value[-1] == '"':\r
return len(Value) - 2\r
- if Value[0] == '{' and Value[-1] == '}':\r
+ if Value.strip().startswith("{CODE("):\r
+ tmpValue = RemoveCComments(Value)\r
+ return len(tmpValue.split(","))\r
+ if (Value[0] == '{' and Value[-1] == '}'):\r
return len(Value.split(","))\r
if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
return len(list(Value[2:-1]))\r
r_datatype.append("[1]")\r
else:\r
r_datatype.append("[" + dem + "]")\r
- CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype))\r
+ sizebasevalue = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+ CApp = ' Size = sizeof(%s) > %s?sizeof(%s) : %s ;\n' % ( ("".join(r_datatype), sizebasevalue, "".join(r_datatype), sizebasevalue) )\r
else:\r
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
\r
PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
\r
- InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)\r
+ InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
\r
#\r
# Get current PCD value and size\r
return CApp\r
Demesion = ""\r
for d in Pcd.Capacity:\r
- if d == "0":\r
- Demesion += "[]"\r
- else:\r
- Demesion += "["+d+"]"\r
+ Demesion += "[]"\r
\r
Value = Pcd.DefaultValueFromDec\r
if "{CODE(" in Pcd.DefaultValueFromDec:\r
realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
- CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+ else:\r
+ realvalue = Pcd.DefaultValueFromDec.strip()\r
+ CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
\r
- for skuname in Pcd.SkuInfoList:\r
- skuinfo = Pcd.SkuInfoList[skuname]\r
- if skuinfo.VariableName:\r
- for defaultstore in skuinfo.DefaultStoreDict:\r
- Value = skuinfo[defaultstore]\r
+ if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+ for skuname in Pcd.SkuInfoList:\r
+ skuinfo = Pcd.SkuInfoList[skuname]\r
+ if skuinfo.VariableName:\r
+ for defaultstore in skuinfo.DefaultStoreDict:\r
+ Value = skuinfo[defaultstore]\r
+ if "{CODE(" in Value:\r
+ realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ else:\r
+ realvalue = Value.strip()\r
+ CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
+ else:\r
+ Value = skuinfo.DefaultValue\r
if "{CODE(" in Value:\r
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
- CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
- else:\r
- Value = skuinfo.DefaultValue\r
- if "{CODE(" in Value:\r
- realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ else:\r
+ realvalue = Value.strip()\r
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
+ else:\r
+ if "{CODE(" in Pcd.DefaultValue:\r
+ realvalue = Pcd.DefaultValue.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ else:\r
+ realvalue = Pcd.DefaultValue.strip()\r
+ CApp += "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
return CApp\r
def SkuOverrideValuesEmpty(self,OverrideValues):\r
if not OverrideValues:\r
--- /dev/null
+## @file\r
+# Routines for generating Pcd Database\r
+#\r
+# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+import unittest\r
+from Common.Misc import RemoveCComments\r
+from Workspace.BuildClassObject import ArrayIndex\r
+\r
+class TestRe(unittest.TestCase):\r
+ def test_ccomments(self):\r
+ TestStr1 = """ {0x01,0x02} """\r
+ self.assertEquals(TestStr1, RemoveCComments(TestStr1))\r
+\r
+ TestStr2 = """ L'TestString' """\r
+ self.assertEquals(TestStr2, RemoveCComments(TestStr2))\r
+\r
+ TestStr3 = """ 'TestString' """\r
+ self.assertEquals(TestStr3, RemoveCComments(TestStr3))\r
+\r
+ TestStr4 = """\r
+ {CODE({\r
+ {0x01, {0x02, 0x03, 0x04 }},// Data comment\r
+ {0x01, {0x02, 0x03, 0x04 }},// Data comment\r
+ })\r
+ } /*\r
+ This is multiple line comments\r
+ The seconde line comment\r
+ */\r
+ // This is a comment\r
+ """\r
+ Expect_TestStr4 = """{CODE({\r
+ {0x01, {0x02, 0x03, 0x04 }},\r
+ {0x01, {0x02, 0x03, 0x04 }},\r
+ })\r
+ }"""\r
+ self.assertEquals(Expect_TestStr4, RemoveCComments(TestStr4).strip())\r
+\r
+ def Test_ArrayIndex(self):\r
+ TestStr1 = """[1]"""\r
+ self.assertEquals(['[1]'], ArrayIndex.findall(TestStr1))\r
+\r
+ TestStr2 = """[1][2][0x1][0x01][]"""\r
+ self.assertEquals(['[1]','[2]','[0x1]','[0x01]','[]'], ArrayIndex.findall(TestStr2))\r
+\r
+if __name__ == '__main__':\r
+ unittest.main()\r