1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 /* Functions used by cgen output */
35 #include "cgensupport.h"
38 /* Functions to extract arguments.
39 These needs to know the total number of arguments supplied,
40 since the argument list is a tuple only of there is more than
44 PyArg_GetObject(args
, nargs
, i
, p_arg
)
45 register PyObject
*args
;
50 if (args
== NULL
|| !PyTuple_Check(args
) ||
51 nargs
!= PyTuple_Size(args
) ||
52 i
< 0 || i
>= nargs
) {
53 return PyErr_BadArgument();
56 args
= PyTuple_GetItem(args
, i
);
60 return PyErr_BadArgument();
67 PyArg_GetLong(args
, nargs
, i
, p_arg
)
68 register PyObject
*args
;
73 if (args
== NULL
|| !PyTuple_Check(args
) ||
74 nargs
!= PyTuple_Size(args
) ||
75 i
< 0 || i
>= nargs
) {
76 return PyErr_BadArgument();
78 args
= PyTuple_GetItem(args
, i
);
80 if (args
== NULL
|| !PyInt_Check(args
)) {
81 return PyErr_BadArgument();
83 *p_arg
= PyInt_AsLong(args
);
88 PyArg_GetShort(args
, nargs
, i
, p_arg
)
89 register PyObject
*args
;
94 if (!PyArg_GetLong(args
, nargs
, i
, &x
))
101 extractdouble(v
, p_arg
)
102 register PyObject
*v
;
106 /* Fall through to error return at end of function */
108 else if (PyFloat_Check(v
)) {
109 *p_arg
= PyFloat_AS_DOUBLE((PyFloatObject
*)v
);
112 else if (PyInt_Check(v
)) {
113 *p_arg
= PyInt_AS_LONG((PyIntObject
*)v
);
116 else if (PyLong_Check(v
)) {
117 *p_arg
= PyLong_AsDouble(v
);
120 return PyErr_BadArgument();
124 extractfloat(v
, p_arg
)
125 register PyObject
*v
;
129 /* Fall through to error return at end of function */
131 else if (PyFloat_Check(v
)) {
132 *p_arg
= (float) PyFloat_AS_DOUBLE((PyFloatObject
*)v
);
135 else if (PyInt_Check(v
)) {
136 *p_arg
= (float) PyInt_AS_LONG((PyIntObject
*)v
);
139 else if (PyLong_Check(v
)) {
140 *p_arg
= (float) PyLong_AsDouble(v
);
143 return PyErr_BadArgument();
147 PyArg_GetFloat(args
, nargs
, i
, p_arg
)
148 register PyObject
*args
;
154 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
156 if (!extractfloat(v
, &x
))
163 PyArg_GetString(args
, nargs
, i
, p_arg
)
169 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
171 if (!PyString_Check(v
)) {
172 return PyErr_BadArgument();
174 *p_arg
= PyString_AsString(v
);
179 PyArg_GetChar(args
, nargs
, i
, p_arg
)
185 if (!PyArg_GetString(args
, nargs
, i
, &x
))
187 if (x
[0] == '\0' || x
[1] != '\0') {
188 /* Not exactly one char */
189 return PyErr_BadArgument();
196 PyArg_GetLongArraySize(args
, nargs
, i
, p_arg
)
202 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
204 if (PyTuple_Check(v
)) {
205 *p_arg
= PyTuple_Size(v
);
208 if (PyList_Check(v
)) {
209 *p_arg
= PyList_Size(v
);
212 return PyErr_BadArgument();
216 PyArg_GetShortArraySize(args
, nargs
, i
, p_arg
)
222 if (!PyArg_GetLongArraySize(args
, nargs
, i
, &x
))
228 /* XXX The following four are too similar. Should share more code. */
231 PyArg_GetLongArray(args
, nargs
, i
, n
, p_arg
)
235 long *p_arg
; /* [n] */
238 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
240 if (PyTuple_Check(v
)) {
241 if (PyTuple_Size(v
) != n
) {
242 return PyErr_BadArgument();
244 for (i
= 0; i
< n
; i
++) {
245 w
= PyTuple_GetItem(v
, i
);
246 if (!PyInt_Check(w
)) {
247 return PyErr_BadArgument();
249 p_arg
[i
] = PyInt_AsLong(w
);
253 else if (PyList_Check(v
)) {
254 if (PyList_Size(v
) != n
) {
255 return PyErr_BadArgument();
257 for (i
= 0; i
< n
; i
++) {
258 w
= PyList_GetItem(v
, i
);
259 if (!PyInt_Check(w
)) {
260 return PyErr_BadArgument();
262 p_arg
[i
] = PyInt_AsLong(w
);
267 return PyErr_BadArgument();
272 PyArg_GetShortArray(args
, nargs
, i
, n
, p_arg
)
276 short *p_arg
; /* [n] */
279 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
281 if (PyTuple_Check(v
)) {
282 if (PyTuple_Size(v
) != n
) {
283 return PyErr_BadArgument();
285 for (i
= 0; i
< n
; i
++) {
286 w
= PyTuple_GetItem(v
, i
);
287 if (!PyInt_Check(w
)) {
288 return PyErr_BadArgument();
290 p_arg
[i
] = (short) PyInt_AsLong(w
);
294 else if (PyList_Check(v
)) {
295 if (PyList_Size(v
) != n
) {
296 return PyErr_BadArgument();
298 for (i
= 0; i
< n
; i
++) {
299 w
= PyList_GetItem(v
, i
);
300 if (!PyInt_Check(w
)) {
301 return PyErr_BadArgument();
303 p_arg
[i
] = (short) PyInt_AsLong(w
);
308 return PyErr_BadArgument();
313 PyArg_GetDoubleArray(args
, nargs
, i
, n
, p_arg
)
317 double *p_arg
; /* [n] */
320 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
322 if (PyTuple_Check(v
)) {
323 if (PyTuple_Size(v
) != n
) {
324 return PyErr_BadArgument();
326 for (i
= 0; i
< n
; i
++) {
327 w
= PyTuple_GetItem(v
, i
);
328 if (!extractdouble(w
, &p_arg
[i
]))
333 else if (PyList_Check(v
)) {
334 if (PyList_Size(v
) != n
) {
335 return PyErr_BadArgument();
337 for (i
= 0; i
< n
; i
++) {
338 w
= PyList_GetItem(v
, i
);
339 if (!extractdouble(w
, &p_arg
[i
]))
345 return PyErr_BadArgument();
350 PyArg_GetFloatArray(args
, nargs
, i
, n
, p_arg
)
354 float *p_arg
; /* [n] */
357 if (!PyArg_GetObject(args
, nargs
, i
, &v
))
359 if (PyTuple_Check(v
)) {
360 if (PyTuple_Size(v
) != n
) {
361 return PyErr_BadArgument();
363 for (i
= 0; i
< n
; i
++) {
364 w
= PyTuple_GetItem(v
, i
);
365 if (!extractfloat(w
, &p_arg
[i
]))
370 else if (PyList_Check(v
)) {
371 if (PyList_Size(v
) != n
) {
372 return PyErr_BadArgument();
374 for (i
= 0; i
< n
; i
++) {
375 w
= PyList_GetItem(v
, i
);
376 if (!extractfloat(w
, &p_arg
[i
]))
382 return PyErr_BadArgument();