# This script will generate the Resources interface for Python. # It uses the "bgen" package to generate C code. # It execs the file resgen.py which contain the function definitions # (resgen.py was generated by resscan.py, scanning the header file). import addpack addpack.addpack(':Tools:bgen:bgen') from macsupport import * class ResMixIn: def checkit(self): OutLbrace() Output("OSErr _err = ResError();") Output("if (_err != noErr) return PyMac_Error(_err);") OutRbrace() FunctionGenerator.checkit(self) # XXX class ResFunction(ResMixIn, FunctionGenerator): pass class ResMethod(ResMixIn, MethodGenerator): pass # includestuff etc. are imported from macsupport includestuff = includestuff + """ #include #define resNotFound -192 /* Can't include because of Python's "errors.h" */ """ finalstuff = finalstuff + """ /* Alternative version of ResObj_New, which returns None for null argument */ PyObject *OptResObj_New(itself) Handle itself; { ResourceObject *it; if (itself == NULL) { Py_INCREF(Py_None); return Py_None; } return ResObj_New(itself); } OptResObj_Convert(v, p_itself) PyObject *v; Handle *p_itself; { if ( v == Py_None ) { *p_itself = NULL; return 1; } if (!ResObj_Check(v)) { PyErr_SetString(PyExc_TypeError, "Resource required"); return 0; } *p_itself = ((ResourceObject *)v)->ob_itself; return 1; } """ initstuff = initstuff + """ """ module = MacModule('Res', 'Res', includestuff, finalstuff, initstuff) getattrHookCode = """ if (strcmp(name, "size") == 0) return PyInt_FromLong(GetHandleSize(self->ob_itself)); if (strcmp(name, "data") == 0) { PyObject *res; char state; state = HGetState(self->ob_itself); HLock(self->ob_itself); res = PyString_FromStringAndSize( *self->ob_itself, GetHandleSize(self->ob_itself)); HUnlock(self->ob_itself); HSetState(self->ob_itself, state); return res; } if (strcmp(name, "__members__") == 0) return Py_BuildValue("[ss]", "data", "size"); """ setattrCode = """ static int ResObj_setattr(self, name, value) ResourceObject *self; char *name; PyObject *value; { char *data; long size; if (strcmp(name, "data") != 0 || value == NULL ) return -1; if ( !PyString_Check(value) ) return -1; size = PyString_Size(value); data = PyString_AsString(value); /* XXXX Do I need the GetState/SetState calls? */ SetHandleSize(self->ob_itself, size); if ( MemError()) return -1; HLock(self->ob_itself); memcpy((char *)*self->ob_itself, data, size); HUnlock(self->ob_itself); /* XXXX Should I do the Changed call immedeately? */ return 0; } """ class ResDefiniton(GlobalObjectDefinition): def outputCheckNewArg(self): Output("if (itself == NULL) return PyMac_Error(resNotFound);") def outputGetattrHook(self): Output(getattrHookCode) def outputSetattr(self): Output(setattrCode) resobject = ResDefiniton('Resource', 'ResObj', 'Handle') module.addobject(resobject) functions = [] resmethods = [] execfile('resgen.py') execfile('resedit.py') for f in functions: module.add(f) for f in resmethods: resobject.add(f) SetOutputFileName('Resmodule.c') module.generate()