blob: 10e2724d47c1a1ec98c746dc6bc159042f9d8058 [file] [log] [blame]
Guido van Rossum17448e21995-01-30 11:53:55 +00001# This script will generate the Resources interface for Python.
2# It uses the "bgen" package to generate C code.
3# It execs the file resgen.py which contain the function definitions
4# (resgen.py was generated by resscan.py, scanning the <Resources.h> header file).
5
6from macsupport import *
7
8
9class ResMixIn:
10
11 def checkit(self):
12 OutLbrace()
13 Output("OSErr _err = ResError();")
14 Output("if (_err != noErr) return PyMac_Error(_err);")
15 OutRbrace()
16 FunctionGenerator.checkit(self) # XXX
17
18class ResFunction(ResMixIn, FunctionGenerator): pass
19class ResMethod(ResMixIn, MethodGenerator): pass
20
21# includestuff etc. are imported from macsupport
22
23includestuff = includestuff + """
24#include <Resources.h>
Jack Janseneaf3c9b1997-08-15 14:36:45 +000025#include <string.h>
Guido van Rossum17448e21995-01-30 11:53:55 +000026
27#define resNotFound -192 /* Can't include <Errors.h> because of Python's "errors.h" */
Jack Jansenadd03b62000-03-08 16:58:15 +000028
29/* Function to dispose a resource, with a "normal" calling sequence */
30static void
31PyMac_AutoDisposeHandle(Handle h)
32{
33 DisposeHandle(h);
34}
Guido van Rossum17448e21995-01-30 11:53:55 +000035"""
36
37finalstuff = finalstuff + """
Jack Jansen9f37c6d1995-08-17 14:29:23 +000038
39/* Alternative version of ResObj_New, which returns None for null argument */
Jack Jansen425e9eb1995-12-12 15:02:03 +000040PyObject *OptResObj_New(itself)
Jack Jansen9f37c6d1995-08-17 14:29:23 +000041 Handle itself;
42{
Jack Jansen9f37c6d1995-08-17 14:29:23 +000043 if (itself == NULL) {
44 Py_INCREF(Py_None);
45 return Py_None;
46 }
47 return ResObj_New(itself);
48}
49
Jack Jansen425e9eb1995-12-12 15:02:03 +000050OptResObj_Convert(v, p_itself)
51 PyObject *v;
52 Handle *p_itself;
53{
Jack Jansen2d76c251999-12-12 22:57:29 +000054 PyObject *tmp;
55
Jack Jansen425e9eb1995-12-12 15:02:03 +000056 if ( v == Py_None ) {
57 *p_itself = NULL;
58 return 1;
59 }
Jack Jansen2d76c251999-12-12 22:57:29 +000060 if (ResObj_Check(v))
Jack Jansen425e9eb1995-12-12 15:02:03 +000061 {
Jack Jansen2d76c251999-12-12 22:57:29 +000062 *p_itself = ((ResourceObject *)v)->ob_itself;
63 return 1;
Jack Jansen425e9eb1995-12-12 15:02:03 +000064 }
Jack Jansen2d76c251999-12-12 22:57:29 +000065 /* If it isn't a resource yet see whether it is convertible */
66 if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) {
67 *p_itself = ((ResourceObject *)tmp)->ob_itself;
68 Py_DECREF(tmp);
69 return 1;
70 }
71 PyErr_Clear();
72 PyErr_SetString(PyExc_TypeError, "Resource required");
73 return 0;
Jack Jansen425e9eb1995-12-12 15:02:03 +000074}
Guido van Rossum17448e21995-01-30 11:53:55 +000075"""
76
77initstuff = initstuff + """
78"""
79
80module = MacModule('Res', 'Res', includestuff, finalstuff, initstuff)
81
82getattrHookCode = """
83if (strcmp(name, "size") == 0)
84 return PyInt_FromLong(GetHandleSize(self->ob_itself));
85if (strcmp(name, "data") == 0) {
86 PyObject *res;
87 char state;
88 state = HGetState(self->ob_itself);
89 HLock(self->ob_itself);
90 res = PyString_FromStringAndSize(
91 *self->ob_itself,
92 GetHandleSize(self->ob_itself));
93 HUnlock(self->ob_itself);
94 HSetState(self->ob_itself, state);
95 return res;
96}
97if (strcmp(name, "__members__") == 0)
98 return Py_BuildValue("[ss]", "data", "size");
99"""
100
Jack Jansen1e054021995-06-18 20:20:27 +0000101setattrCode = """
102static int
103ResObj_setattr(self, name, value)
104 ResourceObject *self;
105 char *name;
106 PyObject *value;
107{
108 char *data;
109 long size;
110
111 if (strcmp(name, "data") != 0 || value == NULL )
112 return -1;
113 if ( !PyString_Check(value) )
114 return -1;
115 size = PyString_Size(value);
116 data = PyString_AsString(value);
117 /* XXXX Do I need the GetState/SetState calls? */
118 SetHandleSize(self->ob_itself, size);
119 if ( MemError())
120 return -1;
121 HLock(self->ob_itself);
122 memcpy((char *)*self->ob_itself, data, size);
123 HUnlock(self->ob_itself);
124 /* XXXX Should I do the Changed call immedeately? */
125 return 0;
126}
127"""
128
Jack Jansenadd03b62000-03-08 16:58:15 +0000129class ResDefinition(GlobalObjectDefinition):
Guido van Rossum17448e21995-01-30 11:53:55 +0000130
131 def outputCheckNewArg(self):
132 Output("if (itself == NULL) return PyMac_Error(resNotFound);")
Jack Jansen2d76c251999-12-12 22:57:29 +0000133
134 def outputCheckConvertArg(self):
135 # if it isn't a resource we may be able to coerce it
136 Output("if (!%s_Check(v))", self.prefix)
137 OutLbrace()
138 Output("PyObject *tmp;")
139 Output('if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) )')
140 OutLbrace()
141 Output("*p_itself = ((ResourceObject *)tmp)->ob_itself;")
142 Output("Py_DECREF(tmp);")
143 Output("return 1;")
144 OutRbrace()
145 Output("PyErr_Clear();")
146 OutRbrace()
Guido van Rossum17448e21995-01-30 11:53:55 +0000147
148 def outputGetattrHook(self):
149 Output(getattrHookCode)
Jack Jansen1e054021995-06-18 20:20:27 +0000150
151 def outputSetattr(self):
152 Output(setattrCode)
Guido van Rossum17448e21995-01-30 11:53:55 +0000153
Jack Jansenadd03b62000-03-08 16:58:15 +0000154 def outputStructMembers(self):
155 GlobalObjectDefinition.outputStructMembers(self)
156 Output("void (*ob_freeit)(%s ptr);", self.itselftype)
157
158 def outputInitStructMembers(self):
159 GlobalObjectDefinition.outputInitStructMembers(self)
160 Output("it->ob_freeit = NULL;")
161
162 def outputCleanupStructMembers(self):
163 Output("if (self->ob_freeit && self->ob_itself)")
164 OutLbrace()
165 Output("self->ob_freeit(self->ob_itself);")
166 OutRbrace()
167 Output("self->ob_itself = NULL;")
Guido van Rossum17448e21995-01-30 11:53:55 +0000168
Jack Jansenadd03b62000-03-08 16:58:15 +0000169
170resobject = ResDefinition('Resource', 'ResObj', 'Handle')
Guido van Rossum17448e21995-01-30 11:53:55 +0000171module.addobject(resobject)
172
173functions = []
174resmethods = []
175
176execfile('resgen.py')
Guido van Rossum9bcb6411995-02-05 16:54:27 +0000177execfile('resedit.py')
Guido van Rossum17448e21995-01-30 11:53:55 +0000178
179for f in functions: module.add(f)
180for f in resmethods: resobject.add(f)
181
182SetOutputFileName('Resmodule.c')
183module.generate()