| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     PyListObject list; | 
					
						
							|  |  |  |     int state; | 
					
						
							|  |  |  | } Shoddy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | Shoddy_increment(Shoddy *self, PyObject *unused) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     self->state++; | 
					
						
							| 
									
										
										
										
											2007-12-02 14:31:20 +00:00
										 |  |  |     return PyLong_FromLong(self->state); | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef Shoddy_methods[] = { | 
					
						
							|  |  |  |     {"increment", (PyCFunction)Shoddy_increment, METH_NOARGS, | 
					
						
							|  |  |  |      PyDoc_STR("increment state counter")}, | 
					
						
							|  |  |  |     {NULL,	NULL}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     self->state = 0; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject ShoddyType = { | 
					
						
							|  |  |  |     PyObject_HEAD_INIT(NULL) | 
					
						
							|  |  |  |     "shoddy.Shoddy",         /* tp_name */ | 
					
						
							|  |  |  |     sizeof(Shoddy),          /* tp_basicsize */ | 
					
						
							|  |  |  |     0,                       /* tp_itemsize */ | 
					
						
							|  |  |  |     0,                       /* tp_dealloc */ | 
					
						
							|  |  |  |     0,                       /* tp_print */ | 
					
						
							|  |  |  |     0,                       /* tp_getattr */ | 
					
						
							|  |  |  |     0,                       /* tp_setattr */ | 
					
						
							| 
									
										
										
										
											2009-02-02 21:29:40 +00:00
										 |  |  |     0,                       /* tp_reserved */ | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +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 | | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  |         Py_TPFLAGS_BASETYPE, /* tp_flags */ | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |     0,                       /* tp_doc */ | 
					
						
							|  |  |  |     0,                       /* tp_traverse */ | 
					
						
							|  |  |  |     0,                       /* tp_clear */ | 
					
						
							|  |  |  |     0,                       /* tp_richcompare */ | 
					
						
							|  |  |  |     0,                       /* tp_weaklistoffset */ | 
					
						
							|  |  |  |     0,                       /* tp_iter */ | 
					
						
							|  |  |  |     0,                       /* tp_iternext */ | 
					
						
							|  |  |  |     Shoddy_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 */ | 
					
						
							|  |  |  |     (initproc)Shoddy_init,   /* tp_init */ | 
					
						
							|  |  |  |     0,                       /* tp_alloc */ | 
					
						
							|  |  |  |     0,                       /* tp_new */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  | static PyModuleDef shoddymodule = { | 
					
						
							|  |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "shoddy", | 
					
						
							|  |  |  |     "Shoddy module", | 
					
						
							|  |  |  |     -1, | 
					
						
							|  |  |  |     NULL, NULL, NULL, NULL, NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | PyMODINIT_FUNC | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  | PyInit_shoddy(void) | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     PyObject *m; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ShoddyType.tp_base = &PyList_Type; | 
					
						
							|  |  |  |     if (PyType_Ready(&ShoddyType) < 0) | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  |     m = PyModule_Create(&shoddymodule); | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |     if (m == NULL) | 
					
						
							| 
									
										
										
										
											2008-12-05 15:12:15 +00:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Py_INCREF(&ShoddyType); | 
					
						
							|  |  |  |     PyModule_AddObject(m, "Shoddy", (PyObject *) &ShoddyType); | 
					
						
							| 
									
										
										
										
											2009-09-01 08:03:26 +00:00
										 |  |  |     return m; | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | } |