blob: 67b5474c1b4ea19391ca9611e042f46dc546eb91 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
15******************************************************************/
16
Guido van Rossum14ed0b21994-09-29 09:50:09 +000017/* Use this file as a template to start implementing a module that
Guido van Rossum2b654441996-07-30 16:56:16 +000018 also declares objects types. All occurrences of 'Xxo' should be changed
Guido van Rossum14ed0b21994-09-29 09:50:09 +000019 to something reasonable for your objects. After that, all other
20 occurrences of 'xx' should be changed to something reasonable for your
21 module. If your module is named foo your sourcefile should be named
22 foomodule.c.
23
24 You will probably want to delete all references to 'x_attr' and add
25 your own types of attributes instead. Maybe you want to name your
26 local variables other than 'self'. If your object type is needed in
27 other files, you'll have to create a file "foobarobject.h"; see
28 intobject.h for an example. */
29
30/* Xxo objects */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000031
Guido van Rossum2b654441996-07-30 16:56:16 +000032#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000033
Guido van Rossum2b654441996-07-30 16:56:16 +000034static PyObject *ErrorObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000035
36typedef struct {
Guido van Rossum2b654441996-07-30 16:56:16 +000037 PyObject_HEAD
38 PyObject *x_attr; /* Attributes dictionary */
39} XxoObject;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000040
Guido van Rossum2b654441996-07-30 16:56:16 +000041staticforward PyTypeObject Xxo_Type;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000042
Guido van Rossum2b654441996-07-30 16:56:16 +000043#define XxoObject_Check(v) ((v)->ob_type == &Xxo_Type)
Guido van Rossum14ed0b21994-09-29 09:50:09 +000044
Guido van Rossum2b654441996-07-30 16:56:16 +000045static XxoObject *
46newXxoObject(arg)
47 PyObject *arg;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000048{
Guido van Rossum2b654441996-07-30 16:56:16 +000049 XxoObject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000050 self = PyObject_New(XxoObject, &Xxo_Type);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000051 if (self == NULL)
52 return NULL;
53 self->x_attr = NULL;
54 return self;
55}
56
57/* Xxo methods */
58
59static void
Guido van Rossum2b654441996-07-30 16:56:16 +000060Xxo_dealloc(self)
61 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000062{
Guido van Rossum2b654441996-07-30 16:56:16 +000063 Py_XDECREF(self->x_attr);
Guido van Rossumb18618d2000-05-03 23:44:39 +000064 PyObject_Del(self);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000065}
66
Guido van Rossum2b654441996-07-30 16:56:16 +000067static PyObject *
68Xxo_demo(self, args)
69 XxoObject *self;
70 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000071{
Guido van Rossum43713e52000-02-29 13:59:29 +000072 if (!PyArg_ParseTuple(args, ":demo"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +000073 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +000074 Py_INCREF(Py_None);
75 return Py_None;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000076}
77
Guido van Rossum2b654441996-07-30 16:56:16 +000078static PyMethodDef Xxo_methods[] = {
79 {"demo", (PyCFunction)Xxo_demo, 1},
Guido van Rossum14ed0b21994-09-29 09:50:09 +000080 {NULL, NULL} /* sentinel */
81};
82
Guido van Rossum2b654441996-07-30 16:56:16 +000083static PyObject *
84Xxo_getattr(self, name)
85 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +000086 char *name;
87{
88 if (self->x_attr != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000089 PyObject *v = PyDict_GetItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000090 if (v != NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +000091 Py_INCREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000092 return v;
93 }
94 }
Guido van Rossum2b654441996-07-30 16:56:16 +000095 return Py_FindMethod(Xxo_methods, (PyObject *)self, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +000096}
97
98static int
Guido van Rossum2b654441996-07-30 16:56:16 +000099Xxo_setattr(self, name, v)
100 XxoObject *self;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000101 char *name;
Guido van Rossum2b654441996-07-30 16:56:16 +0000102 PyObject *v;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000103{
104 if (self->x_attr == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +0000105 self->x_attr = PyDict_New();
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000106 if (self->x_attr == NULL)
107 return -1;
108 }
109 if (v == NULL) {
Guido van Rossum2b654441996-07-30 16:56:16 +0000110 int rv = PyDict_DelItemString(self->x_attr, name);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000111 if (rv < 0)
Guido van Rossum2b654441996-07-30 16:56:16 +0000112 PyErr_SetString(PyExc_AttributeError,
113 "delete non-existing Xxo attribute");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000114 return rv;
115 }
116 else
Guido van Rossum2b654441996-07-30 16:56:16 +0000117 return PyDict_SetItemString(self->x_attr, name, v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000118}
119
Fred Drake67248351999-02-16 22:15:42 +0000120statichere PyTypeObject Xxo_Type = {
121 /* The ob_type field must be initialized in the module init function
122 * to be portable to Windows without using C++. */
123 PyObject_HEAD_INIT(NULL)
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000124 0, /*ob_size*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000125 "Xxo", /*tp_name*/
126 sizeof(XxoObject), /*tp_basicsize*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000127 0, /*tp_itemsize*/
128 /* methods */
Guido van Rossum2b654441996-07-30 16:56:16 +0000129 (destructor)Xxo_dealloc, /*tp_dealloc*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000130 0, /*tp_print*/
Guido van Rossum2b654441996-07-30 16:56:16 +0000131 (getattrfunc)Xxo_getattr, /*tp_getattr*/
132 (setattrfunc)Xxo_setattr, /*tp_setattr*/
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000133 0, /*tp_compare*/
134 0, /*tp_repr*/
135 0, /*tp_as_number*/
136 0, /*tp_as_sequence*/
137 0, /*tp_as_mapping*/
138 0, /*tp_hash*/
139};
140/* --------------------------------------------------------------------- */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000141
142/* Function of two integers returning integer */
143
Guido van Rossum2b654441996-07-30 16:56:16 +0000144static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145xx_foo(self, args)
Guido van Rossum2b654441996-07-30 16:56:16 +0000146 PyObject *self; /* Not used */
147 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 *
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000161xx_new(self, args)
Guido van Rossum2b654441996-07-30 16:56:16 +0000162 PyObject *self; /* Not used */
163 PyObject *args;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164{
Guido van Rossum2b654441996-07-30 16:56:16 +0000165 XxoObject *rv;
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000166
Guido van Rossum43713e52000-02-29 13:59:29 +0000167 if (!PyArg_ParseTuple(args, ":new"))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000169 rv = newXxoObject(args);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000170 if ( rv == NULL )
171 return NULL;
Guido van Rossum2b654441996-07-30 16:56:16 +0000172 return (PyObject *)rv;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173}
174
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000175/* Example with subtle bug from extensions manual ("Thin Ice"). */
176
177static PyObject *
178xx_bug(self, args)
179 PyObject *self;
180 PyObject *args;
181{
182 PyObject *list, *item;
183
Guido van Rossum43713e52000-02-29 13:59:29 +0000184 if (!PyArg_ParseTuple(args, "O:bug", &list))
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000185 return NULL;
186
187 item = PyList_GetItem(list, 0);
188 /* Py_INCREF(item); */
189 PyList_SetItem(list, 1, PyInt_FromLong(0L));
190 PyObject_Print(item, stdout, 0);
191 printf("\n");
192 /* Py_DECREF(item); */
193
194 Py_INCREF(Py_None);
195 return Py_None;
196}
197
Guido van Rossumc525e431997-12-09 20:37:25 +0000198/* Test bad format character */
199
200static PyObject *
201xx_roj(self, args)
202 PyObject *self; /* Not used */
203 PyObject *args;
204{
205 PyObject *a;
206 long b;
Guido van Rossum43713e52000-02-29 13:59:29 +0000207 if (!PyArg_ParseTuple(args, "O#:roj", &a, &b))
Guido van Rossumc525e431997-12-09 20:37:25 +0000208 return NULL;
209 Py_INCREF(Py_None);
210 return Py_None;
211}
212
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213
214/* List of functions defined in the module */
215
Guido van Rossum2b654441996-07-30 16:56:16 +0000216static PyMethodDef xx_methods[] = {
Guido van Rossumc525e431997-12-09 20:37:25 +0000217 {"roj", xx_roj, 1},
Guido van Rossum2b654441996-07-30 16:56:16 +0000218 {"foo", xx_foo, 1},
219 {"new", xx_new, 1},
Guido van Rossumfbcfd521996-12-13 02:57:25 +0000220 {"bug", xx_bug, 1},
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221 {NULL, NULL} /* sentinel */
222};
223
224
225/* Initialization function for the module (*must* be called initxx) */
226
Guido van Rossum3886bb61998-12-04 18:50:17 +0000227DL_EXPORT(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000228initxx()
229{
Guido van Rossum2b654441996-07-30 16:56:16 +0000230 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231
Fred Drake67248351999-02-16 22:15:42 +0000232 /* Initialize the type of the new type object here; doing it here
233 * is required for portability to Windows without requiring C++. */
234 Xxo_Type.ob_type = &PyType_Type;
235
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000236 /* Create the module and add the functions */
Guido van Rossum2b654441996-07-30 16:56:16 +0000237 m = Py_InitModule("xx", xx_methods);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000238
239 /* Add some symbolic constants to the module */
Guido van Rossum2b654441996-07-30 16:56:16 +0000240 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000241 ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
Guido van Rossum2b654441996-07-30 16:56:16 +0000242 PyDict_SetItemString(d, "error", ErrorObject);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243}