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 <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Feng, YunhuaX
2018-02-26 16:42:30 +08:00
committed by Yonghong Zhu
parent f0c69b614c
commit ea927d2f3f
5 changed files with 123 additions and 65 deletions

View File

@ -1555,13 +1555,19 @@ class TopLevelMakefile(BuildFile):
for index, option in enumerate(GlobalData.gCommand):
if "--pcd" == option and GlobalData.gCommand[index+1]:
pcdName, pcdValue = GlobalData.gCommand[index+1].split('=')
if pcdValue.startswith('H'):
pcdValue = 'H' + '"' + pcdValue[1:] + '"'
ExtraOption += " --pcd " + pcdName + '=' + pcdValue
elif pcdValue.startswith("L'"):
ExtraOption += "--pcd " + pcdName + '=' + pcdValue
elif pcdValue.startswith('L'):
pcdValue = 'L' + '"' + pcdValue[1:] + '"'
for Item in GlobalData.BuildOptionPcd:
if '.'.join(Item[0:2]) == pcdName:
pcdValue = Item[2]
if pcdValue.startswith('L') or pcdValue.startswith('"'):
pcdValue, Size = ParseFieldValue(pcdValue)
NewVal = '{'
for S in range(Size):
NewVal = NewVal + '0x%02X' % ((pcdValue >> S * 8) & 0xff)
NewVal += ','
pcdValue = NewVal[:-1] + '}'
break
if pcdValue.startswith('{'):
pcdValue = 'H' + '"' + pcdValue + '"'
ExtraOption += " --pcd " + pcdName + '=' + pcdValue
else:
ExtraOption += " --pcd " + GlobalData.gCommand[index+1]