Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +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 | 1a1e46b | 2011-02-18 15:32:18 +0200 | [diff] [blame] | 7 | # Copyright (C) 2008-2011, Eli Bendersky
|
eli.bendersky | 84a6a63 | 2011-04-29 09:00:43 +0300 | [diff] [blame] | 8 | # License: BSD
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 9 | #-----------------------------------------------------------------
|
eli.bendersky | 1a1e46b | 2011-02-18 15:32:18 +0200 | [diff] [blame] | 10 | from __future__ import print_function
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 11 | import sys
|
| 12 |
|
| 13 | # This is not required if you've installed pycparser into
|
| 14 | # your site-packages/ with setup.py
|
| 15 | #
|
Ben | f86dea1 | 2012-02-03 06:24:55 +0200 | [diff] [blame] | 16 | sys.path.extend(['.', '..'])
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 17 |
|
| 18 | from pycparser import c_parser, c_ast, parse_file
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 19 |
|
| 20 |
|
| 21 | # A visitor with some state information (the funcname it's
|
| 22 | # looking for)
|
| 23 | #
|
| 24 | class FuncCallVisitor(c_ast.NodeVisitor):
|
| 25 | def __init__(self, funcname): |
| 26 | self.funcname = funcname
|
| 27 |
|
| 28 | def visit_FuncCall(self, node):
|
| 29 | if node.name.name == self.funcname:
|
eli.bendersky | 1a1e46b | 2011-02-18 15:32:18 +0200 | [diff] [blame] | 30 | print('%s called at %s' % (
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 31 | self.funcname, node.name.coord))
|
| 32 |
|
| 33 |
|
| 34 | def show_func_calls(filename, funcname):
|
| 35 | ast = parse_file(filename, use_cpp=True)
|
| 36 | v = FuncCallVisitor(funcname)
|
| 37 | v.visit(ast)
|
| 38 |
|
| 39 |
|
| 40 | if __name__ == "__main__":
|
| 41 | if len(sys.argv) > 2:
|
eli.bendersky | 1a1e46b | 2011-02-18 15:32:18 +0200 | [diff] [blame] | 42 | filename = sys.argv[1]
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 43 | func = sys.argv[2]
|
| 44 | else:
|
| 45 | filename = 'c_files/hash.c'
|
| 46 | func = 'malloc'
|
| 47 |
|
| 48 | show_func_calls(filename, func)
|
| 49 |
|
| 50 |
|
| 51 |
|