summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/cobject.h61
-rw-r--r--Objects/cobject.c100
2 files changed, 161 insertions, 0 deletions
diff --git a/Include/cobject.h b/Include/cobject.h
new file mode 100644
index 0000000..1969338
--- /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 0000000..f14a4d9
--- /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 */
+};