forked from PyAV-Org/PyAV
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse.py
More file actions
65 lines (51 loc) · 1.92 KB
/
Copy pathparse.py
File metadata and controls
65 lines (51 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from Cython.Compiler.Main import compile_single, CompilationOptions
from Cython.Compiler.TreeFragment import parse_from_strings
from Cython.Compiler.Visitor import TreeVisitor
from Cython.Compiler import Nodes
from Cython.Compiler.AutoDocTransforms import EmbedSignature
options = CompilationOptions()
options.include_path.append('include')
options.language_level = 2
options.compiler_directives = dict(
c_string_type='str',
c_string_encoding='ascii',
)
ctx = options.create_context()
tree = parse_from_strings('include.libavutil.avutil', open('scratchpad/test.pxd').read().decode('utf8'), ctx)
class Visitor(TreeVisitor):
def __init__(self, state=None):
super(Visitor, self).__init__()
self.state = dict(state or {})
self.events = []
def record_event(self, node, **kw):
state = self.state.copy()
state.update(**kw)
state['pos'] = node.pos
state['end_pos'] = node.end_pos()
self.events.append(state)
def visit_Node(self, node):
self.visitchildren(node)
def visit_CDefExternNode(self, node):
self.state['extern_from'] = node.include_file
self.visitchildren(node)
self.state.pop('extern_from')
def visit_CStructOrUnionDefNode(self, node):
self.record_event(node, struct=node.name)
# self.visitchildren(node)
def visit_CFuncDeclaratorNode(self, node):
if isinstance(node.base, Nodes.CNameDeclaratorNode):
self.record_event(node, function=node.base.name)
print EmbedSignature(ctx)._fmt_arglist(node.args)
else:
self.visitchildren(node)
def visit_CVarDefNode(self, node):
if isinstance(node.declarators[0], Nodes.CNameDeclaratorNode):
self.record_event(node, variable=node.declarators[0].name)
else:
self.visitchildren(node)
v = Visitor()
v.visit(tree)
for e in v.events:
pass
#print e
#print tree.dump()