blob: e80c2eee98d44bbb6c0c581342aaafb5e4340177 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009******************************************************************/
10
Guido van Rossum14ed0b21994-09-29 09:50:09 +000011/* Use this file as a template to start implementing a module that
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +000012 also declares object types. All occurrences of 'Xxo' should be changed
Guido van Rossum14ed0b21994-09-29 09:50:09 +000013 to something reasonable for your objects. After that, all other
14 occurrences of 'xx' should be changed to something reasonable for your
15 module. If your module is named foo your sourcefile should be named
16 foomodule.c.
17
18 You will probably want to delete all references to 'x_attr' and add
19 your own types of attributes instead. Maybe you want to name your
20 local variables other than 'self'. If your object type is needed in
21 other files, you'll have to create a file "foobarobject.h"; see
22 intobject.h for an example. */
23
24/* Xxo objects */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000025
Guido van Rossum2b654441996-07-30 16:56:16 +000026#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000027
Guido van Rossum2b654441996-07-30 16:56:16 +000028static PyObject *ErrorObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000029
30typedef struct {
Guido van Rossum2b654441996-07-30 16:56:16 +000031 PyObject_HEAD
32 PyObject *x_attr; /* Attributes dictionary */
33} XxoObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000034
Guido van Rossum2b654441996-07-30 16:56:16 +000035staticforward PyTypeObject Xxo_Type;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000036
Guido van Rossum2b654441996-07-30 16:56:16 +000037#define XxoObject_Check(v) ((v)->ob_type == &Xxo_Type)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000038
Guido van Rossum2b654441996-07-30 16:56:16 +000039static XxoObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000040newXxoObject(PyObject *arg)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000041{
Guido van Rossum2b654441996-07-30 16:56:16 +000042 XxoObject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000043 self = PyObject_New(XxoObject, &Xxo_Type);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000044 if (self == NULL)
45 return NULL;
46 self->x_attr = NULL;
47 return self;
48}
49
50/* Xxo methods */
51
52static void
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000053Xxo_dealloc(XxoObject *self)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000054{
Guido van Rossum2b654441996-07-30 16:56:16 +000055 Py_XDECREF(self->x_attr);
Guido van Rossumb18618d2000-05-03 23:44:39 +000056 PyObject_Del(self);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000057}
58
Guido van Rossum2b654441996-07-30 16:56:16 +000059static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000060Xxo_demo(XxoObject *self, PyObject *args)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000061{
Guido van Rossum43713e52000-02-29 13:59:29 +000062 if (!PyArg_ParseTuple(args, ":demo"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +000063 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +000064 Py_INCREF(Py_None);
65 return Py_None;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000066}
67
Guido van Rossum2b654441996-07-30 16:56:16 +000068static PyMethodDef Xxo_methods[] = {
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +000069 {"demo", (PyCFunction)Xxo_demo, METH_VARARGS},
Guido van Rossum14ed0b21994-09-29 09:50:09 +000070 {NULL, NULL} /* sentinel */
71};
72
Guido van Rossum2b654441996-07-30 16:56:16 +000073static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000074Xxo_getattr(XxoObject *self, char *name)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000075{
76 if (self->x_attr != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000077 PyObject *v = PyDict_GetItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000078 if (v != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000079 Py_INCREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000080 return v;
81 }
82 }
Guido van Rossum2b654441996-07-30 16:56:16 +000083 return Py_FindMethod(Xxo_methods, (PyObject *)self, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000084}
85
86static int
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +000087Xxo_setattr(XxoObject *self, char *name, PyObject *v)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000088{
89 if (self->x_attr == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000090 self->x_attr = PyDict_New();
Guido van Rossum14ed0b21994-09-29 09:50:09 +000091 if (self->x_attr == NULL)
92 return -1;
93 }
94 if (v == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000095 int rv = PyDict_DelItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000096 if (rv < 0)
Guido van Rossum2b654441996-07-30 16:56:16 +000097 PyErr_SetString(PyExc_AttributeError,
98 "delete non-existing Xxo attribute");
Guido van Rossum14ed0b21994-09-29 09:50:09 +000099 return rv;
100 }
101 else
Guido van Rossum2b654441996-07-30 16:56:16 +0000102 return PyDict_SetItemString(self->x_attr, name, v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000103}
104
Fred Drake67248351999-02-16 22:15:42 +0000105statichere PyTypeObject Xxo_Type = {
106 /* The ob_type field must be initialized in the module init function
107 * to be portable to Windows without using C++. */
108 PyObject_HEAD_INIT(NULL)
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000109 0, /*ob_size*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000110 "Xxo", /*tp_name*/
111 sizeof(XxoObject), /*tp_basicsize*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000112 0, /*tp_itemsize*/
113 /* methods */
Guido van Rossum2b654441996-07-30 16:56:16 +0000114 (destructor)Xxo_dealloc, /*tp_dealloc*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000115 0, /*tp_print*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000116 (getattrfunc)Xxo_getattr, /*tp_getattr*/
117 (setattrfunc)Xxo_setattr, /*tp_setattr*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000118 0, /*tp_compare*/
119 0, /*tp_repr*/
120 0, /*tp_as_number*/
121 0, /*tp_as_sequence*/
122 0, /*tp_as_mapping*/
123 0, /*tp_hash*/
124};
125/* --------------------------------------------------------------------- */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126
127/* Function of two integers returning integer */
128
Guido van Rossum2b654441996-07-30 16:56:16 +0000129static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000130xx_foo(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131{
132 long i, j;
133 long res;
Guido van Rossum43713e52000-02-29 13:59:29 +0000134 if (!PyArg_ParseTuple(args, "ll:foo", &i, &j))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135 return NULL;
136 res = i+j; /* XXX Do something here */
Guido van Rossum2b654441996-07-30 16:56:16 +0000137 return PyInt_FromLong(res);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138}
139
140
Guido van Rossum2b654441996-07-30 16:56:16 +0000141/* Function of no arguments returning new Xxo object */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142
Guido van Rossum2b654441996-07-30 16:56:16 +0000143static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000144xx_new(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145{
Guido van Rossum2b654441996-07-30 16:56:16 +0000146 XxoObject *rv;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000147
Guido van Rossum43713e52000-02-29 13:59:29 +0000148 if (!PyArg_ParseTuple(args, ":new"))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000150 rv = newXxoObject(args);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000151 if ( rv == NULL )
152 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000153 return (PyObject *)rv;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154}
155
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000156/* Example with subtle bug from extensions manual ("Thin Ice"). */
157
158static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000159xx_bug(PyObject *self, PyObject *args)
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000160{
161 PyObject *list, *item;
162
Guido van Rossum43713e52000-02-29 13:59:29 +0000163 if (!PyArg_ParseTuple(args, "O:bug", &list))
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000164 return NULL;
165
166 item = PyList_GetItem(list, 0);
167 /* Py_INCREF(item); */
168 PyList_SetItem(list, 1, PyInt_FromLong(0L));
169 PyObject_Print(item, stdout, 0);
170 printf("\n");
171 /* Py_DECREF(item); */
172
173 Py_INCREF(Py_None);
174 return Py_None;
175}
176
Guido van Rossumc525e431997-12-09 20:37:25 +0000177/* Test bad format character */
178
179static PyObject *
Peter Schneider-Kampc4bc0e02000-07-10 11:56:03 +0000180xx_roj(PyObject *self, PyObject *args)
Guido van Rossumc525e431997-12-09 20:37:25 +0000181{
182 PyObject *a;
183 long b;
Guido van Rossum43713e52000-02-29 13:59:29 +0000184 if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
Guido van Rossumc525e431997-12-09 20:37:25 +0000185 return NULL;
186 Py_INCREF(Py_None);
187 return Py_None;
188}
189
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190
191/* List of functions defined in the module */
192
Guido van Rossum2b654441996-07-30 16:56:16 +0000193static PyMethodDef xx_methods[] = {
Andrew M. Kuchlingf580d272000-08-19 15:36:41 +0000194 {"roj", xx_roj, METH_VARARGS},
195 {"foo", xx_foo, METH_VARARGS},
196 {"new", xx_new, METH_VARARGS},
197 {"bug", xx_bug, METH_VARARGS},
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 {NULL, NULL} /* sentinel */
199};
200
201
202/* Initialization function for the module (*must* be called initxx) */
203
Guido van Rossum3886bb61998-12-04 18:50:17 +0000204DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000205initxx(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206{
Guido van Rossum2b654441996-07-30 16:56:16 +0000207 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000208
Fred Drake67248351999-02-16 22:15:42 +0000209 /* Initialize the type of the new type object here; doing it here
210 * is required for portability to Windows without requiring C++. */
211 Xxo_Type.ob_type = &PyType_Type;
212
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213 /* Create the module and add the functions */
Guido van Rossum2b654441996-07-30 16:56:16 +0000214 m = Py_InitModule("xx", xx_methods);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215
216 /* Add some symbolic constants to the module */
Guido van Rossum2b654441996-07-30 16:56:16 +0000217 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000218 ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
Guido van Rossum2b654441996-07-30 16:56:16 +0000219 PyDict_SetItemString(d, "error", ErrorObject);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000220}