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
|
from __future__ import print_function
import os
import re
import sys
debug = False
def get_td_from_function_signature (line, file, num):
left_paren = line.find ('(')
if left_paren > 0:
left_paren += 1
line = line[left_paren:]
right_paren = line.find (')')
if right_paren > 0 and right_paren > left_paren and line[right_paren:].find ('(') >= 0:
fname = line[:right_paren]
fname = fname.lstrip (' ').lstrip ('*').lstrip (' ').rstrip (' ')
if len (fname) > 0:
if debug:
print ("from {0}:{1}".format (file, num))
print ("-T {0}".format (fname))
def get_td_from_simple_type (line, file, num):
line = line.rstrip (' ').rstrip ('\t').rstrip (' ').rstrip ('\t')
right_space = line.rfind (' ')
right_tab = line.rfind ('\t')
sep = right_tab if right_tab > right_space else right_space
sep += 1
tname = line[sep:]
tname = tname.lstrip ('*')
if len (tname) > 0:
if debug:
print ("from {0}:{1}".format (file, num))
print ("-T {0}".format (tname))
def find_typedefs (file):
with open (file, 'rb') as f:
td = False
td_struct = False
td_level = 0
td_line = []
data = f.read ()
for i, l in enumerate (data.splitlines (False)):
# Don't try to be too smart: only count lines that begin with 'typedef '
l = l.rstrip (' ').rstrip ('\t')
if len (l) == 0:
continue
if not td:
if l[:8] != 'typedef ':
continue
else:
td = True
if l[8:].lstrip (' ').lstrip ('\t')[:6] == 'struct':
td_struct = True
if td_struct:
leftcbrace = l.find ('{')
if leftcbrace >= 0:
if td_level == 0:
td_line.append (l[:leftcbrace])
l = l[leftcbrace + 1:]
td_level += 1
rightcbrace = l.rfind ('}')
if rightcbrace >= 0:
td_level -= 1
if td_level == 0:
td_line.append (l[rightcbrace + 1:])
else:
td_line.append (l)
if len (l) > 0 and l[-1] == ';' and (not td_struct or td_level == 0):
td_line = ' '.join (td_line)
td_line = td_line[:-1]
if len (td_line) > 0:
if td_line[-1] == ')':
get_td_from_function_signature (td_line, file, i)
else:
get_td_from_simple_type (td_line, file, i)
td_line = []
td = False
td_struct = False
td_level = 0
def scan_dir (d):
for dirpath, dirs, files in os.walk (d):
for f in files:
if re.match (r'(?!lt_).+\.(c|cc|h)$', f):
file = os.path.join (dirpath, f)
find_typedefs (file)
if __name__ == '__main__':
if len (sys.argv[1:]) == 0:
arg = os.getcwd ()
else:
arg = sys.argv[1]
scan_dir (arg)
|