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 functions defined in a |
| 5 | # C file. |
| 6 | # |
| 7 | # This is a simple example of traversing the AST generated by |
Eli Bendersky | 904cecd | 2015-12-12 14:47:21 -0800 | [diff] [blame] | 8 | # pycparser. Call it from the root directory of pycparser. |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 9 | # |
Jon Dufresne | 1d86699 | 2018-06-26 13:49:35 -0700 | [diff] [blame^] | 10 | # Eli Bendersky [https://eli.thegreenplace.net/] |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 11 | # License: BSD |
| 12 | #----------------------------------------------------------------- |
| 13 | from __future__ import print_function |
| 14 | import sys |
| 15 | |
| 16 | # This is not required if you've installed pycparser into |
| 17 | # your site-packages/ with setup.py |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 18 | sys.path.extend(['.', '..']) |
| 19 | |
| 20 | from pycparser import c_parser, c_ast, parse_file |
| 21 | |
| 22 | |
| 23 | # A simple visitor for FuncDef nodes that prints the names and |
| 24 | # locations of function definitions. |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 25 | class FuncDefVisitor(c_ast.NodeVisitor): |
| 26 | def visit_FuncDef(self, node): |
| 27 | print('%s at %s' % (node.decl.name, node.decl.coord)) |
| 28 | |
| 29 | |
| 30 | def show_func_defs(filename): |
| 31 | # Note that cpp is used. Provide a path to your own cpp or |
| 32 | # make sure one exists in PATH. |
Eli Bendersky | 904cecd | 2015-12-12 14:47:21 -0800 | [diff] [blame] | 33 | ast = parse_file(filename, use_cpp=True, |
| 34 | cpp_args=r'-Iutils/fake_libc_include') |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 35 | |
| 36 | v = FuncDefVisitor() |
| 37 | v.visit(ast) |
| 38 | |
| 39 | |
| 40 | if __name__ == "__main__": |
| 41 | if len(sys.argv) > 1: |
| 42 | filename = sys.argv[1] |
| 43 | else: |
Eli Bendersky | 331f81f | 2015-04-21 14:42:56 -0700 | [diff] [blame] | 44 | filename = 'examples/c_files/memmgr.c' |
Eli Bendersky | a291586 | 2012-06-23 06:25:53 +0300 | [diff] [blame] | 45 | |
| 46 | show_func_defs(filename) |