diff --git a/Include/cobject.h b/Include/cobject.h new file mode 100644 index 00000000000..19693380e5d --- /dev/null +++ b/Include/cobject.h @@ -0,0 +1,61 @@ +#ifndef Py_COBJECT_H +#define Py_COBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************** +Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, +The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* C objects to be exported from one extension module to another. + + C objects are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + +*/ + +extern DL_IMPORT(PyTypeObject) PyCObject_Type; + +#define PyCObject_Check(op) ((op)->ob_type == &PyCObject_Type) + +/* Create a PyCObject from a pointer to a C object and an optional + destrutor function. If the second argument is non-null, then it + will be called with the first argument if and when the PyCObject is + destroyed. + +*/ + +extern PyObject * +PyCObject_FromVoidPtr Py_PROTO((void *cobj, void (*destruct)(void*))); + +/* Retrieve a pointer to a C object from a PyCObject. */ +extern void * +PyCObject_AsVoidPtr Py_PROTO((PyObject *)); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COBJECT_H */ diff --git a/Objects/cobject.c b/Objects/cobject.c new file mode 100644 index 00000000000..f14a4d94075 --- /dev/null +++ b/Objects/cobject.c @@ -0,0 +1,100 @@ +/*********************************************************** +Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, +The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* Wrap void* pointers to be passed between C modules */ + +#include "Python.h" + + +/* Declarations for objects of type PyCObject */ + +typedef struct { + PyObject_HEAD + void *cobject; + 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; + return (PyObject *)self; +} + +void * +PyCObject_AsVoidPtr(self) + PyObject *self; +{ + return ((PyCObject *)self)->cobject; +} + +static void +PyCObject_dealloc(self) + PyCObject *self; +{ + if(self->destructor) (self->destructor)(self->cobject); + PyMem_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 */ +};