forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcppFunctionSkipper.py
99 lines (87 loc) · 3.39 KB
/
cppFunctionSkipper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from builtins import range
__author__="Aurelija"
__date__ ="$2010-09-23 15.00.20$"
import re
declarator = '(\\*|&)?(\\w|<|,|>|$|::)+'
cv_decl = '\\s*(const|volatile|noexcept)\\s*'
exception = 'throw\\(((::)|\\w|\\s|,|<|>)*\\)'
decl_param = '\\s((\\(%s\\))|(%s))\\s*\\((\\w|\\s|\\*|&|\\.|=|\'|\"|-|<|>|,|(::))*\\)'%(declarator, declarator)
operator = '(%s|)operator\\s*(\\(\\)|\\[\\]|\\s+(new|delete)(\\s*\\[\\]|)|\\-\\>[*]{0,1}|[+\\-*/%%^&|~!=<>,]{1,2}(=|))'%(declarator)
dm_init = '(:[^{]*)'
functStart_re = re.compile('(\\s|~|^)((\\(%s\\))|(%s)|(%s))\\s*\\((%s|\\w|\\s|\\*|&|\\.|=|\'|\"|-|<|>|,|::)*\\)(%s)?(%s)?\\s*(%s)?\\s*{'%(declarator, declarator, operator, decl_param, cv_decl, exception,dm_init), re.MULTILINE)
def filterFiles(fileList):
files = []
for i in range(len(fileList)):
if type(fileList[0]).__name__ != 'tuple':
file = fileList[i]
fileLines = filterFile(fileList[i])
else:
file = fileList[i][0]
fileLines = filterFile(fileList[i][1])
files.append((file, fileLines))
return files
def filterFile(file):
lines = ""
if type(file).__name__ != 'list':
lines = open(file, errors='replace').read()
else:
for line in file:
lines += line
fileLines = lines[:]
prevEndPosition = 0
endPosition = 0
while(True):
m = functStart_re.search(lines)
if m != None:
openBracket = 1
closeBracket = 0
startPosition = m.start()
#print "MATCH: " + lines[m.start():m.end()]
for i, character in enumerate(lines[m.end():]):
if character == "{":
openBracket += 1
elif character == "}":
closeBracket += 1
if openBracket == closeBracket :
prevEndPosition += endPosition
endPosition = m.end() + i + 1
break
if openBracket != closeBracket:#if there is error in file
print("Error in file. To much open brackets. Run commentSkipper before you run functionSkipper.")
break
else:
#print "LINES: \n" + lines[startPosition:endPosition]
#print "#############################################";
lines = delLines(lines, startPosition, endPosition)
fileLines = fileLines[:prevEndPosition] + lines
lines = lines[endPosition:]
else:
break
listOfLines = []
startLine = 0
for index, character in enumerate(fileLines):
if character == "\n":
listOfLines.append(fileLines[startLine:index+1])
startLine = index + 1
listOfLines.append(fileLines[startLine:])
return listOfLines
def delLines(string, startPosition, endPosition):
i = startPosition - 1
end = startPosition
while(True):
if i != -1 and string[i] != '\n':
i -= 1
else:
string = string[:i+1] + (end - i - 1)*' ' + string[end:]
break
i = startPosition
start = startPosition
while(i != endPosition):
if string[i] != '\n':
i += 1
else:
string = string[:start] + (i-start)*str(" ") + string[i:]
i = i+1
start = i
string = string[:start] + (endPosition-start)*str(" ") + string[endPosition:]
return string