From ea927d2f3f2e34f4b26c10829f5887830cb0720e Mon Sep 17 00:00:00 2001 From: "Feng, YunhuaX" Date: Mon, 26 Feb 2018 16:42:30 +0800 Subject: BaseTools: Fix flexible PCD single quote and double quote bugs 1.The " and ' inside the string, must use escape character format (\", \') 2.'string' and L'string' format in --pcd, it must be double quoted first. Some examples that to match --pcd format and DSC format --pcd DSC format L"ABC" L"ABC" "AB\\\"C" "AB\"C" "AB\\\'C" "AB\'C" L"\'AB\\\"C\'" L'AB\"C' "\'AB\\\'C\'" 'AB\'C' H"{0, L\"AB\\\"B\", \'ab\\\"c\'}" {0, L"AB\"B", 'ab\"c'} Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yunhua Feng Reviewed-by: Yonghong Zhu --- BaseTools/Source/Python/Workspace/DscBuildData.py | 31 +++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'BaseTools/Source/Python/Workspace/DscBuildData.py') diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index f90da8e501..ea8d1847f7 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -991,6 +991,8 @@ class DscBuildData(PlatformBuildClassObject): NewValue = self.GetFieldValueFromComm(pcdvalue, TokenSpaceGuidCName, TokenCName, FieldName) GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1)) else: + # Replace \' to ', \\\' to \' + pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'") for key in self.DecPcds: PcdItem = self.DecPcds[key] if HasTokenSpace: @@ -1002,7 +1004,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if PcdDatumType == "VOID*": + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith("L'"): try: @@ -1010,7 +1012,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if pcdvalue.startswith('{'): + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith("'"): try: @@ -1018,7 +1020,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if pcdvalue.startswith('{'): + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith('L'): pcdvalue = 'L"' + pcdvalue[1:] + '"' @@ -1031,8 +1033,12 @@ class DscBuildData(PlatformBuildClassObject): try: pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True) except BadExpression, Value: - EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % - (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) + try: + pcdvalue = '"' + pcdvalue + '"' + pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True) + except BadExpression, Value: + EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % + (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue) FoundFlag = True else: @@ -1048,7 +1054,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if PcdDatumType == "VOID*": + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith("L'"): try: @@ -1057,7 +1063,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if pcdvalue.startswith('{'): + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith("'"): try: @@ -1066,7 +1072,7 @@ class DscBuildData(PlatformBuildClassObject): except BadExpression, Value: EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) - if pcdvalue.startswith('{'): + if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']: pcdvalue = 'H' + pcdvalue elif pcdvalue.startswith('L'): pcdvalue = 'L"' + pcdvalue[1:] + '"' @@ -1080,9 +1086,12 @@ class DscBuildData(PlatformBuildClassObject): try: pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True) except BadExpression, Value: - EdkLogger.error('Parser', FORMAT_INVALID, - 'PCD [%s.%s] Value "%s", %s' % - (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) + try: + pcdvalue = '"' + pcdvalue + '"' + pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True) + except BadExpression, Value: + EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' % + (TokenSpaceGuidCName, TokenCName, pcdvalue, Value)) NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue) FoundFlag = True else: -- cgit v1.2.3