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