blob: 621eab81022ed025bb6d4208a5852a793e757bc9 [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 Rossum2b654441996-07-30 16:56:16 +0000101 "Xxo", /*tp_name*/
102 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*/
115};
116/* --------------------------------------------------------------------- */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117
118/* Function of two integers returning integer */
119
Guido van Rossum2b654441996-07-30 16:56:16 +0000120static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000121xx_foo(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122{
123 long i, j;
124 long res;
Guido van Rossum43713e52000-02-29 13:59:29 +0000125 if (!PyArg_ParseTuple(args, "ll:foo", &i, &j))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 return NULL;
127 res = i+j; /* XXX Do something here */
Guido van Rossum2b654441996-07-30 16:56:16 +0000128 return PyInt_FromLong(res);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129}
130
131
Guido van Rossum2b654441996-07-30 16:56:16 +0000132/* Function of no arguments returning new Xxo object */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133
Guido van Rossum2b654441996-07-30 16:56:16 +0000134static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000135xx_new(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136{
Guido van Rossum2b654441996-07-30 16:56:16 +0000137 XxoObject *rv;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000138
Guido van Rossum43713e52000-02-29 13:59:29 +0000139 if (!PyArg_ParseTuple(args, ":new"))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000141 rv = newXxoObject(args);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000142 if ( rv == NULL )
143 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000144 return (PyObject *)rv;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145}
146
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000147/* Example with subtle bug from extensions manual ("Thin Ice"). */
148
149static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000150xx_bug(PyObject *self, PyObject *args)
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000151{
152 PyObject *list, *item;
153
Guido van Rossum43713e52000-02-29 13:59:29 +0000154 if (!PyArg_ParseTuple(args, "O:bug", &list))
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000155 return NULL;
156
157 item = PyList_GetItem(list, 0);
158 /* Py_INCREF(item); */
159 PyList_SetItem(list, 1, PyInt_FromLong(0L));
160 PyObject_Print(item, stdout, 0);
161 printf("\n");
162 /* Py_DECREF(item); */
163
164 Py_INCREF(Py_None);
165 return Py_None;
166}
167
Guido van Rossumc525e431997-12-09 20:37:25 +0000168/* Test bad format character */
169
170static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000171xx_roj(PyObject *self, PyObject *args)
Guido van Rossumc525e431997-12-09 20:37:25 +0000172{
173 PyObject *a;
174 long b;
Guido van Rossum43713e52000-02-29 13:59:29 +0000175 if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
Guido van Rossumc525e431997-12-09 20:37:25 +0000176 return NULL;
177 Py_INCREF(Py_None);
178 return Py_None;
179}
180
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181
182/* List of functions defined in the module */
183
Guido van Rossum2b654441996-07-30 16:56:16 +0000184static PyMethodDef xx_methods[] = {
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +0000185 {"roj", xx_roj, METH_VARARGS},
186 {"foo", xx_foo, METH_VARARGS},
187 {"new", xx_new, METH_VARARGS},
188 {"bug", xx_bug, METH_VARARGS},
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189 {NULL, NULL} /* sentinel */
190};
191
192
193/* Initialization function for the module (*must* be called initxx) */
194
Guido van Rossum3886bb61998-12-04 18:50:17 +0000195DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000196initxx(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197{
Guido van Rossum2b654441996-07-30 16:56:16 +0000198 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199
Fred Drake67248351999-02-16 22:15:42 +0000200 /* Initialize the type of the new type object here; doing it here
201 * is required for portability to Windows without requiring C++. */
202 Xxo_Type.ob_type = &PyType_Type;
203
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000204 /* Create the module and add the functions */
Guido van Rossum2b654441996-07-30 16:56:16 +0000205 m = Py_InitModule("xx", xx_methods);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206
207 /* Add some symbolic constants to the module */
Guido van Rossum2b654441996-07-30 16:56:16 +0000208 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000209 ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
Guido van Rossum2b654441996-07-30 16:56:16 +0000210 PyDict_SetItemString(d, "error", ErrorObject);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211}