fix potential use after free in tcp
[oweals/gnunet.git] / contrib / find_typedefs.py
1 from __future__ import print_function
2 import os
3 import re
4 import sys
5
6 debug = False
7
8 def get_td_from_function_signature (line, file, num):
9   left_paren = line.find ('(')
10   if left_paren > 0:
11     left_paren += 1
12     line = line[left_paren:]
13     right_paren = line.find (')')
14     if right_paren > 0 and right_paren > left_paren and line[right_paren:].find ('(') >= 0:
15       fname = line[:right_paren]
16       fname = fname.lstrip (' ').lstrip ('*').lstrip (' ').rstrip (' ')
17       if len (fname) > 0:
18         if debug:
19           print ("from {0}:{1}".format (file, num))
20         print ("-T {0}".format (fname))
21
22 def get_td_from_simple_type (line, file, num):
23   line = line.rstrip (' ').rstrip ('\t').rstrip (' ').rstrip ('\t')
24   right_space = line.rfind (' ')
25   right_tab = line.rfind ('\t')
26   sep = right_tab if right_tab > right_space else right_space
27   sep += 1
28   tname = line[sep:]
29   tname = tname.lstrip ('*')
30   if len (tname) > 0:
31     if debug:
32       print ("from {0}:{1}".format (file, num))
33     print ("-T {0}".format (tname))
34
35 def find_typedefs (file):
36   with open (file, 'rb') as f:
37     td = False
38     td_struct = False
39     td_level = 0
40     td_line = []
41     data = f.read ()
42     for i, l in enumerate (data.splitlines (False)):
43       # Don't try to be too smart: only count lines that begin with 'typedef '
44       l = l.rstrip (' ').rstrip ('\t')
45       if len (l) == 0:
46         continue
47       if not td:
48         if l[:8] != 'typedef ':
49           continue
50         else:
51           td = True
52           if l[8:].lstrip (' ').lstrip ('\t')[:6] == 'struct':
53             td_struct = True
54       if td_struct:
55         leftcbrace = l.find ('{')
56         if leftcbrace >= 0:
57           if td_level == 0:
58             td_line.append (l[:leftcbrace])
59           l = l[leftcbrace + 1:]
60           td_level += 1
61         rightcbrace = l.rfind ('}')
62         if rightcbrace >= 0:
63           td_level -= 1
64           if td_level == 0:
65             td_line.append (l[rightcbrace + 1:])
66       else:
67         td_line.append (l)
68       if len (l) > 0 and l[-1] == ';' and (not td_struct or td_level == 0):
69         td_line = ' '.join (td_line)
70         td_line = td_line[:-1]
71         if len (td_line) > 0:
72           if td_line[-1] == ')':
73             get_td_from_function_signature (td_line, file, i)
74           else:
75             get_td_from_simple_type (td_line, file, i)
76         td_line = []
77         td = False
78         td_struct = False
79         td_level = 0
80       
81
82 def scan_dir (d):
83   for dirpath, dirs, files in os.walk (d):
84     for f in files:
85       if re.match (r'(?!lt_).+\.(c|cc|h)$', f):
86         file = os.path.join (dirpath, f)
87         find_typedefs (file)
88
89
90 if __name__ == '__main__':
91   if len (sys.argv[1:]) == 0:
92     arg = os.getcwd ()
93   else:
94     arg = sys.argv[1]
95   scan_dir (arg)