blob: abc0aaac8bd4a309e09e5af320f1b503af80047a [file] [log] [blame]
José Fonsecad626cf42008-07-07 07:43:16 +09001"""C basic types"""
2
3class Type:
4
5 def __init__(self, name):
6 self.name = name
7
8 def __str__(self):
9 return self.name
10
11 def isoutput(self):
12 return False
13
José Fonsecaa83fb242008-07-07 16:55:52 +090014 def dump(self, instance):
15 raise NotImplementedError
16
José Fonsecad626cf42008-07-07 07:43:16 +090017 def wrap_instance(self, instance):
18 pass
19
José Fonseca27cd25d2008-07-07 13:44:00 +090020 def unwrap_instance(self, instance):
21 pass
22
José Fonsecad626cf42008-07-07 07:43:16 +090023
24class Void(Type):
25
26 def __init__(self):
27 Type.__init__(self, "void")
28
29Void = Void()
30
31
32class Intrinsic(Type):
33
34 def __init__(self, name, format):
35 Type.__init__(self, name)
36 self.format = format
37
José Fonsecaa83fb242008-07-07 16:55:52 +090038 def dump(self, instance):
39 print ' g_pLog->TextF("%s", %s);' % (self.format, instance)
40
José Fonsecad626cf42008-07-07 07:43:16 +090041
42class Const(Type):
43
44 def __init__(self, type):
45 Type.__init__(self, 'C' + type.name)
46 self.type = type
47
José Fonsecaa83fb242008-07-07 16:55:52 +090048 def dump(self, instance):
49 self.type.dump(instance)
50
José Fonsecad626cf42008-07-07 07:43:16 +090051 def __str__(self):
52 return "const " + str(self.type)
53
54
55class Pointer(Type):
56
57 def __init__(self, type):
58 Type.__init__(self, 'P' + type.name)
59 self.type = type
60
61 def __str__(self):
62 return str(self.type) + " *"
José Fonsecaa83fb242008-07-07 16:55:52 +090063
64 def dump(self, instance):
65 try:
66 print ' g_pLog->TextF("%%p", %s);' % instance
67 except NotImplementedError:
68 self.type.dump("*" + instance)
José Fonsecad626cf42008-07-07 07:43:16 +090069
70 def wrap_instance(self, instance):
71 self.type.wrap_instance("*" + instance)
72
José Fonseca27cd25d2008-07-07 13:44:00 +090073 def unwrap_instance(self, instance):
74 self.type.wrap_instance("*" + instance)
75
José Fonsecad626cf42008-07-07 07:43:16 +090076
José Fonsecaa83fb242008-07-07 16:55:52 +090077class OutPointer(Pointer):
José Fonsecad626cf42008-07-07 07:43:16 +090078
79 def isoutput(self):
80 return True
81
José Fonsecad626cf42008-07-07 07:43:16 +090082
83class Enum(Type):
84
85 def __init__(self, name, values):
86 Type.__init__(self, name)
87 self.values = values
José Fonsecaa83fb242008-07-07 16:55:52 +090088
89 def dump(self, instance):
90 print ' switch(%s) {' % instance
91 for value in self.values:
92 print ' case %s:' % value
93 print ' g_pLog->Text("%s");' % value
94 print ' break;'
95 print ' default:'
96 print ' g_pLog->TextF("%%i", %s);' % instance
97 print ' break;'
98 print ' }'
José Fonsecad626cf42008-07-07 07:43:16 +090099
100
101class Flags(Type):
102
103 def __init__(self, type, values):
104 Type.__init__(self, type.name)
105 self.values = values
106
107
108class Struct(Type):
109
110 def __init__(self, name, members):
111 Type.__init__(self, name)
112 self.members = members
113
José Fonsecaa83fb242008-07-07 16:55:52 +0900114 def dump(self, instance):
115 print ' g_pLog->Text("{");'
116 first = True
117 for type, name in self.members:
118 if first:
119 first = False
120 else:
121 print ' g_pLog->Text(", ");'
122 type.dump('(%s).%s' % (instance, name))
123 print ' g_pLog->Text("}");'
124
José Fonsecad626cf42008-07-07 07:43:16 +0900125
126class Alias(Type):
127
128 def __init__(self, name, type):
129 Type.__init__(self, name)
130 self.type = type
131
José Fonsecaa83fb242008-07-07 16:55:52 +0900132 def dump(self, instance):
133 self.type.dump(instance)
134
José Fonsecad626cf42008-07-07 07:43:16 +0900135
136class Function:
137
138 def __init__(self, type, name, args, call = '__stdcall'):
139 self.type = type
140 self.name = name
141 self.args = args
142 self.call = call
143
144 def prototype(self, name=None):
145 if name is not None:
146 name = name.strip()
147 else:
148 name = self.name
149 s = name
150 if self.call:
151 s = self.call + ' ' + s
152 if name.startswith('*'):
153 s = '(' + s + ')'
154 s = str(self.type) + ' ' + s
155 s += "("
156 if self.args:
157 s += ", ".join(["%s %s" % (type, name) for type, name in self.args])
158 else:
159 s += "void"
160 s += ")"
161 return s
162
163
164class Interface(Type):
165
166 def __init__(self, name, base=None):
167 Type.__init__(self, name)
168 self.base = base
169 self.methods = []
170
171 def itermethods(self):
172 if self.base is not None:
173 for method in self.base.itermethods():
174 yield method
175 for method in self.methods:
176 yield method
177 raise StopIteration
178
179 def wrap_name(self):
180 return "Wrap" + self.name
181
182 def wrap_pre_decl(self):
183 print "class %s;" % self.wrap_name()
184
185 def wrap_decl(self):
186 print "class %s : public %s " % (self.wrap_name(), self.name)
187 print "{"
188 print "public:"
189 print " %s(%s * pInstance);" % (self.wrap_name(), self.name)
190 print " virtual ~%s();" % self.wrap_name()
191 print
192 for method in self.itermethods():
193 print " " + method.prototype() + ";"
194 print
José Fonseca27cd25d2008-07-07 13:44:00 +0900195 #print "private:"
José Fonsecad626cf42008-07-07 07:43:16 +0900196 print " %s * m_pInstance;" % (self.name,)
197 print "};"
198 print
199
200 def wrap_impl(self):
201 print '%s::%s(%s * pInstance) {' % (self.wrap_name(), self.wrap_name(), self.name)
José Fonsecad626cf42008-07-07 07:43:16 +0900202 print ' m_pInstance = pInstance;'
203 print '}'
204 print
205 print '%s::~%s() {' % (self.wrap_name(), self.wrap_name())
José Fonsecad626cf42008-07-07 07:43:16 +0900206 print '}'
207 print
208 for method in self.itermethods():
209 print method.prototype(self.wrap_name() + '::' + method.name) + ' {'
210 if method.type is Void:
211 result = ''
212 else:
213 print ' %s result;' % method.type
214 result = 'result = '
José Fonsecad7605892008-07-07 13:09:31 +0900215 print ' g_pLog->BeginCall("%s");' % (self.name + '::' + method.name)
José Fonseca27cd25d2008-07-07 13:44:00 +0900216 for type, name in method.args:
217 if not type.isoutput():
218 type.unwrap_instance(name)
José Fonsecaa83fb242008-07-07 16:55:52 +0900219 print ' g_pLog->BeginParam("%s", "%s");' % (name, type)
220 type.dump(name)
221 print ' g_pLog->EndParam();'
José Fonsecad626cf42008-07-07 07:43:16 +0900222 print ' %sm_pInstance->%s(%s);' % (result, method.name, ', '.join([str(name) for type, name in method.args]))
223 for type, name in method.args:
224 if type.isoutput():
José Fonseca22aa6882008-07-07 17:33:30 +0900225 print ' g_pLog->BeginParam("%s", "%s");' % (name, type)
226 type.dump(name)
227 print ' g_pLog->EndParam();'
José Fonsecad626cf42008-07-07 07:43:16 +0900228 type.wrap_instance(name)
229 if method.type is not Void:
José Fonseca22aa6882008-07-07 17:33:30 +0900230 print ' g_pLog->BeginReturn("%s");' % method.type
231 type.dump("result")
232 print ' g_pLog->EndReturn();'
José Fonsecad626cf42008-07-07 07:43:16 +0900233 method.type.wrap_instance('result')
José Fonseca22aa6882008-07-07 17:33:30 +0900234 print ' g_pLog->EndCall();'
José Fonsecad626cf42008-07-07 07:43:16 +0900235 if method.name == 'QueryInterface':
236 print ' if(*ppvObj == m_pInstance)'
237 print ' *ppvObj = this;'
238 if method.name == 'Release':
239 assert method.type is not Void
240 print ' if(!result)'
241 print ' delete this;'
242 if method.type is not Void:
243 print ' return result;'
244 print '}'
245 print
246 print
247
248
249class Method(Function):
250
251 def __init__(self, type, name, args):
252 Function.__init__(self, type, name, args)
253
254
255towrap = []
256
257class WrapPointer(Pointer):
258
259 def __init__(self, type):
260 Pointer.__init__(self, type)
261 if type not in towrap:
262 towrap.append(type)
263
264 def wrap_instance(self, instance):
265 print " if(%s)" % instance
266 print " %s = new %s(%s);" % (instance, self.type.wrap_name(), instance)
267
José Fonseca27cd25d2008-07-07 13:44:00 +0900268 def unwrap_instance(self, instance):
269 print " if(%s)" % instance
270 print " %s = static_cast<%s *>(%s)->m_pInstance;" % (instance, self.type.wrap_name(), instance)
271
José Fonsecad626cf42008-07-07 07:43:16 +0900272String = Intrinsic("char *", "%s")
273Int = Intrinsic("int", "%i")
274Long = Intrinsic("long", "%li")
275Float = Intrinsic("float", "%f")
276
277
278def wrap():
279 for type in towrap:
280 type.wrap_pre_decl()
281 print
282 for type in towrap:
283 type.wrap_decl()
284 print
285 for type in towrap:
286 type.wrap_impl()
287 print