|
1 | | -BGEN -- An Experiment: Automatic Generation of Extension Modules |
2 | | -================================================================ |
| 1 | +BGEN -- Automatic Generation of Extension Modules |
| 2 | +================================================= |
3 | 3 |
|
4 | 4 | This directory contains BGEN -- a package that helps in generating |
5 | | -complete source code for Python extension module. It currently also |
6 | | -contains a set of examples that were generated with BGEN. These |
7 | | -examples are mostly interfaces to a number of important managers in |
8 | | -the Macintosh toolbox. |
9 | | - |
10 | | - |
11 | | -Overview of Subdirectories |
12 | | --------------------------- |
13 | | - |
14 | | -Main subdirectories: |
15 | | - |
16 | | -bgen the code generator package |
17 | | - |
18 | | -Example subdirectories: |
19 | | - |
20 | | -ae AppleEvents |
21 | | -ctl Controls |
22 | | -cm Component manager |
23 | | -dlg Dialogs |
24 | | -evt Events |
25 | | -menu Menus |
26 | | -list Lists |
27 | | -qd QuickDraw |
28 | | -qt QuickTime |
29 | | -res Resources |
30 | | -snd Sound |
31 | | -win Windows |
32 | | - |
33 | | - |
34 | | -Contents of Subdirectories |
35 | | --------------------------- |
36 | | - |
37 | | -The contents of each example subdirectory is similar (<Foobar> is |
38 | | -for instance AppleEvents, while <foo> is ae): |
39 | | - |
40 | | -<foo>scan.py Scan the <Foobar>.h header, generating <foo>gen.py |
41 | | -<foo>gen.py Output of <foo>scan.py, input for <foo>support.py |
42 | | -<foo>edit.py Manually written complement of <foo>gen.py, sometimes |
43 | | -<foo>support.py Generate <Foo>module.c from <foo>gen.py and <foo>edit.py |
44 | | -<Foo>module.c The interface module, ready to be compiled |
45 | | -<Foobar>.py Symbolic constants extracted from <Foobar.h> |
46 | | - |
47 | | - |
48 | | -Tests and Examples |
49 | | ------------------- |
50 | | - |
51 | | -Other files in these subdirectories are usually examples using the |
52 | | -extension. If there's a file t<foo>.py, it usually is a really |
53 | | -boring test program. |
54 | | - |
55 | | -Some test programs contain pathnames that should be edited before |
56 | | -trying them. |
57 | | - |
58 | | -Some of the less boring tests and examples: |
59 | | - |
60 | | -At the top level: |
61 | | - |
62 | | -test.py Application mainloop, uses most Mac extensions |
63 | | - |
64 | | -In ae: |
65 | | - |
66 | | -aetools.py Conversions between AE and Python data type |
67 | | -echo.py Dummy AE server, echoes all data back |
68 | | -tell.py Primitive AE client |
69 | | -aete.py Decode 'aete' and 'aeut' resources (incomplete) |
70 | | -gensuitemodule.py |
71 | | - Read aete/aeut resources and turn them into python |
72 | | - modules. The *_Suite.py modules have been generated |
73 | | - with this. |
74 | | -AEservertest.py A simple AE server, similar to echo but different. |
75 | | - |
76 | | -In cm: |
77 | | -cmtest.py List all components in the system plus some info on them |
78 | | - |
79 | | -In qt: |
80 | | -MovieInWindow.py Play a movie in a fixed-sized window, stop on mouse-press |
81 | | -VerySimplePlayer.py Play a movie with the standard quicktime controller. |
82 | | - |
83 | | -In res: |
84 | | - |
85 | | -listres.py List *all* resources in current and in all res files |
86 | | -copyres.py Copy a resource file |
87 | | -mkerrstrres.py Read "errors.txt" and create a set of "Estr" resources |
88 | | - |
89 | | -In snd: |
90 | | - |
91 | | -playaiff.py Play an AIFF file |
92 | | -morse.py Turn text into Morse code |
93 | | -audiodev.py The standard audiodev.py extended with Mac support |
94 | | -Audio_mac.py The Mac support for audiodev.py |
95 | | - |
96 | | - |
97 | | -Creating new Macintosh interfaces |
98 | | ---------------------------------- |
99 | | - |
100 | | -These instructions were written up by Jack while he was building the |
101 | | -interface to Lists.h, the macintosh list manager. they may or may not |
102 | | -have a more global scope than exactly that. |
103 | | - |
104 | | -First, start by copying ...scan.py and ...support.py from another, |
105 | | -preferrably similar type. I started with evt, but that was a mistake |
106 | | -since evt has no "own" object. Ctl or Dlg would probably have been a |
107 | | -better idea. |
108 | | - |
109 | | -Now, the first thing to do is to comment out the blacklisted types and |
110 | | -functions and the transformation rules for arguments, we'll fill those |
111 | | -in lateron. Also, change the various definitions at the top, so that |
112 | | -the right include file is parsed, and the .py files are generated with |
113 | | -the correct name. If your manager has a type that will be implemented |
114 | | -as a python object you may as well now change the destination() method |
115 | | -to recognize that. (List was funny in this respect, since it has the |
116 | | -list as the last argument in stead of the first). |
117 | | - |
118 | | -Now run your scanner. This will probably go fine until it tries to |
119 | | -execute the generated code in the ...gen.py module. Look at that file, |
120 | | -it will have formalized "definitions" of all the functions and methods |
121 | | -that will be generated. Look at them all (with the documentation of the |
122 | | -manager you're implementing in hand). Now you'll have to fix the |
123 | | -blacklists and the repair instructions. This is sort of a black art, |
124 | | -but a few guidelines may be handy here: |
125 | | -- If there are argument types you cannot implement (or want to leave for |
126 | | - the moment) put them in blacklisttypes. Complex structures come to |
127 | | - mind, or routine pointers/UPP's. You will probably also want to |
128 | | - blacklist the routine that disposes of your object (since you'll do |
129 | | - that in the python destruction routine). |
130 | | -- Various types of buffers are available in bgenBuffer, bgenHeapBuffer |
131 | | - and macsupport in the bgen directory. These'll let you handle all |
132 | | - sorts of input and output parameters. You can put instructions in the |
133 | | - repair list to let the C-arguments be handled by the correct type |
134 | | - of buffer. Check the other bgen-generated modules for using this for |
135 | | - passing raw structures and input and output buffers. |
136 | | -- It appears that the parser usually guesses correctly whether a parameter |
137 | | - is meant for input or output. But, check the routines to be sure. |
138 | | -- Some types are pretty hard to handle but you need the functionality |
139 | | - the a routine that uses them anyway. Various routines expecting ProcPtrs |
140 | | - or RegionHandles come to mind. Often, you can use the FakeType class |
141 | | - to provide a sensible default (i.e. NULL or a pointer to a routine you |
142 | | - coded in C, or a region specifying "the whole window"). This way, python |
143 | | - programmers won't get the full functionality but at least they'll get the |
144 | | - common case. You put the FakeType stuff in ...support.py. |
145 | | - |
146 | | -Next you'll probably have to write the code to implement your object. |
147 | | -This will probably be a subclass of GlobalObjectDefinition. This goes |
148 | | -into ...support.py. Also, some types used by the manager may look |
149 | | -enough like standard types that you can equate them here (there are a |
150 | | -lot of 2-integer structures that look remarkably like a Point, for |
151 | | -instance). |
152 | | - |
153 | | -You'll also have to define the Function() and Method() classes. The |
154 | | -OSErrFunctionGenerator and its method-counterpart are particularly |
155 | | -handy for a lot of mac managers. |
156 | | - |
157 | | -Finally, you'll have to try and compile your resulting C-source, and go |
158 | | -through the steps above until it works. For tlist.py, the test program |
159 | | -for list, I started with the application framework. This is probably a |
160 | | -good idea for any manager that does something to the display, since |
161 | | -ApplicationFramework takes care of all the intricacies of event |
162 | | -handling and decoding (up to a point). |
163 | | - |
| 5 | +complete source code for Python extension module. For examples of its |
| 6 | +use, see the Mac Python source distribution (available separately |
| 7 | +from the Python ftp archives). Note that BGEN is not Mac specific! |
0 commit comments