blob: 0ee9f7a8baad72035dc5cfceee5d2105f4f82b8c [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002/* Use this file as a template to start implementing a module that
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +00003 also declares object types. All occurrences of 'Xxo' should be changed
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004 to something reasonable for your objects. After that, all other
5 occurrences of 'xx' should be changed to something reasonable for your
6 module. If your module is named foo your sourcefile should be named
7 foomodule.c.
8
9 You will probably want to delete all references to 'x_attr' and add
10 your own types of attributes instead. Maybe you want to name your
11 local variables other than 'self'. If your object type is needed in
12 other files, you'll have to create a file "foobarobject.h"; see
13 intobject.h for an example. */
14
15/* Xxo objects */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossum2b654441996-07-30 16:56:16 +000017#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018
Guido van Rossum2b654441996-07-30 16:56:16 +000019static PyObject *ErrorObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000020
21typedef struct {
Guido van Rossum2b654441996-07-30 16:56:16 +000022 PyObject_HEAD
23 PyObject *x_attr; /* Attributes dictionary */
24} XxoObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000025
Guido van Rossum2b654441996-07-30 16:56:16 +000026staticforward PyTypeObject Xxo_Type;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000027
Guido van Rossum2b654441996-07-30 16:56:16 +000028#define XxoObject_Check(v) ((v)->ob_type == &Xxo_Type)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000029
Guido van Rossum2b654441996-07-30 16:56:16 +000030static XxoObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000031newXxoObject(PyObject *arg)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000032{
Guido van Rossum2b654441996-07-30 16:56:16 +000033 XxoObject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000034 self = PyObject_New(XxoObject, &Xxo_Type);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000035 if (self == NULL)
36 return NULL;
37 self->x_attr = NULL;
38 return self;
39}
40
41/* Xxo methods */
42
43static void
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000044Xxo_dealloc(XxoObject *self)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000045{
Guido van Rossum2b654441996-07-30 16:56:16 +000046 Py_XDECREF(self->x_attr);
Guido van Rossumb18618d2000-05-03 23:44:39 +000047 PyObject_Del(self);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000048}
49
Guido van Rossum2b654441996-07-30 16:56:16 +000050static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000051Xxo_demo(XxoObject *self, PyObject *args)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000052{
Guido van Rossum43713e52000-02-29 13:59:29 +000053 if (!PyArg_ParseTuple(args, ":demo"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +000054 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +000055 Py_INCREF(Py_None);
56 return Py_None;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000057}
58
Guido van Rossum2b654441996-07-30 16:56:16 +000059static PyMethodDef Xxo_methods[] = {
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +000060 {"demo", (PyCFunction)Xxo_demo, METH_VARARGS},
Guido van Rossum14ed0b21994-09-29 09:50:09 +000061 {NULL, NULL} /* sentinel */
62};
63
Guido van Rossum2b654441996-07-30 16:56:16 +000064static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000065Xxo_getattr(XxoObject *self, char *name)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000066{
67 if (self->x_attr != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000068 PyObject *v = PyDict_GetItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000069 if (v != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000070 Py_INCREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000071 return v;
72 }
73 }
Guido van Rossum2b654441996-07-30 16:56:16 +000074 return Py_FindMethod(Xxo_methods, (PyObject *)self, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000075}
76
77static int
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000078Xxo_setattr(XxoObject *self, char *name, PyObject *v)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000079{
80 if (self->x_attr == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000081 self->x_attr = PyDict_New();
Guido van Rossum14ed0b21994-09-29 09:50:09 +000082 if (self->x_attr == NULL)
83 return -1;
84 }
85 if (v == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000086 int rv = PyDict_DelItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000087 if (rv < 0)
Guido van Rossum2b654441996-07-30 16:56:16 +000088 PyErr_SetString(PyExc_AttributeError,
89 "delete non-existing Xxo attribute");
Guido van Rossum14ed0b21994-09-29 09:50:09 +000090 return rv;
91 }
92 else
Guido van Rossum2b654441996-07-30 16:56:16 +000093 return PyDict_SetItemString(self->x_attr, name, v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000094}
95
Fred Drake67248351999-02-16 22:15:42 +000096statichere PyTypeObject Xxo_Type = {
97 /* The ob_type field must be initialized in the module init function
98 * to be portable to Windows without using C++. */
99 PyObject_HEAD_INIT(NULL)
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000100 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +0000101 "xxmodule.Xxo", /*tp_name*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000102 sizeof(XxoObject), /*tp_basicsize*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000103 0, /*tp_itemsize*/
104 /* methods */
Guido van Rossum2b654441996-07-30 16:56:16 +0000105 (destructor)Xxo_dealloc, /*tp_dealloc*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000106 0, /*tp_print*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000107 (getattrfunc)Xxo_getattr, /*tp_getattr*/
108 (setattrfunc)Xxo_setattr, /*tp_setattr*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000109 0, /*tp_compare*/
110 0, /*tp_repr*/
111 0, /*tp_as_number*/
112 0, /*tp_as_sequence*/
113 0, /*tp_as_mapping*/
114 0, /*tp_hash*/
Martin v. Löwisffa7aff2001-10-09 10:46:58 +0000115 0, /*tp_call*/
116 0, /*tp_str*/
117 0, /*tp_getattro*/
118 0, /*tp_setattro*/
119 0, /*tp_as_buffer*/
120 Py_TPFLAGS_DEFAULT, /*tp_flags*/
121 0, /*tp_doc*/
122 0, /*tp_traverse*/
123 0, /*tp_clear*/
124 0, /*tp_richcompare*/
125 0, /*tp_weaklistoffset*/
126 0, /*tp_iter*/
127 0, /*tp_iternext*/
128 0, /*tp_methods*/
129 0, /*tp_members*/
130 0, /*tp_getset*/
131 0, /*tp_base*/
132 0, /*tp_dict*/
133 0, /*tp_descr_get*/
134 0, /*tp_descr_set*/
135 0, /*tp_dictoffset*/
136 0, /*tp_init*/
137 0, /*tp_alloc*/
138 0, /*tp_new*/
139 0, /*tp_free*/
140 0, /*tp_is_gc*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000141};
142/* --------------------------------------------------------------------- */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143
144/* Function of two integers returning integer */
145
Guido van Rossum2b654441996-07-30 16:56:16 +0000146static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000147xx_foo(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148{
149 long i, j;
150 long res;
Guido van Rossum43713e52000-02-29 13:59:29 +0000151 if (!PyArg_ParseTuple(args, "ll:foo", &i, &j))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152 return NULL;
153 res = i+j; /* XXX Do something here */
Guido van Rossum2b654441996-07-30 16:56:16 +0000154 return PyInt_FromLong(res);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000155}
156
157
Guido van Rossum2b654441996-07-30 16:56:16 +0000158/* Function of no arguments returning new Xxo object */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159
Guido van Rossum2b654441996-07-30 16:56:16 +0000160static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000161xx_new(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162{
Guido van Rossum2b654441996-07-30 16:56:16 +0000163 XxoObject *rv;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000164
Guido van Rossum43713e52000-02-29 13:59:29 +0000165 if (!PyArg_ParseTuple(args, ":new"))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000167 rv = newXxoObject(args);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000168 if ( rv == NULL )
169 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000170 return (PyObject *)rv;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171}
172
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000173/* Example with subtle bug from extensions manual ("Thin Ice"). */
174
175static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000176xx_bug(PyObject *self, PyObject *args)
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000177{
178 PyObject *list, *item;
179
Guido van Rossum43713e52000-02-29 13:59:29 +0000180 if (!PyArg_ParseTuple(args, "O:bug", &list))
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000181 return NULL;
182
183 item = PyList_GetItem(list, 0);
184 /* Py_INCREF(item); */
185 PyList_SetItem(list, 1, PyInt_FromLong(0L));
186 PyObject_Print(item, stdout, 0);
187 printf("\n");
188 /* Py_DECREF(item); */
189
190 Py_INCREF(Py_None);
191 return Py_None;
192}
193
Guido van Rossumc525e431997-12-09 20:37:25 +0000194/* Test bad format character */
195
196static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000197xx_roj(PyObject *self, PyObject *args)
Guido van Rossumc525e431997-12-09 20:37:25 +0000198{
199 PyObject *a;
200 long b;
Guido van Rossum43713e52000-02-29 13:59:29 +0000201 if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
Guido van Rossumc525e431997-12-09 20:37:25 +0000202 return NULL;
203 Py_INCREF(Py_None);
204 return Py_None;
205}
206
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000207
208/* List of functions defined in the module */
209
Guido van Rossum2b654441996-07-30 16:56:16 +0000210static PyMethodDef xx_methods[] = {
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +0000211 {"roj", xx_roj, METH_VARARGS},
212 {"foo", xx_foo, METH_VARARGS},
213 {"new", xx_new, METH_VARARGS},
214 {"bug", xx_bug, METH_VARARGS},
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215 {NULL, NULL} /* sentinel */
216};
217
218
219/* Initialization function for the module (*must* be called initxx) */
220
Guido van Rossum3886bb61998-12-04 18:50:17 +0000221DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000222initxx(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000223{
Guido van Rossum2b654441996-07-30 16:56:16 +0000224 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000225
Fred Drake67248351999-02-16 22:15:42 +0000226 /* Initialize the type of the new type object here; doing it here
227 * is required for portability to Windows without requiring C++. */
228 Xxo_Type.ob_type = &PyType_Type;
229
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000230 /* Create the module and add the functions */
Guido van Rossum2b654441996-07-30 16:56:16 +0000231 m = Py_InitModule("xx", xx_methods);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000232
233 /* Add some symbolic constants to the module */
Guido van Rossum2b654441996-07-30 16:56:16 +0000234 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000235 ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
Guido van Rossum2b654441996-07-30 16:56:16 +0000236 PyDict_SetItemString(d, "error", ErrorObject);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000237}