|
1 #include <Python.h> |
|
2 |
|
3 typedef struct { |
|
4 PyListObject list; |
|
5 int state; |
|
6 } Shoddy; |
|
7 |
|
8 |
|
9 static PyObject * |
|
10 Shoddy_increment(Shoddy *self, PyObject *unused) |
|
11 { |
|
12 self->state++; |
|
13 return PyInt_FromLong(self->state); |
|
14 } |
|
15 |
|
16 |
|
17 static PyMethodDef Shoddy_methods[] = { |
|
18 {"increment", (PyCFunction)Shoddy_increment, METH_NOARGS, |
|
19 PyDoc_STR("increment state counter")}, |
|
20 {NULL, NULL}, |
|
21 }; |
|
22 |
|
23 static int |
|
24 Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) |
|
25 { |
|
26 if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0) |
|
27 return -1; |
|
28 self->state = 0; |
|
29 return 0; |
|
30 } |
|
31 |
|
32 |
|
33 static PyTypeObject ShoddyType = { |
|
34 PyObject_HEAD_INIT(NULL) |
|
35 0, /* ob_size */ |
|
36 "shoddy.Shoddy", /* tp_name */ |
|
37 sizeof(Shoddy), /* tp_basicsize */ |
|
38 0, /* tp_itemsize */ |
|
39 0, /* tp_dealloc */ |
|
40 0, /* tp_print */ |
|
41 0, /* tp_getattr */ |
|
42 0, /* tp_setattr */ |
|
43 0, /* tp_compare */ |
|
44 0, /* tp_repr */ |
|
45 0, /* tp_as_number */ |
|
46 0, /* tp_as_sequence */ |
|
47 0, /* tp_as_mapping */ |
|
48 0, /* tp_hash */ |
|
49 0, /* tp_call */ |
|
50 0, /* tp_str */ |
|
51 0, /* tp_getattro */ |
|
52 0, /* tp_setattro */ |
|
53 0, /* tp_as_buffer */ |
|
54 Py_TPFLAGS_DEFAULT | |
|
55 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
56 0, /* tp_doc */ |
|
57 0, /* tp_traverse */ |
|
58 0, /* tp_clear */ |
|
59 0, /* tp_richcompare */ |
|
60 0, /* tp_weaklistoffset */ |
|
61 0, /* tp_iter */ |
|
62 0, /* tp_iternext */ |
|
63 Shoddy_methods, /* tp_methods */ |
|
64 0, /* tp_members */ |
|
65 0, /* tp_getset */ |
|
66 0, /* tp_base */ |
|
67 0, /* tp_dict */ |
|
68 0, /* tp_descr_get */ |
|
69 0, /* tp_descr_set */ |
|
70 0, /* tp_dictoffset */ |
|
71 (initproc)Shoddy_init, /* tp_init */ |
|
72 0, /* tp_alloc */ |
|
73 0, /* tp_new */ |
|
74 }; |
|
75 |
|
76 PyMODINIT_FUNC |
|
77 initshoddy(void) |
|
78 { |
|
79 PyObject *m; |
|
80 |
|
81 ShoddyType.tp_base = &PyList_Type; |
|
82 if (PyType_Ready(&ShoddyType) < 0) |
|
83 return; |
|
84 |
|
85 m = Py_InitModule3("shoddy", NULL, "Shoddy module"); |
|
86 if (m == NULL) |
|
87 return; |
|
88 |
|
89 Py_INCREF(&ShoddyType); |
|
90 PyModule_AddObject(m, "Shoddy", (PyObject *) &ShoddyType); |
|
91 } |