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