from Parsing import GetSplitValueList\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
from Common.MultipleWorkspace import MultipleWorkspace as mws\r
+import uuid\r
\r
## Regular expression used to find out place holders in string template\r
gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
\r
return FieldList\r
\r
+def ParseFieldValue (Value):\r
+ if type(Value) == type(0):\r
+ return Value, (Value.bit_length() + 7) / 8\r
+ if type(Value) <> type(''):\r
+ raise ValueError\r
+ Value = Value.strip()\r
+ if Value.startswith('UINT8') and Value.endswith(')'):\r
+ Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
+ if Size > 1:\r
+ raise ValueError\r
+ return Value, 1\r
+ if Value.startswith('UINT16') and Value.endswith(')'):\r
+ Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
+ if Size > 2:\r
+ raise ValueError\r
+ return Value, 2\r
+ if Value.startswith('UINT32') and Value.endswith(')'):\r
+ Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
+ if Size > 4:\r
+ raise ValueError\r
+ return Value, 4\r
+ if Value.startswith('UINT64') and Value.endswith(')'):\r
+ Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
+ if Size > 8:\r
+ raise ValueError\r
+ return Value, 8\r
+ if Value.startswith('GUID') and Value.endswith(')'):\r
+ Value = Value.split('(', 1)[1][:-1].strip()\r
+ if Value[0] == '{' and Value[-1] == '}':\r
+ Value = Value[1:-1].strip()\r
+ Value = Value.split('{', 1)\r
+ Value = [Item.strip()[2:] for Item in (Value[0] + Value[1][:-1]).split(',')]\r
+ Value = '-'.join(Value[0:3]) + '-' + ''.join(Value[3:5]) + '-' + ''.join(Value[5:11])\r
+ if Value[0] == '"' and Value[-1] == '"':\r
+ Value = Value[1:-1]\r
+ Value = "'" + uuid.UUID(Value).get_bytes_le() + "'"\r
+ Value, Size = ParseFieldValue(Value)\r
+ return Value, 16\r
+ if Value.startswith('L"') and Value.endswith('"'):\r
+ # Unicode String\r
+ List = list(Value[2:-1])\r
+ List.reverse()\r
+ Value = 0\r
+ for Char in List:\r
+ Value = (Value << 16) | ord(Char)\r
+ return Value, (len(List) + 1) * 2\r
+ if Value.startswith('"') and Value.endswith('"'):\r
+ # ASCII String\r
+ List = list(Value[1:-1])\r
+ List.reverse()\r
+ Value = 0\r
+ for Char in List:\r
+ Value = (Value << 8) | ord(Char)\r
+ return Value, len(List) + 1\r
+ if Value.startswith("L'") and Value.endswith("'"):\r
+ # Unicode Character Constant\r
+ List = list(Value[2:-1])\r
+ List.reverse()\r
+ Value = 0\r
+ for Char in List:\r
+ Value = (Value << 16) | ord(Char)\r
+ return Value, len(List) * 2\r
+ if Value.startswith("'") and Value.endswith("'"):\r
+ # Character constant\r
+ List = list(Value[1:-1])\r
+ List.reverse()\r
+ Value = 0\r
+ for Char in List:\r
+ Value = (Value << 8) | ord(Char)\r
+ return Value, len(List)\r
+ if Value.startswith('{') and Value.endswith('}'):\r
+ # Byte array\r
+ Value = Value[1:-1]\r
+ List = [Item.strip() for Item in Value.split(',')]\r
+ List.reverse()\r
+ Value = 0\r
+ for Item in List:\r
+ ItemValue, Size = ParseFieldValue(Item)\r
+ if Size > 1:\r
+ raise ValueError\r
+ Value = (Value << 8) | ItemValue\r
+ return Value, len(List)\r
+ if Value.lower().startswith('0x'):\r
+ Value = int(Value, 16)\r
+ return Value, (Value.bit_length() + 7) / 8\r
+ if Value[0].isdigit():\r
+ Value = int(Value, 10)\r
+ return Value, (Value.bit_length() + 7) / 8\r
+ if Value.lower() == 'true':\r
+ return 1, 1\r
+ if Value.lower() == 'false':\r
+ return 0, 1\r
+ return Value, 1\r
+\r
## AnalyzeDscPcd\r
#\r
# Analyze DSC PCD value, since there is no data type info in DSC\r
Value = FieldList[0]\r
Size = ''\r
if len(FieldList) > 1:\r
- Type = FieldList[1]\r
- # Fix the PCD type when no DataType input\r
- if Type == 'VOID*':\r
- DataType = 'VOID*'\r
- else:\r
+ if FieldList[1].upper().startswith("0X") or FieldList[1].isdigit():\r
Size = FieldList[1]\r
+ else:\r
+ DataType = FieldList[1]\r
+\r
if len(FieldList) > 2:\r
Size = FieldList[2]\r
- if DataType == 'VOID*':\r
- IsValid = (len(FieldList) <= 3)\r
- else:\r
+ if DataType == "":\r
IsValid = (len(FieldList) <= 1)\r
- return [Value, '', Size], IsValid, 0\r
+ else:\r
+ IsValid = (len(FieldList) <= 3)\r
+# Value, Size = ParseFieldValue(Value)\r
+ return [str(Value), '', str(Size)], IsValid, 0\r
elif PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
Value = FieldList[0]\r
Size = Type = ''\r
Size = str(len(Value.split(",")))\r
else:\r
Size = str(len(Value) -2 + 1 )\r
- if DataType == 'VOID*':\r
- IsValid = (len(FieldList) <= 3)\r
- else:\r
+ if DataType == "":\r
IsValid = (len(FieldList) <= 1)\r
+ else:\r
+ IsValid = (len(FieldList) <= 3)\r
return [Value, Type, Size], IsValid, 0\r
elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
VpdOffset = FieldList[0]\r
Size = FieldList[1]\r
if len(FieldList) > 2:\r
Value = FieldList[2]\r
- if DataType == 'VOID*':\r
- IsValid = (len(FieldList) <= 3)\r
+ if DataType == "":\r
+ IsValid = (len(FieldList) <= 1)\r
else:\r
- IsValid = (len(FieldList) <= 2)\r
+ IsValid = (len(FieldList) <= 3)\r
+\r
return [VpdOffset, Size, Value], IsValid, 2\r
elif PcdType in (MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_EX_HII):\r
HiiString = FieldList[0]\r
return False, "Invalid value [%s] of type [%s];"\\r
" must be a hexadecimal, decimal or octal in C language format." % (Value, Type)\r
else:\r
- return False, "Invalid type [%s]; must be one of VOID*, BOOLEAN, UINT8, UINT16, UINT32, UINT64." % (Type)\r
+ return True, "StructurePcd"\r
\r
return True, ""\r
\r