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