home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Objects / cobject.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  3.6 KB  |  147 lines

  1.  
  2. /* Wrap void* pointers to be passed between C modules */
  3.  
  4. #include "Python.h"
  5.  
  6.  
  7. /* Declarations for objects of type PyCObject */
  8.  
  9. typedef void (*destructor1)(void *);
  10. typedef void (*destructor2)(void *, void*);
  11.  
  12. typedef struct {
  13.     PyObject_HEAD
  14.     void *cobject;
  15.     void *desc;
  16.     void (*destructor)(void *);
  17. } PyCObject;
  18.  
  19. PyObject *
  20. PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
  21. {
  22.     PyCObject *self;
  23.  
  24.     self = PyObject_NEW(PyCObject, &PyCObject_Type);
  25.     if (self == NULL)
  26.         return NULL;
  27.     self->cobject=cobj;
  28.     self->destructor=destr;
  29.     self->desc=NULL;
  30.  
  31.     return (PyObject *)self;
  32. }
  33.  
  34. PyObject *
  35. PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc,
  36.                              void (*destr)(void *, void *))
  37. {
  38.     PyCObject *self;
  39.  
  40.     if (!desc) {
  41.         PyErr_SetString(PyExc_TypeError,
  42.                         "PyCObject_FromVoidPtrAndDesc called with null"
  43.                         " description");
  44.         return NULL;
  45.     }
  46.     self = PyObject_NEW(PyCObject, &PyCObject_Type);
  47.     if (self == NULL)
  48.         return NULL;
  49.     self->cobject=cobj;
  50.     self->destructor=(destructor1)destr;
  51.     self->desc=desc;
  52.  
  53.     return (PyObject *)self;
  54. }
  55.  
  56. void *
  57. PyCObject_AsVoidPtr(PyObject *self)
  58. {
  59.     if (self) {
  60.         if (self->ob_type == &PyCObject_Type)
  61.             return ((PyCObject *)self)->cobject;
  62.         PyErr_SetString(PyExc_TypeError,
  63.                         "PyCObject_AsVoidPtr with non-C-object");
  64.     }
  65.     if (!PyErr_Occurred())
  66.         PyErr_SetString(PyExc_TypeError,
  67.                         "PyCObject_AsVoidPtr called with null pointer");
  68.     return NULL;
  69. }
  70.  
  71. void *
  72. PyCObject_GetDesc(PyObject *self)
  73. {
  74.     if (self) {
  75.         if (self->ob_type == &PyCObject_Type)
  76.             return ((PyCObject *)self)->desc;
  77.         PyErr_SetString(PyExc_TypeError,
  78.                         "PyCObject_GetDesc with non-C-object");
  79.     }
  80.     if (!PyErr_Occurred())
  81.         PyErr_SetString(PyExc_TypeError,
  82.                         "PyCObject_GetDesc called with null pointer");
  83.     return NULL;
  84. }
  85.  
  86. void *
  87. PyCObject_Import(char *module_name, char *name)
  88. {
  89.     PyObject *m, *c;
  90.     void *r = NULL;
  91.  
  92.     if ((m = PyImport_ImportModule(module_name))) {
  93.         if ((c = PyObject_GetAttrString(m,name))) {
  94.             r = PyCObject_AsVoidPtr(c);
  95.             Py_DECREF(c);
  96.     }
  97.         Py_DECREF(m);
  98.     }
  99.     return r;
  100. }
  101.  
  102. static void
  103. PyCObject_dealloc(PyCObject *self)
  104. {
  105.     if (self->destructor) {
  106.         if(self->desc)
  107.             ((destructor2)(self->destructor))(self->cobject, self->desc);
  108.         else
  109.             (self->destructor)(self->cobject);
  110.     }
  111.     PyObject_DEL(self);
  112. }
  113.  
  114.  
  115. static char PyCObject_Type__doc__[] = 
  116. "C objects to be exported from one extension module to another\n\
  117. \n\
  118. C objects are used for communication between extension modules.  They\n\
  119. provide a way for an extension module to export a C interface to other\n\
  120. extension modules, so that extension modules can use the Python import\n\
  121. mechanism to link to one another.";
  122.  
  123. PyTypeObject PyCObject_Type = {
  124.     PyObject_HEAD_INIT(&PyType_Type)
  125.     0,                    /*ob_size*/
  126.     "PyCObject",            /*tp_name*/
  127.     sizeof(PyCObject),            /*tp_basicsize*/
  128.     0,                    /*tp_itemsize*/
  129.     /* methods */
  130.     (destructor)PyCObject_dealloc,    /*tp_dealloc*/
  131.     (printfunc)0,            /*tp_print*/
  132.     (getattrfunc)0,            /*tp_getattr*/
  133.     (setattrfunc)0,            /*tp_setattr*/
  134.     (cmpfunc)0,                /*tp_compare*/
  135.     (reprfunc)0,            /*tp_repr*/
  136.     0,                    /*tp_as_number*/
  137.     0,                    /*tp_as_sequence*/
  138.     0,                    /*tp_as_mapping*/
  139.     (hashfunc)0,            /*tp_hash*/
  140.     (ternaryfunc)0,            /*tp_call*/
  141.     (reprfunc)0,            /*tp_str*/
  142.  
  143.     /* Space for future expansion */
  144.     0L,0L,0L,0L,
  145.     PyCObject_Type__doc__         /* Documentation string */
  146. };
  147.