/
misc.py
64 lines (55 loc) · 1.87 KB
/
misc.py
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
from ctypeslib.codegen import typedesc
#from ctypeslib.codegen.gccxmlparser import parse
from gccxmlparser import parse
def query_items(xml):
# XXX: support filter
xml_items = parse(xml)
#items = {}
keep = set()
named = {}
locations = {}
for it in xml_items:
#items[it] = it
keep.add(it)
if hasattr(it, 'name'):
named[it] = it.name
if hasattr(it, 'location'):
locations[it] = it.location
return keep, named, locations
def classify(items, locations, ifilter=None):
# Dictionaries name -> typedesc instances
funcs = {}
tpdefs = {}
enumvals = {}
enums = {}
structs = {}
vars = {}
unions = {}
if ifilter is None:
ifilter = lambda x : True
for it in items:
try:
origin = locations[it][0]
if ifilter(origin):
if isinstance(it, typedesc.Function):
funcs[it.name] = it
elif isinstance(it, typedesc.EnumValue):
enumvals[it.name] = it
elif isinstance(it, typedesc.Enumeration):
enums[it.name] = it
elif isinstance(it, typedesc.Typedef):
tpdefs[it.name] = it
elif isinstance(it, typedesc.Structure):
structs[it.name] = it
elif isinstance(it, typedesc.Variable):
vars[it.name] = it
elif isinstance(it, typedesc.Union):
unions[it.name] = it
else:
print "Do not know how to classify", str(it)
except KeyError:
if isinstance(it, typedesc.EnumValue):
enumvals[it.name] = it
else:
print "No location for item %s, ignoring" % str(it)
return funcs, tpdefs, enumvals, enums, structs, unions, vars