| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | /* Use this file as a template to start implementing a module that
 | 
					
						
							| 
									
										
										
										
											2000-08-19 15:36:41 +00:00
										 |  |  |    also declares object types. All occurrences of 'Xxo' should be changed | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  |    to something reasonable for your objects. After that, all other | 
					
						
							|  |  |  |    occurrences of 'xx' should be changed to something reasonable for your | 
					
						
							|  |  |  |    module. If your module is named foo your sourcefile should be named | 
					
						
							|  |  |  |    foomodule.c. | 
					
						
							| 
									
										
										
										
											2002-05-23 15:49:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  |    You will probably want to delete all references to 'x_attr' and add | 
					
						
							|  |  |  |    your own types of attributes instead.  Maybe you want to name your | 
					
						
							|  |  |  |    local variables other than 'self'.  If your object type is needed in | 
					
						
							|  |  |  |    other files, you'll have to create a file "foobarobject.h"; see | 
					
						
							| 
									
										
										
										
											2010-06-27 18:19:09 +00:00
										 |  |  |    floatobject.h for an example. */ | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Xxo objects */ | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyObject *ErrorObject; | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     PyObject            *x_attr;        /* Attributes dictionary */ | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | } XxoObject; | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 16:30:39 +00:00
										 |  |  | static PyTypeObject Xxo_Type; | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | #define XxoObject_Check(v)      (Py_TYPE(v) == &Xxo_Type)
 | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static XxoObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | newXxoObject(PyObject *arg) | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     XxoObject *self; | 
					
						
							|  |  |  |     self = PyObject_New(XxoObject, &Xxo_Type); | 
					
						
							|  |  |  |     if (self == NULL) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     self->x_attr = NULL; | 
					
						
							|  |  |  |     return self; | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Xxo methods */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | Xxo_dealloc(XxoObject *self) | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     Py_XDECREF(self->x_attr); | 
					
						
							|  |  |  |     PyObject_Del(self); | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | Xxo_demo(XxoObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, ":demo")) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     Py_INCREF(Py_None); | 
					
						
							|  |  |  |     return Py_None; | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyMethodDef Xxo_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"demo",            (PyCFunction)Xxo_demo,  METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("demo() -> None")}, | 
					
						
							|  |  |  |     {NULL,              NULL}           /* sentinel */ | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2008-07-02 22:38:47 +00:00
										 |  |  | Xxo_getattro(XxoObject *self, PyObject *name) | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (self->x_attr != NULL) { | 
					
						
							|  |  |  |         PyObject *v = PyDict_GetItem(self->x_attr, name); | 
					
						
							|  |  |  |         if (v != NULL) { | 
					
						
							|  |  |  |             Py_INCREF(v); | 
					
						
							|  |  |  |             return v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return PyObject_GenericGetAttr((PyObject *)self, name); | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | Xxo_setattr(XxoObject *self, char *name, PyObject *v) | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (self->x_attr == NULL) { | 
					
						
							|  |  |  |         self->x_attr = PyDict_New(); | 
					
						
							|  |  |  |         if (self->x_attr == NULL) | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (v == NULL) { | 
					
						
							|  |  |  |         int rv = PyDict_DelItemString(self->x_attr, name); | 
					
						
							|  |  |  |         if (rv < 0) | 
					
						
							|  |  |  |             PyErr_SetString(PyExc_AttributeError, | 
					
						
							|  |  |  |                 "delete non-existing Xxo attribute"); | 
					
						
							|  |  |  |         return rv; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         return PyDict_SetItemString(self->x_attr, name, v); | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 16:49:03 +00:00
										 |  |  | static PyTypeObject Xxo_Type = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* The ob_type field must be initialized in the module init function
 | 
					
						
							|  |  |  |      * to be portable to Windows without using C++. */ | 
					
						
							|  |  |  |     PyVarObject_HEAD_INIT(NULL, 0) | 
					
						
							|  |  |  |     "xxmodule.Xxo",             /*tp_name*/ | 
					
						
							|  |  |  |     sizeof(XxoObject),          /*tp_basicsize*/ | 
					
						
							|  |  |  |     0,                          /*tp_itemsize*/ | 
					
						
							|  |  |  |     /* methods */ | 
					
						
							|  |  |  |     (destructor)Xxo_dealloc, /*tp_dealloc*/ | 
					
						
							|  |  |  |     0,                          /*tp_print*/ | 
					
						
							|  |  |  |     (getattrfunc)0,         /*tp_getattr*/ | 
					
						
							|  |  |  |     (setattrfunc)Xxo_setattr, /*tp_setattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_reserved*/ | 
					
						
							|  |  |  |     0,                          /*tp_repr*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_number*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_sequence*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_mapping*/ | 
					
						
							|  |  |  |     0,                          /*tp_hash*/ | 
					
						
							|  |  |  |     0,                      /*tp_call*/ | 
					
						
							|  |  |  |     0,                      /*tp_str*/ | 
					
						
							|  |  |  |     (getattrofunc)Xxo_getattro, /*tp_getattro*/ | 
					
						
							|  |  |  |     0,                      /*tp_setattro*/ | 
					
						
							|  |  |  |     0,                      /*tp_as_buffer*/ | 
					
						
							|  |  |  |     Py_TPFLAGS_DEFAULT,     /*tp_flags*/ | 
					
						
							|  |  |  |     0,                      /*tp_doc*/ | 
					
						
							|  |  |  |     0,                      /*tp_traverse*/ | 
					
						
							|  |  |  |     0,                      /*tp_clear*/ | 
					
						
							|  |  |  |     0,                      /*tp_richcompare*/ | 
					
						
							|  |  |  |     0,                      /*tp_weaklistoffset*/ | 
					
						
							|  |  |  |     0,                      /*tp_iter*/ | 
					
						
							|  |  |  |     0,                      /*tp_iternext*/ | 
					
						
							|  |  |  |     Xxo_methods,            /*tp_methods*/ | 
					
						
							|  |  |  |     0,                      /*tp_members*/ | 
					
						
							|  |  |  |     0,                      /*tp_getset*/ | 
					
						
							|  |  |  |     0,                      /*tp_base*/ | 
					
						
							|  |  |  |     0,                      /*tp_dict*/ | 
					
						
							|  |  |  |     0,                      /*tp_descr_get*/ | 
					
						
							|  |  |  |     0,                      /*tp_descr_set*/ | 
					
						
							|  |  |  |     0,                      /*tp_dictoffset*/ | 
					
						
							|  |  |  |     0,                      /*tp_init*/ | 
					
						
							|  |  |  |     0,                      /*tp_alloc*/ | 
					
						
							|  |  |  |     0,                      /*tp_new*/ | 
					
						
							|  |  |  |     0,                      /*tp_free*/ | 
					
						
							|  |  |  |     0,                      /*tp_is_gc*/ | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | /* --------------------------------------------------------------------- */ | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Function of two integers returning integer */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-14 01:44:33 +00:00
										 |  |  | PyDoc_STRVAR(xx_foo_doc, | 
					
						
							|  |  |  | "foo(i,j)\n\
 | 
					
						
							|  |  |  | \n\ | 
					
						
							|  |  |  | Return the sum of i and j."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | xx_foo(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     long i, j; | 
					
						
							|  |  |  |     long res; | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, "ll:foo", &i, &j)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     res = i+j; /* XXX Do something here */ | 
					
						
							|  |  |  |     return PyLong_FromLong(res); | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | /* Function of no arguments returning new Xxo object */ | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | xx_new(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     XxoObject *rv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, ":new")) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     rv = newXxoObject(args); | 
					
						
							|  |  |  |     if (rv == NULL) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     return (PyObject *)rv; | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-13 02:57:25 +00:00
										 |  |  | /* Example with subtle bug from extensions manual ("Thin Ice"). */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | xx_bug(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-12-13 02:57:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *list, *item; | 
					
						
							| 
									
										
										
										
											2002-05-23 15:49:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, "O:bug", &list)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2002-05-23 15:49:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     item = PyList_GetItem(list, 0); | 
					
						
							|  |  |  |     /* Py_INCREF(item); */ | 
					
						
							|  |  |  |     PyList_SetItem(list, 1, PyLong_FromLong(0L)); | 
					
						
							|  |  |  |     PyObject_Print(item, stdout, 0); | 
					
						
							|  |  |  |     printf("\n"); | 
					
						
							|  |  |  |     /* Py_DECREF(item); */ | 
					
						
							| 
									
										
										
										
											2002-05-23 15:49:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     Py_INCREF(Py_None); | 
					
						
							|  |  |  |     return Py_None; | 
					
						
							| 
									
										
										
										
											1996-12-13 02:57:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-12-09 20:37:25 +00:00
										 |  |  | /* Test bad format character */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-10 11:56:03 +00:00
										 |  |  | xx_roj(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1997-12-09 20:37:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *a; | 
					
						
							|  |  |  |     long b; | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, "O#:roj", &a, &b)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     Py_INCREF(Py_None); | 
					
						
							|  |  |  |     return Py_None; | 
					
						
							| 
									
										
										
										
											1997-12-09 20:37:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-11 21:19:11 +00:00
										 |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject Str_Type = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* The ob_type field must be initialized in the module init function
 | 
					
						
							|  |  |  |      * to be portable to Windows without using C++. */ | 
					
						
							|  |  |  |     PyVarObject_HEAD_INIT(NULL, 0) | 
					
						
							|  |  |  |     "xxmodule.Str",             /*tp_name*/ | 
					
						
							|  |  |  |     0,                          /*tp_basicsize*/ | 
					
						
							|  |  |  |     0,                          /*tp_itemsize*/ | 
					
						
							|  |  |  |     /* methods */ | 
					
						
							|  |  |  |     0,                          /*tp_dealloc*/ | 
					
						
							|  |  |  |     0,                          /*tp_print*/ | 
					
						
							|  |  |  |     0,                          /*tp_getattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_reserved*/ | 
					
						
							|  |  |  |     0,                          /*tp_repr*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_number*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_sequence*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_mapping*/ | 
					
						
							|  |  |  |     0,                          /*tp_hash*/ | 
					
						
							|  |  |  |     0,                          /*tp_call*/ | 
					
						
							|  |  |  |     0,                          /*tp_str*/ | 
					
						
							|  |  |  |     0,                          /*tp_getattro*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattro*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_buffer*/ | 
					
						
							|  |  |  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ | 
					
						
							|  |  |  |     0,                          /*tp_doc*/ | 
					
						
							|  |  |  |     0,                          /*tp_traverse*/ | 
					
						
							|  |  |  |     0,                          /*tp_clear*/ | 
					
						
							|  |  |  |     0,                          /*tp_richcompare*/ | 
					
						
							|  |  |  |     0,                          /*tp_weaklistoffset*/ | 
					
						
							|  |  |  |     0,                          /*tp_iter*/ | 
					
						
							|  |  |  |     0,                          /*tp_iternext*/ | 
					
						
							|  |  |  |     0,                          /*tp_methods*/ | 
					
						
							|  |  |  |     0,                          /*tp_members*/ | 
					
						
							|  |  |  |     0,                          /*tp_getset*/ | 
					
						
							|  |  |  |     0, /* see PyInit_xx */      /*tp_base*/ | 
					
						
							|  |  |  |     0,                          /*tp_dict*/ | 
					
						
							|  |  |  |     0,                          /*tp_descr_get*/ | 
					
						
							|  |  |  |     0,                          /*tp_descr_set*/ | 
					
						
							|  |  |  |     0,                          /*tp_dictoffset*/ | 
					
						
							|  |  |  |     0,                          /*tp_init*/ | 
					
						
							|  |  |  |     0,                          /*tp_alloc*/ | 
					
						
							|  |  |  |     0,                          /*tp_new*/ | 
					
						
							|  |  |  |     0,                          /*tp_free*/ | 
					
						
							|  |  |  |     0,                          /*tp_is_gc*/ | 
					
						
							| 
									
										
										
										
											2003-02-11 21:19:11 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-13 18:44:57 +00:00
										 |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | null_richcompare(PyObject *self, PyObject *other, int op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     Py_INCREF(Py_NotImplemented); | 
					
						
							|  |  |  |     return Py_NotImplemented; | 
					
						
							| 
									
										
										
										
											2003-02-13 18:44:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject Null_Type = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* The ob_type field must be initialized in the module init function
 | 
					
						
							|  |  |  |      * to be portable to Windows without using C++. */ | 
					
						
							|  |  |  |     PyVarObject_HEAD_INIT(NULL, 0) | 
					
						
							|  |  |  |     "xxmodule.Null",            /*tp_name*/ | 
					
						
							|  |  |  |     0,                          /*tp_basicsize*/ | 
					
						
							|  |  |  |     0,                          /*tp_itemsize*/ | 
					
						
							|  |  |  |     /* methods */ | 
					
						
							|  |  |  |     0,                          /*tp_dealloc*/ | 
					
						
							|  |  |  |     0,                          /*tp_print*/ | 
					
						
							|  |  |  |     0,                          /*tp_getattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_reserved*/ | 
					
						
							|  |  |  |     0,                          /*tp_repr*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_number*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_sequence*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_mapping*/ | 
					
						
							|  |  |  |     0,                          /*tp_hash*/ | 
					
						
							|  |  |  |     0,                          /*tp_call*/ | 
					
						
							|  |  |  |     0,                          /*tp_str*/ | 
					
						
							|  |  |  |     0,                          /*tp_getattro*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattro*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_buffer*/ | 
					
						
							|  |  |  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ | 
					
						
							|  |  |  |     0,                          /*tp_doc*/ | 
					
						
							|  |  |  |     0,                          /*tp_traverse*/ | 
					
						
							|  |  |  |     0,                          /*tp_clear*/ | 
					
						
							|  |  |  |     null_richcompare,           /*tp_richcompare*/ | 
					
						
							|  |  |  |     0,                          /*tp_weaklistoffset*/ | 
					
						
							|  |  |  |     0,                          /*tp_iter*/ | 
					
						
							|  |  |  |     0,                          /*tp_iternext*/ | 
					
						
							|  |  |  |     0,                          /*tp_methods*/ | 
					
						
							|  |  |  |     0,                          /*tp_members*/ | 
					
						
							|  |  |  |     0,                          /*tp_getset*/ | 
					
						
							|  |  |  |     0, /* see PyInit_xx */      /*tp_base*/ | 
					
						
							|  |  |  |     0,                          /*tp_dict*/ | 
					
						
							|  |  |  |     0,                          /*tp_descr_get*/ | 
					
						
							|  |  |  |     0,                          /*tp_descr_set*/ | 
					
						
							|  |  |  |     0,                          /*tp_dictoffset*/ | 
					
						
							|  |  |  |     0,                          /*tp_init*/ | 
					
						
							|  |  |  |     0,                          /*tp_alloc*/ | 
					
						
							|  |  |  |     0, /* see PyInit_xx */      /*tp_new*/ | 
					
						
							|  |  |  |     0,                          /*tp_free*/ | 
					
						
							|  |  |  |     0,                          /*tp_is_gc*/ | 
					
						
							| 
									
										
										
										
											2003-02-13 18:44:57 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-11 21:19:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | /* List of functions defined in the module */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 16:56:16 +00:00
										 |  |  | static PyMethodDef xx_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"roj",             xx_roj,         METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("roj(a,b) -> None")}, | 
					
						
							|  |  |  |     {"foo",             xx_foo,         METH_VARARGS, | 
					
						
							|  |  |  |         xx_foo_doc}, | 
					
						
							|  |  |  |     {"new",             xx_new,         METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("new() -> new Xx object")}, | 
					
						
							|  |  |  |     {"bug",             xx_bug,         METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("bug(o) -> None")}, | 
					
						
							|  |  |  |     {NULL,              NULL}           /* sentinel */ | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-14 01:44:33 +00:00
										 |  |  | PyDoc_STRVAR(module_doc, | 
					
						
							|  |  |  | "This is a template module just for instruction."); | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | /* Initialization function for the module (*must* be called PyInit_xx) */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyModuleDef xxmodule = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "xx", | 
					
						
							|  |  |  |     module_doc, | 
					
						
							|  |  |  |     -1, | 
					
						
							|  |  |  |     xx_methods, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-02 02:27:13 +00:00
										 |  |  | PyMODINIT_FUNC | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | PyInit_xx(void) | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *m = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Due to cross platform compiler issues the slots must be filled
 | 
					
						
							|  |  |  |      * here. It's required for portability to Windows without requiring | 
					
						
							|  |  |  |      * C++. */ | 
					
						
							|  |  |  |     Null_Type.tp_base = &PyBaseObject_Type; | 
					
						
							|  |  |  |     Null_Type.tp_new = PyType_GenericNew; | 
					
						
							|  |  |  |     Str_Type.tp_base = &PyUnicode_Type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Finalize the type object including setting type of the new type
 | 
					
						
							|  |  |  |      * object; doing it here is required for portability, too. */ | 
					
						
							|  |  |  |     if (PyType_Ready(&Xxo_Type) < 0) | 
					
						
							|  |  |  |         goto fail; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Create the module and add the functions */ | 
					
						
							|  |  |  |     m = PyModule_Create(&xxmodule); | 
					
						
							|  |  |  |     if (m == NULL) | 
					
						
							|  |  |  |         goto fail; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Add some symbolic constants to the module */ | 
					
						
							|  |  |  |     if (ErrorObject == NULL) { | 
					
						
							|  |  |  |         ErrorObject = PyErr_NewException("xx.error", NULL, NULL); | 
					
						
							|  |  |  |         if (ErrorObject == NULL) | 
					
						
							|  |  |  |             goto fail; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     Py_INCREF(ErrorObject); | 
					
						
							|  |  |  |     PyModule_AddObject(m, "error", ErrorObject); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Add Str */ | 
					
						
							|  |  |  |     if (PyType_Ready(&Str_Type) < 0) | 
					
						
							|  |  |  |         goto fail; | 
					
						
							|  |  |  |     PyModule_AddObject(m, "Str", (PyObject *)&Str_Type); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Add Null */ | 
					
						
							|  |  |  |     if (PyType_Ready(&Null_Type) < 0) | 
					
						
							|  |  |  |         goto fail; | 
					
						
							|  |  |  |     PyModule_AddObject(m, "Null", (PyObject *)&Null_Type); | 
					
						
							|  |  |  |     return m; | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  |  fail: | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     Py_XDECREF(m); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | } |