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)
68 self.direct_imports = []
75 # Register some common types
76 self.add_type('CARD8', '', ('uint8_t',), tcard8)
77 self.add_type('CARD16', '', ('uint16_t',), tcard16)
78 self.add_type('CARD32', '', ('uint32_t',), tcard32)
79 self.add_type('CARD64', '', ('uint64_t',), tcard64)
80 self.add_type('INT8', '', ('int8_t',), tint8)
81 self.add_type('INT16', '', ('int16_t',), tint16)
82 self.add_type('INT32', '', ('int32_t',), tint32)
83 self.add_type('INT64', '', ('int64_t',), tint64)
84 self.add_type('BYTE', '', ('uint8_t',), tcard8)
85 self.add_type('BOOL', '', ('uint8_t',), tcard8)
86 self.add_type('char', '', ('char',), tchar)
87 self.add_type('float', '', ('float',), tfloat)
88 self.add_type('double', '', ('double',), tdouble)
89 self.add_type('void', '', ('void',), tcard8)
91 # This goes out and parses the rest of the XML
93 matcher.execute(self, self.namespace)
95 # Recursively resolve all types
97 for (name, item) in self.all:
101 # Call all the output methods
105 for (name, item) in self.all:
110 # Keeps track of what's been imported so far.
111 def add_import(self, name, namespace):
112 if self.import_level == 0:
113 self.direct_imports.append((name, namespace.header))
114 self.imports.append((name, namespace.header))
116 def has_import(self, name):
117 for (name_, header) in self.imports:
122 # Keeps track of non-request/event/error datatypes
123 def add_type(self, id, ns, name, item):
125 if key in self.types:
127 self.types[key] = (name, item)
128 if name[:-1] == self.namespace.prefix:
129 self.all.append((name, item))
131 def get_type_impl(self, id, idx):
133 if key in self.types:
134 return self.types[key][idx]
136 key = self.namespace.ns + id
137 if key in self.types:
138 return self.types[key][idx]
140 for key in self.types.keys():
141 if key.rpartition(':')[2] == id:
142 return self.types[key][idx]
144 raise ResolveException('Type %s not found' % id)
146 def get_type(self, id):
147 return self.get_type_impl(id, 1)
149 def get_type_name(self, id):
150 return self.get_type_impl(id, 0)
152 # Keeps track of request datatypes
153 def add_request(self, id, name, item):
154 if name[:-1] == self.namespace.prefix:
155 self.all.append((name, item))
157 # Keeps track of event datatypes
158 def add_event(self, id, name, item):
159 self.events[id] = (name, item)
160 if name[:-1] == self.namespace.prefix:
161 self.all.append((name, item))
163 def get_event(self, id):
164 return self.events[id][1]
166 # Keeps track of error datatypes
167 def add_error(self, id, name, item):
168 self.errors[id] = (name, item)
169 if name[:-1] == self.namespace.prefix:
170 self.all.append((name, item))
172 def get_error(self, id):
173 return self.errors[id][1]