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

Reply via email to