| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Wrap void* pointers to be passed between C modules */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Python.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Declarations for objects of type PyCObject */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 03:09:57 +00:00
										 |  |  | typedef void (*destructor1)(void *); | 
					
						
							|  |  |  | typedef void (*destructor2)(void *, void*); | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     void *cobject; | 
					
						
							|  |  |  |     void *desc; | 
					
						
							|  |  |  |     void (*destructor)(void *); | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | } PyCObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *)) | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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; | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc, | 
					
						
							|  |  |  |                              void (*destr)(void *, void *)) | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     PyCObject *self; | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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; | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | void * | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_AsVoidPtr(PyObject *self) | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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; | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | void * | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_GetDesc(PyObject *self) | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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; | 
					
						
							| 
									
										
										
										
											1997-10-21 19:48:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | void * | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_Import(char *module_name, char *name) | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |         Py_DECREF(m); | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     return r; | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  | PyCObject_dealloc(PyCObject *self) | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     if (self->destructor) { | 
					
						
							|  |  |  |         if(self->desc) | 
					
						
							|  |  |  |             ((destructor2)(self->destructor))(self->cobject, self->desc); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             (self->destructor)(self->cobject); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     PyObject_DEL(self); | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-01-22 20:48:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | PyDoc_STRVAR(PyCObject_Type__doc__, | 
					
						
							| 
									
										
										
										
											1996-08-01 00:02:33 +00:00
										 |  |  | "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\ | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | mechanism to link to one another."); | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyTypeObject PyCObject_Type = { | 
					
						
							| 
									
										
										
										
											2000-07-09 04:14:42 +00:00
										 |  |  |     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 */ | 
					
						
							| 
									
										
										
										
											1996-01-12 00:44:03 +00:00
										 |  |  | }; |