From d5988a8ac9716130a323fb12bbf81c41807c7865 Mon Sep 17 00:00:00 2001 From: Yonghong Zhu Date: Tue, 30 Jan 2018 23:01:31 +0800 Subject: [PATCH] BaseTools: Update BPDG to support L'' and '' format as VPD Pcd Value Current Pcd value support flexible format, this patch add support for BPDG Tool to support L'' and '' format. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yonghong Zhu Reviewed-by: Liming Gao --- BaseTools/Source/Python/BPDG/GenVpd.py | 32 +++++++++++++++----------- BaseTools/Source/Python/Common/Misc.py | 6 ++--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/BaseTools/Source/Python/BPDG/GenVpd.py b/BaseTools/Source/Python/BPDG/GenVpd.py index ec4da230a4..cdfc420c66 100644 --- a/BaseTools/Source/Python/BPDG/GenVpd.py +++ b/BaseTools/Source/Python/BPDG/GenVpd.py @@ -62,7 +62,7 @@ class PcdEntry: self._GenOffsetValue () - ## Analyze the string value to judge the PCD's datum type euqal to Boolean or not. + ## Analyze the string value to judge the PCD's datum type equal to Boolean or not. # # @param ValueString PCD's value # @param Size PCD's size @@ -165,18 +165,18 @@ class PcdEntry: ## Pack VOID* type VPD PCD's value form string to binary type. # # The VOID* type of string divided into 3 sub-type: - # 1: L"String", Unicode type string. - # 2: "String", Ascii type string. + # 1: L"String"/L'String', Unicode type string. + # 2: "String"/'String', Ascii type string. # 3: {bytearray}, only support byte-array. # # @param ValueString The Integer type string for pack. # def _PackPtrValue(self, ValueString, Size): - if ValueString.startswith('L"'): + if ValueString.startswith('L"') or ValueString.startswith("L'"): self._PackUnicode(ValueString, Size) elif ValueString.startswith('{') and ValueString.endswith('}'): self._PackByteArray(ValueString, Size) - elif ValueString.startswith('"') and ValueString.endswith('"'): + elif (ValueString.startswith('"') and ValueString.endswith('"')) or (ValueString.startswith("'") and ValueString.endswith("'")): self._PackString(ValueString, Size) else: EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, @@ -184,7 +184,7 @@ class PcdEntry: ## Pack an Ascii PCD value. # - # An Ascii string for a PCD should be in format as "". + # An Ascii string for a PCD should be in format as ""/''. # def _PackString(self, ValueString, Size): if (Size < 0): @@ -192,11 +192,14 @@ class PcdEntry: "Invalid parameter Size %s of PCD %s!(File: %s Line: %s)" % (self.PcdBinSize, self.PcdCName, self.FileName, self.Lineno)) if (ValueString == ""): EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "Invalid parameter ValueString %s of PCD %s!(File: %s Line: %s)" % (self.PcdUnpackValue, self.PcdCName, self.FileName, self.Lineno)) - if (len(ValueString) < 2): - EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "For PCD: %s ,ASCII string %s at least contains two!(File: %s Line: %s)" % (self.PcdCName, self.PcdUnpackValue, self.FileName, self.Lineno)) + + QuotedFlag = True + if ValueString.startswith("'"): + QuotedFlag = False ValueString = ValueString[1:-1] - if len(ValueString) + 1 > Size: + # No null-terminator in 'string' + if (QuotedFlag and len(ValueString) + 1 > Size) or (not QuotedFlag and len(ValueString) > Size): EdkLogger.error("BPDG", BuildToolError.RESOURCE_OVERFLOW, "PCD value string %s is exceed to size %d(File: %s Line: %s)" % (ValueString, Size, self.FileName, self.Lineno)) try: @@ -259,19 +262,20 @@ class PcdEntry: ## Pack a unicode PCD value into byte array. # - # A unicode string for a PCD should be in format as L"". + # A unicode string for a PCD should be in format as L""/L''. # def _PackUnicode(self, UnicodeString, Size): if (Size < 0): EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "Invalid parameter Size %s of PCD %s!(File: %s Line: %s)" % \ (self.PcdBinSize, self.PcdCName, self.FileName, self.Lineno)) - if (len(UnicodeString) < 3): - EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "For PCD: %s ,ASCII string %s at least contains two!(File: %s Line: %s)" % \ - (self.PcdCName, self.PcdUnpackValue, self.FileName, self.Lineno)) + QuotedFlag = True + if UnicodeString.startswith("L'"): + QuotedFlag = False UnicodeString = UnicodeString[2:-1] - if (len(UnicodeString) + 1) * 2 > Size: + # No null-terminator in L'string' + if (QuotedFlag and (len(UnicodeString) + 1) * 2 > Size) or (not QuotedFlag and len(UnicodeString) * 2 > Size): EdkLogger.error("BPDG", BuildToolError.RESOURCE_OVERFLOW, "The size of unicode string %s is too larger for size %s(File: %s Line: %s)" % \ (UnicodeString, Size, self.FileName, self.Lineno)) diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py index a8ed718aa5..ef52154f47 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -1,7 +1,7 @@ ## @file # Common routines used by all tools # -# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -1818,10 +1818,10 @@ def CheckPcdDatum(Type, Value): if Type == "VOID*": ValueRe = re.compile(r'\s*L?\".*\"\s*$') if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"')) - or (Value.startswith('{') and Value.endswith('}')) + or (Value.startswith('{') and Value.endswith('}')) or (Value.startswith("L'") or Value.startswith("'") and Value.endswith("'")) ): return False, "Invalid value [%s] of type [%s]; must be in the form of {...} for array"\ - ", or \"...\" for string, or L\"...\" for unicode string" % (Value, Type) + ", \"...\" or \'...\' for string, L\"...\" or L\'...\' for unicode string" % (Value, Type) elif ValueRe.match(Value): # Check the chars in UnicodeString or CString is printable if Value.startswith("L"):