Bump version to 0.9.1.
[python/dscho.git] / Modules / cgensupport.c
blob71b55865e8381fa0a8c95ca928c153cf556fcef0
1 /***********************************************************
2 Copyright (c) 2000, BeOpen.com.
3 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4 Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5 All rights reserved.
7 See the file "Misc/COPYRIGHT" for information on usage and
8 redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
9 ******************************************************************/
11 /* Functions used by cgen output */
13 #include "Python.h"
14 #include "cgensupport.h"
17 /* Functions to extract arguments.
18 These needs to know the total number of arguments supplied,
19 since the argument list is a tuple only of there is more than
20 one argument. */
22 int
23 PyArg_GetObject(register PyObject *args, int nargs, int i, PyObject **p_arg)
25 if (nargs != 1) {
26 if (args == NULL || !PyTuple_Check(args) ||
27 nargs != PyTuple_Size(args) ||
28 i < 0 || i >= nargs) {
29 return PyErr_BadArgument();
31 else {
32 args = PyTuple_GetItem(args, i);
35 if (args == NULL) {
36 return PyErr_BadArgument();
38 *p_arg = args;
39 return 1;
42 int
43 PyArg_GetLong(register PyObject *args, int nargs, int i, long *p_arg)
45 if (nargs != 1) {
46 if (args == NULL || !PyTuple_Check(args) ||
47 nargs != PyTuple_Size(args) ||
48 i < 0 || i >= nargs) {
49 return PyErr_BadArgument();
51 args = PyTuple_GetItem(args, i);
53 if (args == NULL || !PyInt_Check(args)) {
54 return PyErr_BadArgument();
56 *p_arg = PyInt_AsLong(args);
57 return 1;
60 int
61 PyArg_GetShort(register PyObject *args, int nargs, int i, short *p_arg)
63 long x;
64 if (!PyArg_GetLong(args, nargs, i, &x))
65 return 0;
66 *p_arg = (short) x;
67 return 1;
70 static int
71 extractdouble(register PyObject *v, double *p_arg)
73 if (v == NULL) {
74 /* Fall through to error return at end of function */
76 else if (PyFloat_Check(v)) {
77 *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
78 return 1;
80 else if (PyInt_Check(v)) {
81 *p_arg = PyInt_AS_LONG((PyIntObject *)v);
82 return 1;
84 else if (PyLong_Check(v)) {
85 *p_arg = PyLong_AsDouble(v);
86 return 1;
88 return PyErr_BadArgument();
91 static int
92 extractfloat(register PyObject *v, float *p_arg)
94 if (v == NULL) {
95 /* Fall through to error return at end of function */
97 else if (PyFloat_Check(v)) {
98 *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
99 return 1;
101 else if (PyInt_Check(v)) {
102 *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
103 return 1;
105 else if (PyLong_Check(v)) {
106 *p_arg = (float) PyLong_AsDouble(v);
107 return 1;
109 return PyErr_BadArgument();
113 PyArg_GetFloat(register PyObject *args, int nargs, int i, float *p_arg)
115 PyObject *v;
116 float x;
117 if (!PyArg_GetObject(args, nargs, i, &v))
118 return 0;
119 if (!extractfloat(v, &x))
120 return 0;
121 *p_arg = x;
122 return 1;
126 PyArg_GetString(PyObject *args, int nargs, int i, string *p_arg)
128 PyObject *v;
129 if (!PyArg_GetObject(args, nargs, i, &v))
130 return 0;
131 if (!PyString_Check(v)) {
132 return PyErr_BadArgument();
134 *p_arg = PyString_AsString(v);
135 return 1;
139 PyArg_GetChar(PyObject *args, int nargs, int i, char *p_arg)
141 string x;
142 if (!PyArg_GetString(args, nargs, i, &x))
143 return 0;
144 if (x[0] == '\0' || x[1] != '\0') {
145 /* Not exactly one char */
146 return PyErr_BadArgument();
148 *p_arg = x[0];
149 return 1;
153 PyArg_GetLongArraySize(PyObject *args, int nargs, int i, long *p_arg)
155 PyObject *v;
156 if (!PyArg_GetObject(args, nargs, i, &v))
157 return 0;
158 if (PyTuple_Check(v)) {
159 *p_arg = PyTuple_Size(v);
160 return 1;
162 if (PyList_Check(v)) {
163 *p_arg = PyList_Size(v);
164 return 1;
166 return PyErr_BadArgument();
170 PyArg_GetShortArraySize(PyObject *args, int nargs, int i, short *p_arg)
172 long x;
173 if (!PyArg_GetLongArraySize(args, nargs, i, &x))
174 return 0;
175 *p_arg = (short) x;
176 return 1;
179 /* XXX The following four are too similar. Should share more code. */
182 PyArg_GetLongArray(PyObject *args, int nargs, int i, int n, long *p_arg)
184 PyObject *v, *w;
185 if (!PyArg_GetObject(args, nargs, i, &v))
186 return 0;
187 if (PyTuple_Check(v)) {
188 if (PyTuple_Size(v) != n) {
189 return PyErr_BadArgument();
191 for (i = 0; i < n; i++) {
192 w = PyTuple_GetItem(v, i);
193 if (!PyInt_Check(w)) {
194 return PyErr_BadArgument();
196 p_arg[i] = PyInt_AsLong(w);
198 return 1;
200 else if (PyList_Check(v)) {
201 if (PyList_Size(v) != n) {
202 return PyErr_BadArgument();
204 for (i = 0; i < n; i++) {
205 w = PyList_GetItem(v, i);
206 if (!PyInt_Check(w)) {
207 return PyErr_BadArgument();
209 p_arg[i] = PyInt_AsLong(w);
211 return 1;
213 else {
214 return PyErr_BadArgument();
219 PyArg_GetShortArray(PyObject *args, int nargs, int i, int n, short *p_arg)
221 PyObject *v, *w;
222 if (!PyArg_GetObject(args, nargs, i, &v))
223 return 0;
224 if (PyTuple_Check(v)) {
225 if (PyTuple_Size(v) != n) {
226 return PyErr_BadArgument();
228 for (i = 0; i < n; i++) {
229 w = PyTuple_GetItem(v, i);
230 if (!PyInt_Check(w)) {
231 return PyErr_BadArgument();
233 p_arg[i] = (short) PyInt_AsLong(w);
235 return 1;
237 else if (PyList_Check(v)) {
238 if (PyList_Size(v) != n) {
239 return PyErr_BadArgument();
241 for (i = 0; i < n; i++) {
242 w = PyList_GetItem(v, i);
243 if (!PyInt_Check(w)) {
244 return PyErr_BadArgument();
246 p_arg[i] = (short) PyInt_AsLong(w);
248 return 1;
250 else {
251 return PyErr_BadArgument();
256 PyArg_GetDoubleArray(PyObject *args, int nargs, int i, int n, double *p_arg)
258 PyObject *v, *w;
259 if (!PyArg_GetObject(args, nargs, i, &v))
260 return 0;
261 if (PyTuple_Check(v)) {
262 if (PyTuple_Size(v) != n) {
263 return PyErr_BadArgument();
265 for (i = 0; i < n; i++) {
266 w = PyTuple_GetItem(v, i);
267 if (!extractdouble(w, &p_arg[i]))
268 return 0;
270 return 1;
272 else if (PyList_Check(v)) {
273 if (PyList_Size(v) != n) {
274 return PyErr_BadArgument();
276 for (i = 0; i < n; i++) {
277 w = PyList_GetItem(v, i);
278 if (!extractdouble(w, &p_arg[i]))
279 return 0;
281 return 1;
283 else {
284 return PyErr_BadArgument();
289 PyArg_GetFloatArray(PyObject *args, int nargs, int i, int n, float *p_arg)
291 PyObject *v, *w;
292 if (!PyArg_GetObject(args, nargs, i, &v))
293 return 0;
294 if (PyTuple_Check(v)) {
295 if (PyTuple_Size(v) != n) {
296 return PyErr_BadArgument();
298 for (i = 0; i < n; i++) {
299 w = PyTuple_GetItem(v, i);
300 if (!extractfloat(w, &p_arg[i]))
301 return 0;
303 return 1;
305 else if (PyList_Check(v)) {
306 if (PyList_Size(v) != n) {
307 return PyErr_BadArgument();
309 for (i = 0; i < n; i++) {
310 w = PyList_GetItem(v, i);
311 if (!extractfloat(w, &p_arg[i]))
312 return 0;
314 return 1;
316 else {
317 return PyErr_BadArgument();