]> granicus.if.org Git - python/commitdiff
opaque C object a la Jim Fulton
authorGuido van Rossum <guido@python.org>
Fri, 12 Jan 1996 00:44:03 +0000 (00:44 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 12 Jan 1996 00:44:03 +0000 (00:44 +0000)
Include/cobject.h [new file with mode: 0644]
Objects/cobject.c [new file with mode: 0644]

diff --git a/Include/cobject.h b/Include/cobject.h
new file mode 100644 (file)
index 0000000..1969338
--- /dev/null
@@ -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 (file)
index 0000000..f14a4d9
--- /dev/null
@@ -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 */
+};