summaryrefslogtreecommitdiff
path: root/FreeRTOS/Test/VeriFast/scripts/extract.py
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Test/VeriFast/scripts/extract.py')
-rwxr-xr-xFreeRTOS/Test/VeriFast/scripts/extract.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/FreeRTOS/Test/VeriFast/scripts/extract.py b/FreeRTOS/Test/VeriFast/scripts/extract.py
new file mode 100755
index 000000000..0b74d79a9
--- /dev/null
+++ b/FreeRTOS/Test/VeriFast/scripts/extract.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+from __future__ import print_function
+import sys
+from enum import Enum
+
+
+class Extractor(object):
+ @staticmethod
+ def __parse_ctags(tags_filename):
+ def convert_excmd(excmd):
+ assert excmd.endswith(';"')
+ linenum = excmd[:-2] # remove ';"'
+ return int(linenum)
+ result = {}
+ with open(tags_filename) as f:
+ for line in f:
+ if line.startswith('!'):
+ continue
+ parts = line.split('\t')
+ funcname = parts[0]
+ funcfile = parts[1]
+ linenum = convert_excmd(parts[2])
+ result[funcname] = (funcfile, linenum)
+ return result
+
+ def __init__(self, tags_filename):
+ self.map = Extractor.__parse_ctags(tags_filename)
+
+ class State(Enum):
+ INIT = 0
+ HEAD = 1
+ BODY = 2
+
+ def text_of_funcname(self, funcname):
+ if funcname not in self.map:
+ return []
+ funcfile, linenum = self.map[funcname]
+ result = []
+ state, bracecount = Extractor.State.INIT, 0
+ with open(funcfile) as f:
+ for i, line in enumerate(f, start=1): # ctags counts linenums from 1
+ if state == Extractor.State.INIT and linenum <= i:
+ state = Extractor.State.HEAD
+ if state == Extractor.State.HEAD:
+ result.append(line)
+ lbrace = line.count('{')
+ rbrace = line.count('}')
+ bracecount += lbrace
+ bracecount -= rbrace
+ if '{' in line:
+ state = Extractor.State.BODY
+ continue
+ if state == Extractor.State.BODY:
+ result.append(line)
+ lbrace = line.count('{')
+ rbrace = line.count('}')
+ bracecount += lbrace
+ bracecount -= rbrace
+ if bracecount == 0:
+ break
+ return result
+
+
+if __name__ == "__main__":
+ if len(sys.argv) != 3:
+ print("Usage: %s <tagfile> <funcname>" % sys.argv[0])
+ sys.exit(1)
+ tag_filename = sys.argv[1]
+ funcname = sys.argv[2]
+ extractor = Extractor('tags')
+ result = extractor.text_of_funcname(funcname)
+ print(''.join(result))
+ sys.exit(0)