/*********************************************************** Copyright (c) 2000, BeOpen.com. Copyright (c) 1995-2000, Corporation for National Research Initiatives. Copyright (c) 1990-1995, Stichting Mathematisch Centrum. All rights reserved. See the file "Misc/COPYRIGHT" for information on usage and redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. ******************************************************************/ /* Wrap void* pointers to be passed between C modules */ #include "Python.h" /* Declarations for objects of type PyCObject */ typedef void (*destructor1)(void *); typedef void (*destructor2)(void *, void*); typedef struct { PyObject_HEAD void *cobject; void *desc; void (*destructor)(void *); } PyCObject; PyObject * PyCObject_FromVoidPtr(cobj, destr) void *cobj; void (*destr)(void *); { PyCObject *self; self = PyObject_NEW(PyCObject, &PyCObject_Type); if (self == NULL) return NULL; self->cobject=cobj; self->destructor=destr; self->desc=NULL; return (PyObject *)self; } PyObject * PyCObject_FromVoidPtrAndDesc(cobj, desc, destr) void *cobj; void *desc; void (*destr)(void *, void *); { PyCObject *self; if(!desc) { PyErr_SetString(PyExc_TypeError, "PyCObject_FromVoidPtrAndDesc called with null description"); return NULL; } self = PyObject_NEW(PyCObject, &PyCObject_Type); if (self == NULL) return NULL; self->cobject=cobj; self->destructor=(destructor1)destr; self->desc=desc; return (PyObject *)self; } void * PyCObject_AsVoidPtr(self) PyObject *self; { if(self) { if(self->ob_type == &PyCObject_Type) return ((PyCObject *)self)->cobject; PyErr_SetString(PyExc_TypeError, "PyCObject_AsVoidPtr with non-C-object"); } if(! PyErr_Occurred()) PyErr_SetString(PyExc_TypeError, "PyCObject_AsVoidPtr called with null pointer"); return NULL; } void * PyCObject_GetDesc(self) PyObject *self; { if(self) { if(self->ob_type == &PyCObject_Type) return ((PyCObject *)self)->desc; PyErr_SetString(PyExc_TypeError, "PyCObject_GetDesc with non-C-object"); } if(! PyErr_Occurred()) PyErr_SetString(PyExc_TypeError, "PyCObject_GetDesc called with null pointer"); return NULL; } void * PyCObject_Import(module_name, name) char *module_name; char *name; { PyObject *m, *c; void *r=NULL; if((m=PyImport_ImportModule(module_name))) { if((c=PyObject_GetAttrString(m,name))) { r=PyCObject_AsVoidPtr(c); Py_DECREF(c); } Py_DECREF(m); } return r; } static void PyCObject_dealloc(self) PyCObject *self; { if(self->destructor) { if(self->desc) ((destructor2)(self->destructor))(self->cobject, self->desc); else (self->destructor)(self->cobject); } PyObject_DEL(self); } static char PyCObject_Type__doc__[] = "C objects to be exported from one extension module to another\n\ \n\ C objects are used for communication between extension modules. They\n\ provide a way for an extension module to export a C interface to other\n\ extension modules, so that extension modules can use the Python import\n\ mechanism to link to one another.\n" ; PyTypeObject PyCObject_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PyCObject", /*tp_name*/ sizeof(PyCObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PyCObject_dealloc, /*tp_dealloc*/ (printfunc)0, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)0, /*tp_compare*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)0, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PyCObject_Type__doc__ /* Documentation string */ };