matcher.py revision 986c8b3d
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 21d4401354Smrg new_file = join(namespace.dir, '%s.xml' % node.text) 22d4401354Smrg new_root = parse(new_file).getroot() 23d4401354Smrg new_namespace = state.Namespace(new_file) 24d4401354Smrg execute(module, new_namespace) 25d4401354Smrg if not module.has_import(node.text): 26d4401354Smrg module.add_import(node.text, new_namespace) 27d4401354Smrg 28d4401354Smrgdef typedef(node, module, namespace): 29d4401354Smrg id = node.get('newname') 30d4401354Smrg name = namespace.prefix + (id,) 31d4401354Smrg type = module.get_type(node.get('oldname')) 32d4401354Smrg module.add_type(id, namespace.ns, name, type) 33d4401354Smrg 34d4401354Smrgdef xidtype(node, module, namespace): 35d4401354Smrg id = node.get('name') 36d4401354Smrg name = namespace.prefix + (id,) 37d4401354Smrg type = module.get_type('CARD32') 38d4401354Smrg module.add_type(id, namespace.ns, name, type) 39d4401354Smrg 40d4401354Smrgdef xidunion(node, module, namespace): 41d4401354Smrg id = node.get('name') 42d4401354Smrg name = namespace.prefix + (id,) 43d4401354Smrg type = module.get_type('CARD32') 44d4401354Smrg module.add_type(id, namespace.ns, name, type) 45d4401354Smrg 46d4401354Smrgdef enum(node, module, namespace): 47d4401354Smrg id = node.get('name') 48d4401354Smrg name = namespace.prefix + (id,) 49d4401354Smrg type = Enum(name, node) 50d4401354Smrg module.add_type(id, namespace.ns, name, type) 51d4401354Smrg 52d4401354Smrgdef struct(node, module, namespace): 53d4401354Smrg id = node.get('name') 54d4401354Smrg name = namespace.prefix + (id,) 55d4401354Smrg type = Struct(name, node) 56d4401354Smrg module.add_type(id, namespace.ns, name, type) 57d4401354Smrg 58d4401354Smrgdef union(node, module, namespace): 59d4401354Smrg id = node.get('name') 60d4401354Smrg name = namespace.prefix + (id,) 61d4401354Smrg type = Union(name, node) 62d4401354Smrg module.add_type(id, namespace.ns, name, type) 63d4401354Smrg 64d4401354Smrgdef request(node, module, namespace): 65d4401354Smrg id = node.get('name') 66d4401354Smrg name = namespace.prefix + (id,) 67d4401354Smrg type = Request(name, node) 68d4401354Smrg module.add_request(id, name, type) 69d4401354Smrg 70d4401354Smrgdef event(node, module, namespace): 71d4401354Smrg id = node.get('name') 72d4401354Smrg name = namespace.prefix + (id,) 73d4401354Smrg event = Event(name, node) 74d4401354Smrg event.add_opcode(node.get('number'), name, True) 75d4401354Smrg module.add_event(id, name, event) 76d4401354Smrg 77d4401354Smrgdef eventcopy(node, module, namespace): 78d4401354Smrg id = node.get('name') 79d4401354Smrg name = namespace.prefix + (id,) 80d4401354Smrg event = module.get_event(node.get('ref')) 81d4401354Smrg event.add_opcode(node.get('number'), name, False) 82d4401354Smrg module.add_event(id, name, event) 83d4401354Smrg 84d4401354Smrgdef error(node, module, namespace): 85d4401354Smrg id = node.get('name') 86d4401354Smrg name = namespace.prefix + (id,) 87d4401354Smrg error = Error(name, node) 88d4401354Smrg error.add_opcode(node.get('number'), name, True) 89d4401354Smrg module.add_error(id, name, error) 90d4401354Smrg 91d4401354Smrgdef errorcopy(node, module, namespace): 92d4401354Smrg id = node.get('name') 93d4401354Smrg name = namespace.prefix + (id,) 94d4401354Smrg error = module.get_error(node.get('ref')) 95d4401354Smrg error.add_opcode(node.get('number'), name, False) 96d4401354Smrg module.add_error(id, name, error) 97d4401354Smrg 98d4401354Smrgfuncs = {'import' : import_, 99d4401354Smrg 'typedef' : typedef, 100d4401354Smrg 'xidtype' : xidtype, 101d4401354Smrg 'xidunion' : xidunion, 102d4401354Smrg 'enum' : enum, 103d4401354Smrg 'struct' : struct, 104d4401354Smrg 'union' : union, 105d4401354Smrg 'request' : request, 106d4401354Smrg 'event' : event, 107d4401354Smrg 'eventcopy' : eventcopy, 108d4401354Smrg 'error' : error, 109d4401354Smrg 'errorcopy' : errorcopy} 110d4401354Smrg 111d4401354Smrgdef execute(module, namespace): 112d4401354Smrg for elt in list(namespace.root): 113d4401354Smrg funcs[elt.tag](elt, module, namespace) 114