2 This module contains the namespace class and the singleton module class.
4 from os.path import dirname, basename
5 from xml.etree.cElementTree import parse
7 from xcbgen import matcher
8 from xcbgen.error import *
9 from xcbgen.xtypes import *
13 class Namespace(object):
15 Contains the naming information for an extension.
19 header is the header attribute ("header file" name).
20 is_ext is true for extensions, false for xproto.
21 major_version and minor_version are extension version info.
22 ext_xname is the X extension name string.
23 ext_name is the XCB extension name prefix.
25 def __init__(self, filename):
28 self.dir = dirname(filename)
29 self.file = basename(filename)
32 self.root = parse(filename).getroot()
33 self.header = self.root.get('header')
34 self.ns = self.header + ':'
36 # Get root element attributes
37 if self.root.get('extension-xname', False):
39 self.major_version = self.root.get('major-version')
40 self.minor_version = self.root.get('minor-version')
41 self.ext_xname = self.root.get('extension-xname')
42 self.ext_name = self.root.get('extension-name')
43 self.prefix = ('xcb', self.ext_name)
47 self.prefix = ('xcb',)
52 This is the grand, encompassing class that represents an entire XCB specification.
53 Only gets instantiated once, in the main() routine.
55 Don't need to worry about this much except to declare it and to get the namespace.
58 namespace contains the namespace info for the spec.
60 open = __main__.output['open']
61 close = __main__.output['close']
63 def __init__(self, filename, output):
64 self.namespace = Namespace(filename)
73 # Register some common types
74 self.add_type('CARD8', '', ('uint8_t',), tcard8)
75 self.add_type('CARD16', '', ('uint16_t',), tcard16)
76 self.add_type('CARD32', '', ('uint32_t',), tcard32)
77 self.add_type('CARD64', '', ('uint64_t',), tcard64)
78 self.add_type('INT8', '', ('int8_t',), tint8)
79 self.add_type('INT16', '', ('int16_t',), tint16)
80 self.add_type('INT32', '', ('int32_t',), tint32)
81 self.add_type('INT64', '', ('int64_t',), tint64)
82 self.add_type('BYTE', '', ('uint8_t',), tcard8)
83 self.add_type('BOOL', '', ('uint8_t',), tcard8)
84 self.add_type('char', '', ('char',), tchar)
85 self.add_type('float', '', ('float',), tfloat)
86 self.add_type('double', '', ('double',), tdouble)
87 self.add_type('void', '', ('void',), tcard8)
89 # This goes out and parses the rest of the XML
91 matcher.execute(self, self.namespace)
93 # Recursively resolve all types
95 for (name, item) in self.all:
98 # Call all the output methods
102 for (name, item) in self.all:
107 # Keeps track of what's been imported so far.
108 def add_import(self, name, namespace):
109 self.imports.append((name, namespace.header))
111 def has_import(self, name):
112 for (name_, header) in self.imports:
117 # Keeps track of non-request/event/error datatypes
118 def add_type(self, id, ns, name, item):
120 if key in self.types:
122 self.types[key] = (name, item)
123 if name[:-1] == self.namespace.prefix:
124 self.all.append((name, item))
126 def get_type_impl(self, id, idx):
128 if key in self.types:
129 return self.types[key][idx]
131 key = self.namespace.ns + id
132 if key in self.types:
133 return self.types[key][idx]
135 for key in self.types.keys():
136 if key.rpartition(':')[2] == id:
137 return self.types[key][idx]
139 raise ResolveException('Type %s not found' % id)
141 def get_type(self, id):
142 return self.get_type_impl(id, 1)
144 def get_type_name(self, id):
145 return self.get_type_impl(id, 0)
147 # Keeps track of request datatypes
148 def add_request(self, id, name, item):
149 if name[:-1] == self.namespace.prefix:
150 self.all.append((name, item))
152 # Keeps track of event datatypes
153 def add_event(self, id, name, item):
154 self.events[id] = (name, item)
155 if name[:-1] == self.namespace.prefix:
156 self.all.append((name, item))
158 def get_event(self, id):
159 return self.events[id][1]
161 # Keeps track of error datatypes
162 def add_error(self, id, name, item):
163 self.errors[id] = (name, item)
164 if name[:-1] == self.namespace.prefix:
165 self.all.append((name, item))
167 def get_error(self, id):
168 return self.errors[id][1]