| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-17 19:09:15 +09:00
										 |  |  | #define XxoObject_Check(v)      Py_IS_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); | 
					
						
							| 
									
										
										
										
											2020-12-01 10:37:39 +01:00
										 |  |  |     PyObject_Free(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; | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |     return Py_NewRef(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) { | 
					
						
							| 
									
										
										
										
											2019-02-25 17:59:46 +02:00
										 |  |  |         PyObject *v = PyDict_GetItemWithError(self->x_attr, name); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (v != NULL) { | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |             return Py_NewRef(v); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-02-25 17:59:46 +02:00
										 |  |  |         else if (PyErr_Occurred()) { | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return PyObject_GenericGetAttr((PyObject *)self, name); | 
					
						
							| 
									
										
										
										
											1994-09-29 09:50:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2015-12-25 20:01:53 +02:00
										 |  |  | Xxo_setattr(XxoObject *self, const 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); | 
					
						
							| 
									
										
										
										
											2019-02-25 17:59:46 +02:00
										 |  |  |         if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             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 */ | 
					
						
							| 
									
										
										
										
											2013-01-01 07:41:51 -08:00
										 |  |  |     (destructor)Xxo_dealloc,    /*tp_dealloc*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_vectorcall_offset*/ | 
					
						
							| 
									
										
										
										
											2013-01-01 07:41:51 -08:00
										 |  |  |     (getattrfunc)0,             /*tp_getattr*/ | 
					
						
							|  |  |  |     (setattrfunc)Xxo_setattr,   /*tp_setattr*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_as_async*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     0,                          /*tp_repr*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_number*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_sequence*/ | 
					
						
							|  |  |  |     0,                          /*tp_as_mapping*/ | 
					
						
							|  |  |  |     0,                          /*tp_hash*/ | 
					
						
							| 
									
										
										
										
											2013-01-01 07:41:51 -08:00
										 |  |  |     0,                          /*tp_call*/ | 
					
						
							|  |  |  |     0,                          /*tp_str*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     (getattrofunc)Xxo_getattro, /*tp_getattro*/ | 
					
						
							| 
									
										
										
										
											2013-01-01 07:41:51 -08:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |     return Py_NewRef(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; | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |     return Py_NewRef(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*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_vectorcall_offset*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     0,                          /*tp_getattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattr*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_as_async*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-11-14 16:21:40 +01:00
										 |  |  |     return Py_NewRef(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*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_vectorcall_offset*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     0,                          /*tp_getattr*/ | 
					
						
							|  |  |  |     0,                          /*tp_setattr*/ | 
					
						
							| 
									
										
										
										
											2019-05-31 04:13:39 +02:00
										 |  |  |     0,                          /*tp_as_async*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     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*/ | 
					
						
							| 
									
										
										
										
											2017-09-22 17:44:58 +02:00
										 |  |  |     PyType_GenericNew,          /*tp_new*/ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-23 22:24:10 +10:00
										 |  |  | static int | 
					
						
							|  |  |  | xx_exec(PyObject *m) | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-22 17:44:58 +02:00
										 |  |  |     /* Slot initialization is subject to the rules of initializing globals.
 | 
					
						
							|  |  |  |        C99 requires the initializers to be "address constants".  Function | 
					
						
							|  |  |  |        designators like 'PyType_GenericNew', with implicit conversion to | 
					
						
							|  |  |  |        a pointer, are valid C99 address constants. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        However, the unary '&' operator applied to a non-static variable | 
					
						
							|  |  |  |        like 'PyBaseObject_Type' is not required to produce an address | 
					
						
							|  |  |  |        constant.  Compilers may support this (gcc does), MSVC does not. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Both compilers are strictly standard conforming in this particular | 
					
						
							|  |  |  |        behavior. | 
					
						
							|  |  |  |     */ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     Null_Type.tp_base = &PyBaseObject_Type; | 
					
						
							|  |  |  |     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. */ | 
					
						
							| 
									
										
										
										
											2022-06-10 12:39:02 +02:00
										 |  |  |     if (PyType_Ready(&Xxo_Type) < 0) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Add some symbolic constants to the module */ | 
					
						
							|  |  |  |     if (ErrorObject == NULL) { | 
					
						
							|  |  |  |         ErrorObject = PyErr_NewException("xx.error", NULL, NULL); | 
					
						
							| 
									
										
										
										
											2022-06-10 12:39:02 +02:00
										 |  |  |         if (ErrorObject == NULL) { | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     int rc = PyModule_AddType(m, (PyTypeObject *)ErrorObject); | 
					
						
							|  |  |  |     Py_DECREF(ErrorObject); | 
					
						
							|  |  |  |     if (rc < 0) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-06-10 12:39:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Add Str and Null types */ | 
					
						
							|  |  |  |     if (PyModule_AddType(m, &Str_Type) < 0) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (PyModule_AddType(m, &Null_Type) < 0) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-23 22:24:10 +10:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyModuleDef_Slot xx_slots[] = { | 
					
						
							|  |  |  |     {Py_mod_exec, xx_exec}, | 
					
						
							| 
									
										
										
										
											2023-05-05 15:11:27 -06:00
										 |  |  |     {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, | 
					
						
							| 
									
										
										
										
											2024-05-03 08:30:55 -07:00
										 |  |  |     {Py_mod_gil, Py_MOD_GIL_NOT_USED}, | 
					
						
							| 
									
										
										
										
											2015-05-23 22:24:10 +10:00
										 |  |  |     {0, NULL}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyModuleDef xxmodule = { | 
					
						
							|  |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "xx", | 
					
						
							|  |  |  |     module_doc, | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     xx_methods, | 
					
						
							|  |  |  |     xx_slots, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Export function for the module (*must* be called PyInit_xx) */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyMODINIT_FUNC | 
					
						
							|  |  |  | PyInit_xx(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return PyModuleDef_Init(&xxmodule); | 
					
						
							| 
									
										
										
										
											1992-08-04 12:41:02 +00:00
										 |  |  | } |