]> begriffs open source - cmsis-freertos/blob - Test/VeriFast/scripts/extract.py
Merge branch 'develop'
[cmsis-freertos] / Test / VeriFast / scripts / extract.py
1 #!/usr/bin/env python3
2 from __future__ import print_function
3 import sys
4 from enum import Enum
5
6
7 class Extractor(object):
8     @staticmethod
9     def __parse_ctags(tags_filename):
10         def convert_excmd(excmd):
11             assert excmd.endswith(';"')
12             linenum = excmd[:-2]  # remove ';"'
13             return int(linenum)
14         result = {}
15         with open(tags_filename) as f:
16             for line in f:
17                 if line.startswith('!'):
18                     continue
19                 parts = line.split('\t')
20                 funcname = parts[0]
21                 funcfile = parts[1]
22                 linenum = convert_excmd(parts[2])
23                 result[funcname] = (funcfile, linenum)
24         return result
25
26     def __init__(self, tags_filename):
27         self.map = Extractor.__parse_ctags(tags_filename)
28
29     class State(Enum):
30         INIT = 0
31         HEAD = 1
32         BODY = 2
33
34     def text_of_funcname(self, funcname):
35         if funcname not in self.map:
36             return []
37         funcfile, linenum = self.map[funcname]
38         result = []
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:
45                     result.append(line)
46                     lbrace = line.count('{')
47                     rbrace = line.count('}')
48                     bracecount += lbrace
49                     bracecount -= rbrace
50                     if '{' in line:
51                         state = Extractor.State.BODY
52                         continue
53                 if state == Extractor.State.BODY:
54                     result.append(line)
55                     lbrace = line.count('{')
56                     rbrace = line.count('}')
57                     bracecount += lbrace
58                     bracecount -= rbrace
59                     if bracecount == 0:
60                         break
61         return result
62
63
64 if __name__ == "__main__":
65     if len(sys.argv) != 3:
66         print("Usage: %s <tagfile> <funcname>" % sys.argv[0])
67         sys.exit(1)
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))
73     sys.exit(0)