matcher.py revision 986c8b3d
1'''
2XML parser.  One function for each top-level element in the schema.
3
4Most functions just declare a new object and add it to the module.
5For typedefs, eventcopies, xidtypes, and other aliases though,
6we do not create a new type object, we just record the existing one under a new name.
7'''
8
9from os.path import join
10from xml.etree.cElementTree import parse
11
12from xcbgen.xtypes import *
13
14def import_(node, module, namespace):
15    '''
16    For imports, we load the file, create a new namespace object,
17    execute recursively, then record the import (for header files, etc.)
18    '''
19    # To avoid circular import error
20    from xcbgen import state
21    new_file = join(namespace.dir, '%s.xml' % node.text)
22    new_root = parse(new_file).getroot()
23    new_namespace = state.Namespace(new_file)
24    execute(module, new_namespace)
25    if not module.has_import(node.text):
26        module.add_import(node.text, new_namespace)
27
28def typedef(node, module, namespace):
29    id = node.get('newname')
30    name = namespace.prefix + (id,)
31    type = module.get_type(node.get('oldname'))
32    module.add_type(id, namespace.ns, name, type)
33
34def xidtype(node, module, namespace):
35    id = node.get('name')
36    name = namespace.prefix + (id,)
37    type = module.get_type('CARD32')
38    module.add_type(id, namespace.ns, name, type)
39
40def xidunion(node, module, namespace):
41    id = node.get('name')
42    name = namespace.prefix + (id,)
43    type = module.get_type('CARD32')
44    module.add_type(id, namespace.ns, name, type)
45
46def enum(node, module, namespace):
47    id = node.get('name')
48    name = namespace.prefix + (id,)
49    type = Enum(name, node)
50    module.add_type(id, namespace.ns, name, type)
51
52def struct(node, module, namespace):
53    id = node.get('name')
54    name = namespace.prefix + (id,)
55    type = Struct(name, node)
56    module.add_type(id, namespace.ns, name, type)
57
58def union(node, module, namespace):
59    id = node.get('name')
60    name = namespace.prefix + (id,)
61    type = Union(name, node)
62    module.add_type(id, namespace.ns, name, type)
63
64def request(node, module, namespace):
65    id = node.get('name')
66    name = namespace.prefix + (id,)
67    type = Request(name, node)
68    module.add_request(id, name, type)
69
70def event(node, module, namespace):
71    id = node.get('name')
72    name = namespace.prefix + (id,)
73    event = Event(name, node)
74    event.add_opcode(node.get('number'), name, True)
75    module.add_event(id, name, event)
76
77def eventcopy(node, module, namespace):
78    id = node.get('name')
79    name = namespace.prefix + (id,)
80    event = module.get_event(node.get('ref'))
81    event.add_opcode(node.get('number'), name, False)
82    module.add_event(id, name, event)
83
84def error(node, module, namespace):
85    id = node.get('name')
86    name = namespace.prefix + (id,)
87    error = Error(name, node)
88    error.add_opcode(node.get('number'), name, True)
89    module.add_error(id, name, error)
90
91def errorcopy(node, module, namespace):
92    id = node.get('name')
93    name = namespace.prefix + (id,)
94    error = module.get_error(node.get('ref'))
95    error.add_opcode(node.get('number'), name, False)
96    module.add_error(id, name, error)
97
98funcs = {'import' : import_,
99         'typedef' : typedef,
100         'xidtype' : xidtype,
101         'xidunion' : xidunion,
102         'enum' : enum,
103         'struct' : struct,
104         'union' : union,
105         'request' : request,
106         'event' : event,
107         'eventcopy' : eventcopy,
108         'error' : error,
109         'errorcopy' : errorcopy}
110
111def execute(module, namespace):
112    for elt in list(namespace.root):
113        funcs[elt.tag](elt, module, namespace)
114