blob: c9d96f7af9f8f459abde528d1d113322d402288f [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
Guido van Rossum2b654441996-07-30 16:56:16 +000012 also declares objects 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 *
40newXxoObject(arg)
41 PyObject *arg;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000042{
Guido van Rossum2b654441996-07-30 16:56:16 +000043 XxoObject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000044 self = PyObject_New(XxoObject, &Xxo_Type);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000045 if (self == NULL)
46 return NULL;
47 self->x_attr = NULL;
48 return self;
49}
50
51/* Xxo methods */
52
53static void
Guido van Rossum2b654441996-07-30 16:56:16 +000054Xxo_dealloc(self)
55 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000056{
Guido van Rossum2b654441996-07-30 16:56:16 +000057 Py_XDECREF(self->x_attr);
Guido van Rossumb18618d2000-05-03 23:44:39 +000058 PyObject_Del(self);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000059}
60
Guido van Rossum2b654441996-07-30 16:56:16 +000061static PyObject *
62Xxo_demo(self, args)
63 XxoObject *self;
64 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000065{
Guido van Rossum43713e52000-02-29 13:59:29 +000066 if (!PyArg_ParseTuple(args, ":demo"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +000067 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +000068 Py_INCREF(Py_None);
69 return Py_None;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000070}
71
Guido van Rossum2b654441996-07-30 16:56:16 +000072static PyMethodDef Xxo_methods[] = {
73 {"demo", (PyCFunction)Xxo_demo, 1},
Guido van Rossum14ed0b21994-09-29 09:50:09 +000074 {NULL, NULL} /* sentinel */
75};
76
Guido van Rossum2b654441996-07-30 16:56:16 +000077static PyObject *
78Xxo_getattr(self, name)
79 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000080 char *name;
81{
82 if (self->x_attr != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000083 PyObject *v = PyDict_GetItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000084 if (v != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000085 Py_INCREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000086 return v;
87 }
88 }
Guido van Rossum2b654441996-07-30 16:56:16 +000089 return Py_FindMethod(Xxo_methods, (PyObject *)self, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000090}
91
92static int
Guido van Rossum2b654441996-07-30 16:56:16 +000093Xxo_setattr(self, name, v)
94 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000095 char *name;
Guido van Rossum2b654441996-07-30 16:56:16 +000096 PyObject *v;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000097{
98 if (self->x_attr == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000099 self->x_attr = PyDict_New();
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000100 if (self->x_attr == NULL)
101 return -1;
102 }
103 if (v == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +0000104 int rv = PyDict_DelItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000105 if (rv < 0)
Guido van Rossum2b654441996-07-30 16:56:16 +0000106 PyErr_SetString(PyExc_AttributeError,
107 "delete non-existing Xxo attribute");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000108 return rv;
109 }
110 else
Guido van Rossum2b654441996-07-30 16:56:16 +0000111 return PyDict_SetItemString(self->x_attr, name, v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000112}
113
Fred Drake67248351999-02-16 22:15:42 +0000114statichere PyTypeObject Xxo_Type = {
115 /* The ob_type field must be initialized in the module init function
116 * to be portable to Windows without using C++. */
117 PyObject_HEAD_INIT(NULL)
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000118 0, /*ob_size*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000119 "Xxo", /*tp_name*/
120 sizeof(XxoObject), /*tp_basicsize*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000121 0, /*tp_itemsize*/
122 /* methods */
Guido van Rossum2b654441996-07-30 16:56:16 +0000123 (destructor)Xxo_dealloc, /*tp_dealloc*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000124 0, /*tp_print*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000125 (getattrfunc)Xxo_getattr, /*tp_getattr*/
126 (setattrfunc)Xxo_setattr, /*tp_setattr*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000127 0, /*tp_compare*/
128 0, /*tp_repr*/
129 0, /*tp_as_number*/
130 0, /*tp_as_sequence*/
131 0, /*tp_as_mapping*/
132 0, /*tp_hash*/
133};
134/* --------------------------------------------------------------------- */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135
136/* Function of two integers returning integer */
137
Guido van Rossum2b654441996-07-30 16:56:16 +0000138static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139xx_foo(self, args)
Guido van Rossum2b654441996-07-30 16:56:16 +0000140 PyObject *self; /* Not used */
141 PyObject *args;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142{
143 long i, j;
144 long res;
Guido van Rossum43713e52000-02-29 13:59:29 +0000145 if (!PyArg_ParseTuple(args, "ll:foo", &i, &j))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 return NULL;
147 res = i+j; /* XXX Do something here */
Guido van Rossum2b654441996-07-30 16:56:16 +0000148 return PyInt_FromLong(res);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149}
150
151
Guido van Rossum2b654441996-07-30 16:56:16 +0000152/* Function of no arguments returning new Xxo object */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153
Guido van Rossum2b654441996-07-30 16:56:16 +0000154static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000155xx_new(self, args)
Guido van Rossum2b654441996-07-30 16:56:16 +0000156 PyObject *self; /* Not used */
157 PyObject *args;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158{
Guido van Rossum2b654441996-07-30 16:56:16 +0000159 XxoObject *rv;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000160
Guido van Rossum43713e52000-02-29 13:59:29 +0000161 if (!PyArg_ParseTuple(args, ":new"))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000163 rv = newXxoObject(args);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000164 if ( rv == NULL )
165 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000166 return (PyObject *)rv;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000167}
168
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000169/* Example with subtle bug from extensions manual ("Thin Ice"). */
170
171static PyObject *
172xx_bug(self, args)
173 PyObject *self;
174 PyObject *args;
175{
176 PyObject *list, *item;
177
Guido van Rossum43713e52000-02-29 13:59:29 +0000178 if (!PyArg_ParseTuple(args, "O:bug", &list))
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000179 return NULL;
180
181 item = PyList_GetItem(list, 0);
182 /* Py_INCREF(item); */
183 PyList_SetItem(list, 1, PyInt_FromLong(0L));
184 PyObject_Print(item, stdout, 0);
185 printf("\n");
186 /* Py_DECREF(item); */
187
188 Py_INCREF(Py_None);
189 return Py_None;
190}
191
Guido van Rossumc525e431997-12-09 20:37:25 +0000192/* Test bad format character */
193
194static PyObject *
195xx_roj(self, args)
196 PyObject *self; /* Not used */
197 PyObject *args;
198{
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[] = {
Guido van Rossumc525e431997-12-09 20:37:25 +0000211 {"roj", xx_roj, 1},
Guido van Rossum2b654441996-07-30 16:56:16 +0000212 {"foo", xx_foo, 1},
213 {"new", xx_new, 1},
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000214 {"bug", xx_bug, 1},
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)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222initxx()
223{
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}