summaryrefslogtreecommitdiff
path: root/contrib/find_typedefs.py
blob: d6db597da3cefdb9c22b0320f38c830d7077e269 (plain)
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)