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.
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 */
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
23 PyArg_GetObject(register PyObject
*args
, int nargs
, int i
, PyObject
**p_arg
)
26 if (args
== NULL
|| !PyTuple_Check(args
) ||
27 nargs
!= PyTuple_Size(args
) ||
28 i
< 0 || i
>= nargs
) {
29 return PyErr_BadArgument();
32 args
= PyTuple_GetItem(args
, i
);
36 return PyErr_BadArgument();
43 PyArg_GetLong(register PyObject
*args
, int nargs
, int i
, long *p_arg
)
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
);
61 PyArg_GetShort(register PyObject
*args
, int nargs
, int i
, short *p_arg
)
64 if (!PyArg_GetLong(args
, nargs
, i
, &x
))
71 extractdouble(register PyObject
*v
, double *p_arg
)
74 /* Fall through to error return at end of function */
76 else if (PyFloat_Check(v
)) {
77 *p_arg
= PyFloat_AS_DOUBLE((PyFloatObject
*)v
);
80 else if (PyInt_Check(v
)) {
81 *p_arg
= PyInt_AS_LONG((PyIntObject
*)v
);
84 else if (PyLong_Check(v
)) {
85 *p_arg
= PyLong_AsDouble(v
);
88 return PyErr_BadArgument();
92 extractfloat(register PyObject
*v
, float *p_arg
)
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
);
101 else if (PyInt_Check(v
)) {
102 *p_arg
= (float) PyInt_AS_LONG((PyIntObject
*)v
);
105 else if (PyLong_Check(v
)) {
106 *p_arg
= (float) PyLong_AsDouble(v
);
109 return PyErr_BadArgument();
113 PyArg_GetFloat(register PyObject
*args
, int nargs
, int i
, float *p_arg
)
117 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
119 if (!extractfloat(v
, &x
))
126 PyArg_GetString(PyObject
*args
, int nargs
, int i
, string
*p_arg
)
129 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
131 if (!PyString_Check(v
)) {
132 return PyErr_BadArgument();
134 *p_arg
= PyString_AsString(v
);
139 PyArg_GetChar(PyObject
*args
, int nargs
, int i
, char *p_arg
)
142 if (!PyArg_GetString(args
, nargs
, i
, &x
))
144 if (x
[0] == '\0' || x
[1] != '\0') {
145 /* Not exactly one char */
146 return PyErr_BadArgument();
153 PyArg_GetLongArraySize(PyObject
*args
, int nargs
, int i
, long *p_arg
)
156 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
158 if (PyTuple_Check(v
)) {
159 *p_arg
= PyTuple_Size(v
);
162 if (PyList_Check(v
)) {
163 *p_arg
= PyList_Size(v
);
166 return PyErr_BadArgument();
170 PyArg_GetShortArraySize(PyObject
*args
, int nargs
, int i
, short *p_arg
)
173 if (!PyArg_GetLongArraySize(args
, nargs
, i
, &x
))
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
)
185 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
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
);
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
);
214 return PyErr_BadArgument();
219 PyArg_GetShortArray(PyObject
*args
, int nargs
, int i
, int n
, short *p_arg
)
222 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
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
);
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
);
251 return PyErr_BadArgument();
256 PyArg_GetDoubleArray(PyObject
*args
, int nargs
, int i
, int n
, double *p_arg
)
259 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
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
]))
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
]))
284 return PyErr_BadArgument();
289 PyArg_GetFloatArray(PyObject
*args
, int nargs
, int i
, int n
, float *p_arg
)
292 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
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
]))
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
]))
317 return PyErr_BadArgument();