mirror of https://github.com/acidanthera/audk.git
BaseTools/Trim: Fix the bug for stripping when no line directive in file
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.zhu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
f79d7b62ba
commit
7cf1e91d61
|
@ -1,7 +1,7 @@
|
|||
## @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
|
||||
|
@ -29,7 +29,7 @@ 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+"*([^"]*)"')
|
||||
|
@ -37,6 +37,10 @@ gLineControlDirective = re.compile('^\s*#(?:line)?\s+([0-9]+)\s+"*([^"]*)"')
|
|||
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:
|
||||
|
@ -206,7 +210,34 @@ def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong):
|
|||
|
||||
# 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:
|
||||
|
|
Loading…
Reference in New Issue