From 77654a7e5ecfbd4bd5319f02452329609c6e5921 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Fri, 12 Jan 1996 00:44:03 +0000
Subject: opaque C object a la Jim Fulton

---
 Include/cobject.h |  61 +++++++++++++++++++++++++++++++++
 Objects/cobject.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+)
 create mode 100644 Include/cobject.h
 create mode 100644 Objects/cobject.c

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 */
+};
-- 
cgit v0.12

