2 from __future__ import print_function
7 class Extractor(object):
9 def __parse_ctags(tags_filename):
10 def convert_excmd(excmd):
11 assert excmd.endswith(';"')
12 linenum = excmd[:-2] # remove ';"'
15 with open(tags_filename) as f:
17 if line.startswith('!'):
19 parts = line.split('\t')
22 linenum = convert_excmd(parts[2])
23 result[funcname] = (funcfile, linenum)
26 def __init__(self, tags_filename):
27 self.map = Extractor.__parse_ctags(tags_filename)
34 def text_of_funcname(self, funcname):
35 if funcname not in self.map:
37 funcfile, linenum = self.map[funcname]
39 state, bracecount = Extractor.State.INIT, 0
40 with open(funcfile) as f:
41 for i, line in enumerate(f, start=1): # ctags counts linenums from 1
42 if state == Extractor.State.INIT and linenum <= i:
43 state = Extractor.State.HEAD
44 if state == Extractor.State.HEAD:
46 lbrace = line.count('{')
47 rbrace = line.count('}')
51 state = Extractor.State.BODY
53 if state == Extractor.State.BODY:
55 lbrace = line.count('{')
56 rbrace = line.count('}')
64 if __name__ == "__main__":
65 if len(sys.argv) != 3:
66 print("Usage: %s <tagfile> <funcname>" % sys.argv[0])
68 tag_filename = sys.argv[1]
69 funcname = sys.argv[2]
70 extractor = Extractor('tags')
71 result = extractor.text_of_funcname(funcname)
72 print(''.join(result))