1 #! /usr/local/bin/python
3 # Modulator - Generate skeleton modules.
5 # The user fills out some forms with information about what the module
6 # should support (methods, objects), names of these things, prefixes to
7 # use for C code, whether the objects should also support access as numbers,
9 # When the user presses 'Generate code' we generate a complete skeleton
12 # Alternatively, the selections made can be save to a python sourcefile and
13 # this sourcefile can be passed on the command line (resulting in the same
16 # Jack Jansen, CWI, October 1994.
20 sys
.path
.append(os
.path
.join(os
.environ
['HOME'], 'src/python/Tools/modulator'))
25 from ScrolledListbox
import ScrolledListbox
32 # Check that string is a legal C identifier
35 if not str[0] in string
.letters
+'_':
38 if not c
in string
.letters
+string
.digits
+'_':
42 def getlistlist(list):
46 rv
.append(list.get(i
))
53 self
.main
.master
.title('Modulator: Module view')
54 self
.cmdframe
= Frame(self
.main
, {'relief':'raised', 'bd':'0.5m',
57 self
.objframe
= Frame(self
.main
, {Pack
:{'side':'top', 'fill':'x',
61 self
.check_button
= Button(self
.cmdframe
,
62 {'text':'Check', 'command':self
.cb_check
,
63 Pack
:{'side':'left', 'padx':'0.5m'}})
64 self
.save_button
= Button(self
.cmdframe
,
65 {'text':'Save...', 'command':self
.cb_save
,
66 Pack
:{'side':'left', 'padx':'0.5m'}})
67 self
.code_button
= Button(self
.cmdframe
,
68 {'text':'Generate code...',
69 'command':self
.cb_gencode
,
70 Pack
:{'side':'left', 'padx':'0.5m'}})
71 self
.quit_button
= Button(self
.cmdframe
,
73 'command':self
.cb_quit
,
74 Pack
:{'side':'right', 'padx':'0.5m'}})
76 self
.module
= UI_module(self
)
83 def cb_quit(self
, *args
):
85 if not askyn('You have not saved\nAre you sure you want to quit?'):
89 def cb_check(self
, *args
):
91 self
.module
.synchronize()
92 for o
in self
.objects
:
97 def cb_save(self
, *args
):
99 pycode
= self
.module
.gencode('m', self
.objects
)
103 fn
= askfile('Python file name: ')
112 def cb_gencode(self
, *args
):
114 pycode
= self
.module
.gencode('m', self
.objects
)
118 fn
= askfile('C file name: ')
127 message('An error occurred:-)')
129 genmodule
.write(fp
, m
)
133 def __init__(self
, parent
):
135 self
.frame
= Frame(parent
.objframe
, {'relief':'raised', 'bd':'0.2m',
138 self
.f1
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
140 self
.f2
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
142 self
.f3
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
144 self
.f4
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
147 self
.l1
= Label(self
.f1
, {'text':'Module:', Pack
:{'side':'left',
149 self
.name_entry
= Entry(self
.f1
, {'relief':'sunken',
150 Pack
:{'side':'left', 'padx':'0.5m', 'expand':1}})
151 self
.l2
= Label(self
.f1
, {'text':'Abbrev:', Pack
:{'side':'left',
153 self
.abbrev_entry
= Entry(self
.f1
, {'relief':'sunken', 'width':5,
154 Pack
:{'side':'left', 'padx':'0.5m'}})
156 self
.l3
= Label(self
.f2
, {'text':'Methods:', Pack
:{'side':'left',
158 self
.method_list
= ScrolledListbox(self
.f2
, {'relief':'sunken','bd':2,
159 Pack
:{'side':'left', 'expand':1,
160 'padx':'0.5m', 'fill':'both'}})
162 self
.l4
= Label(self
.f3
, {'text':'Add method:', Pack
:{'side':'left',
164 self
.method_entry
= Entry(self
.f3
, {'relief':'sunken',
165 Pack
:{'side':'left', 'padx':'0.5m', 'expand':1}})
166 self
.method_entry
.bind('<Return>', self
.cb_method
)
167 self
.delete_button
= Button(self
.f3
, {'text':'Delete method',
168 'command':self
.cb_delmethod
,
172 self
.newobj_button
= Button(self
.f4
, {'text':'new object',
173 'command':self
.cb_newobj
,
177 def cb_delmethod(self
, *args
):
178 list = self
.method_list
.curselection()
180 self
.method_list
.delete(i
)
182 def cb_newobj(self
, *arg
):
183 self
.parent
.objects
.append(UI_object(self
.parent
))
185 def cb_method(self
, *arg
):
186 name
= self
.method_entry
.get()
189 self
.method_entry
.delete('0', 'end')
190 self
.method_list
.insert('end', name
)
192 def synchronize(self
):
193 n
= self
.name_entry
.get()
195 message('Module name not set')
198 message('Module name not an identifier:\n'+n
)
200 if not self
.abbrev_entry
.get():
201 self
.abbrev_entry
.insert('end', n
)
202 m
= getlistlist(self
.method_list
)
205 message('Method name not an identifier:\n'+n
)
208 def gencode(self
, name
, objects
):
214 for i
in range(len(objects
)):
216 rv
= rv
+ objects
[i
].gencode(oname
)
218 rv
= rv
+ (name
+' = genmodule.module()\n')
219 rv
= rv
+ (name
+'.name = '+`self
.name_entry
.get()`
+'\n')
220 rv
= rv
+ (name
+'.abbrev = '+`self
.abbrev_entry
.get()`
+'\n')
221 rv
= rv
+ (name
+'.methodlist = '+`
getlistlist(self
.method_list
)`
+'\n')
222 rv
= rv
+ (name
+'.objects = ['+string
.joinfields(onames
, ',')+']\n')
229 def __init__(self
, parent
):
232 object_number
= object_number
+ 1
233 self
.num
= object_number
234 self
.vpref
= 'o'+`self
.num`
+'_'
235 self
.frame
= Toplevel(parent
.objframe
)
237 self
.frame
.title('Modulator: object view')
238 # self.frame = Frame(parent.objframe, {'relief':'raised', 'bd':'0.2m',
239 # Pack:{'side':'top',
241 self
.f1
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
243 self
.f2
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
245 self
.f3
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
247 self
.f4
= Frame(self
.frame
, {Pack
:{'side':'top', 'pady':'0.5m',
251 self
.l1
= Label(self
.f1
, {'text':'Object:', Pack
:{'side':'left',
253 self
.name_entry
= Entry(self
.f1
, {'relief':'sunken',
254 Pack
:{'side':'left', 'padx':'0.5m', 'expand':1}})
255 self
.l2
= Label(self
.f1
, {'text':'Abbrev:', Pack
:{'side':'left',
257 self
.abbrev_entry
= Entry(self
.f1
, {'relief':'sunken', 'width':5,
258 Pack
:{'side':'left', 'padx':'0.5m'}})
260 self
.l3
= Label(self
.f2
, {'text':'Methods:', Pack
:{'side':'left',
262 self
.method_list
= ScrolledListbox(self
.f2
, {'relief':'sunken','bd':2,
263 Pack
:{'side':'left', 'expand':1,
264 'padx':'0.5m', 'fill':'both'}})
266 self
.l4
= Label(self
.f3
, {'text':'Add method:', Pack
:{'side':'left',
268 self
.method_entry
= Entry(self
.f3
, {'relief':'sunken',
269 Pack
:{'side':'left', 'padx':'0.5m', 'expand':1}})
270 self
.method_entry
.bind('<Return>', self
.cb_method
)
271 self
.delete_button
= Button(self
.f3
, {'text':'Delete method',
272 'command':self
.cb_delmethod
,
277 self
.l5
= Label(self
.f4
, {'text':'functions:',
280 self
.f5
= Frame(self
.f4
, {Pack
:{'side':'left', 'pady':'0.5m',
282 self
.l6
= Label(self
.f4
, {'text':'Types:',
283 Pack
:{'side':'left', 'padx':'0.5m'}})
284 self
.f6
= Frame(self
.f4
, {Pack
:{'side':'left', 'pady':'0.5m',
287 for i
in genmodule
.FUNCLIST
:
289 self
.f5
.setvar(vname
, 0)
290 b
= Checkbutton(self
.f5
, {'variable':vname
, 'text':i
,
291 Pack
:{'side':'top', 'pady':'0.5m',
292 'anchor':'w','expand':1}})
294 self
.f5
.setvar(self
.vpref
+'new', 1)
297 for i
in genmodule
.TYPELIST
:
298 vname
= self
.vpref
+ i
299 self
.f6
.setvar(vname
, 0)
300 b
= Checkbutton(self
.f6
, {'variable':vname
, 'text':i
,
301 Pack
:{'side':'top', 'pady':'0.5m',
305 def cb_method(self
, *arg
):
306 name
= self
.method_entry
.get()
309 self
.method_entry
.delete('0', 'end')
310 self
.method_list
.insert('end', name
)
312 def cb_delmethod(self
, *args
):
313 list = self
.method_list
.curselection()
315 self
.method_list
.delete(i
)
317 def synchronize(self
):
318 n
= self
.name_entry
.get()
320 message('Object name not set')
322 if not self
.abbrev_entry
.get():
323 self
.abbrev_entry
.insert('end', n
)
324 n
= self
.abbrev_entry
.get()
326 message('Abbreviation not an identifier:\n'+n
)
328 m
= getlistlist(self
.method_list
)
331 message('Method name not an identifier:\n'+n
)
334 self
.f5
.setvar(self
.vpref
+'tp_getattr', 1)
337 def gencode(self
, name
):
339 rv
= rv
+ (name
+' = genmodule.object()\n')
340 rv
= rv
+ (name
+'.name = '+`self
.name_entry
.get()`
+'\n')
341 rv
= rv
+ (name
+'.abbrev = '+`self
.abbrev_entry
.get()`
+'\n')
342 rv
= rv
+ (name
+'.methodlist = '+`
getlistlist(self
.method_list
)`
+'\n')
344 for fn
in genmodule
.FUNCLIST
:
345 vname
= self
.vpref
+ fn
346 if self
.f5
.getvar(vname
) == '1':
348 rv
= rv
+ (name
+'.funclist = '+`fl`
+'\n')
351 for fn
in genmodule
.TYPELIST
:
352 vname
= self
.vpref
+ fn
353 if self
.f5
.getvar(vname
) == '1':
356 rv
= rv
+ (name
+'.typelist = '+`fl`
+'\n')
363 if len(sys
.argv
) < 2:
366 elif len(sys
.argv
) == 2:
367 fp
= open(sys
.argv
[1])
372 sys
.stderr
.write('An error occurred:-)\n')
374 genmodule
.write(sys
.stdout
, m
)
376 sys
.stderr
.write('Usage: modulator [file]\n')