Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 1 | #----------------------------------------------------------------- |
| 2 | # pycparser: func_defs.py |
| 3 | # |
| 4 | # Using pycparser for printing out all the calls of some function |
| 5 | # in a C file. |
| 6 | # |
Eli Bendersky | 331f81f | 2015-04-21 14:42:56 -0700 | [diff] [blame] | 7 | # Copyright (C) 2008-2015, Eli Bendersky |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 8 | # License: BSD |
| 9 | #----------------------------------------------------------------- |
| 10 | from __future__ import print_function |
| 11 | import sys |
| 12 | |
| 13 | # This is not required if you've installed pycparser into |
| 14 | # your site-packages/ with setup.py |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 15 | sys.path.extend(['.', '..']) |
| 16 | |
| 17 | from pycparser import c_parser, c_ast, parse_file |
| 18 | |
| 19 | |
| 20 | # A visitor with some state information (the funcname it's |
| 21 | # looking for) |
| 22 | # |
| 23 | class FuncCallVisitor(c_ast.NodeVisitor): |
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 24 | def __init__(self, funcname): |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 25 | self.funcname = funcname |
| 26 | |
| 27 | def visit_FuncCall(self, node): |
| 28 | if node.name.name == self.funcname: |
Eli Bendersky | 331f81f | 2015-04-21 14:42:56 -0700 | [diff] [blame] | 29 | print('%s called at %s' % (self.funcname, node.name.coord)) |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 30 | |
| 31 | |
| 32 | def show_func_calls(filename, funcname): |
| 33 | ast = parse_file(filename, use_cpp=True) |
| 34 | v = FuncCallVisitor(funcname) |
| 35 | v.visit(ast) |
| 36 | |
| 37 | |
| 38 | if __name__ == "__main__": |
| 39 | if len(sys.argv) > 2: |
| 40 | filename = sys.argv[1] |
| 41 | func = sys.argv[2] |
| 42 | else: |
Eli Bendersky | 331f81f | 2015-04-21 14:42:56 -0700 | [diff] [blame] | 43 | filename = 'examples/c_files/hash.c' |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 44 | func = 'malloc' |
| 45 | |
| 46 | show_func_calls(filename, func) |