when no line directive in file, the tool still need to strip the typedef statement (eg: typedef struct, typedef union ..).
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yonghong Zhu <yonghong....@intel.com> --- BaseTools/Source/Python/Trim/Trim.py | 37 +++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/Python/Trim/Trim.py b/BaseTools/Source/Python/Trim/Trim.py index 8fefa1b..e5fe730 100644 --- a/BaseTools/Source/Python/Trim/Trim.py +++ b/BaseTools/Source/Python/Trim/Trim.py @@ -1,9 +1,9 @@ ## @file # Trim files preprocessed by compiler # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # 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 # http://opensource.org/licenses/bsd-license.php # @@ -27,18 +27,22 @@ import Common.EdkLogger as EdkLogger from Common.LongFilePathSupport import OpenLongFilePath as open # Version and Copyright __version_number__ = ("0.10" + " " + gBUILD_VERSION) __version__ = "%prog Version " + __version_number__ -__copyright__ = "Copyright (c) 2007-2010, Intel Corporation. All rights reserved." +__copyright__ = "Copyright (c) 2007-2016, Intel Corporation. All rights reserved." ## Regular expression for matching Line Control directive like "#line xxx" gLineControlDirective = re.compile('^\s*#(?:line)?\s+([0-9]+)\s+"*([^"]*)"') ## Regular expression for matching "typedef struct" gTypedefPattern = re.compile("^\s*typedef\s+struct(\s+\w+)?\s*[{]*$", re.MULTILINE) ## Regular expression for matching "#pragma pack" gPragmaPattern = re.compile("^\s*#pragma\s+pack", re.MULTILINE) +## Regular expression for matching "typedef" +gTypedef_SinglePattern = re.compile("^\s*typedef", re.MULTILINE) +## Regular expression for matching "typedef struct, typedef union, struct, union" +gTypedef_MulPattern = re.compile("^\s*(typedef)?\s+(struct|union)(\s+\w+)?\s*[{]*$", re.MULTILINE) # # The following number pattern match will only match if following criteria is met: # There is leading non-(alphanumeric or _) character, and no following alphanumeric or _ # as the pattern is greedily match, so it is ok for the gDecNumberPattern or gHexNumberPattern to grab the maximum match @@ -204,11 +208,38 @@ def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong): else: NewLines.append(Line) # in case there's no line directive or linemarker found if (not LineControlDirectiveFound) and NewLines == []: - NewLines = Lines + MulPatternFlag = False + SinglePatternFlag = False + Brace = 0 + for Index in range(len(Lines)): + Line = Lines[Index] + if MulPatternFlag == False and gTypedef_MulPattern.search(Line) == None: + if SinglePatternFlag == False and gTypedef_SinglePattern.search(Line) == None: + # remove "#pragram pack" directive + if gPragmaPattern.search(Line) == None: + NewLines.append(Line) + continue + elif SinglePatternFlag == False: + SinglePatternFlag = True + if Line.find(";") >= 0: + SinglePatternFlag = False + elif MulPatternFlag == False: + # found "typedef struct, typedef union, union, struct", keep its position and set a flag + MulPatternFlag = True + + # match { and } to find the end of typedef definition + if Line.find("{") >= 0: + Brace += 1 + elif Line.find("}") >= 0: + Brace -= 1 + + # "typedef struct, typedef union, union, struct" must end with a ";" + if Brace == 0 and Line.find(";") >= 0: + MulPatternFlag = False # save to file try: f = open (Target, 'wb') except: -- 2.6.1.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel