blob: 06ae6638c8a0dcae943e40d4b6e5c2b401c0ef5f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017/* Functions used by cgen output */
18
Guido van Rossum3837de01997-04-29 15:43:55 +000019#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020#include "cgensupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021
22
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023/* Functions to extract arguments.
24 These needs to know the total number of arguments supplied,
25 since the argument list is a tuple only of there is more than
26 one argument. */
27
28int
Guido van Rossum3837de01997-04-29 15:43:55 +000029PyArg_GetObject(args, nargs, i, p_arg)
30 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031 int nargs, i;
Guido van Rossum3837de01997-04-29 15:43:55 +000032 PyObject **p_arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033{
34 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000035 if (args == NULL || !PyTuple_Check(args) ||
36 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000038 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039 }
40 else {
Guido van Rossum3837de01997-04-29 15:43:55 +000041 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042 }
43 }
44 if (args == NULL) {
Guido van Rossum3837de01997-04-29 15:43:55 +000045 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 }
47 *p_arg = args;
48 return 1;
49}
50
51int
Guido van Rossum3837de01997-04-29 15:43:55 +000052PyArg_GetLong(args, nargs, i, p_arg)
53 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054 int nargs, i;
55 long *p_arg;
56{
57 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000058 if (args == NULL || !PyTuple_Check(args) ||
59 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000061 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 }
Guido van Rossum3837de01997-04-29 15:43:55 +000063 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 }
Guido van Rossum3837de01997-04-29 15:43:55 +000065 if (args == NULL || !PyInt_Check(args)) {
66 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 }
Guido van Rossum3837de01997-04-29 15:43:55 +000068 *p_arg = PyInt_AsLong(args);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 return 1;
70}
71
72int
Guido van Rossum3837de01997-04-29 15:43:55 +000073PyArg_GetShort(args, nargs, i, p_arg)
74 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 int nargs, i;
76 short *p_arg;
77{
78 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +000079 if (!PyArg_GetLong(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +000081 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 return 1;
83}
84
85static int
86extractdouble(v, p_arg)
Guido van Rossum3837de01997-04-29 15:43:55 +000087 register PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 double *p_arg;
89{
90 if (v == NULL) {
91 /* Fall through to error return at end of function */
92 }
Guido van Rossum3837de01997-04-29 15:43:55 +000093 else if (PyFloat_Check(v)) {
94 *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095 return 1;
96 }
Guido van Rossum3837de01997-04-29 15:43:55 +000097 else if (PyInt_Check(v)) {
98 *p_arg = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 return 1;
100 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000101 else if (PyLong_Check(v)) {
102 *p_arg = PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +0000103 return 1;
104 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000105 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
108static int
109extractfloat(v, p_arg)
Guido van Rossum3837de01997-04-29 15:43:55 +0000110 register PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 float *p_arg;
112{
113 if (v == NULL) {
114 /* Fall through to error return at end of function */
115 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000116 else if (PyFloat_Check(v)) {
117 *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 return 1;
119 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000120 else if (PyInt_Check(v)) {
121 *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 return 1;
123 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000124 else if (PyLong_Check(v)) {
125 *p_arg = (float) PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +0000126 return 1;
127 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000128 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129}
130
131int
Guido van Rossum3837de01997-04-29 15:43:55 +0000132PyArg_GetFloat(args, nargs, i, p_arg)
133 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 int nargs, i;
135 float *p_arg;
136{
Guido van Rossum3837de01997-04-29 15:43:55 +0000137 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138 float x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000139 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 return 0;
141 if (!extractfloat(v, &x))
142 return 0;
143 *p_arg = x;
144 return 1;
145}
146
147int
Guido van Rossum3837de01997-04-29 15:43:55 +0000148PyArg_GetString(args, nargs, i, p_arg)
149 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 int nargs, i;
151 string *p_arg;
152{
Guido van Rossum3837de01997-04-29 15:43:55 +0000153 PyObject *v;
154 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum7cdf5eb1992-04-06 12:34:45 +0000155 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000156 if (!PyString_Check(v)) {
157 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000159 *p_arg = PyString_AsString(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 return 1;
161}
162
163int
Guido van Rossum3837de01997-04-29 15:43:55 +0000164PyArg_GetChar(args, nargs, i, p_arg)
165 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 int nargs, i;
167 char *p_arg;
168{
169 string x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000170 if (!PyArg_GetString(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171 return 0;
172 if (x[0] == '\0' || x[1] != '\0') {
173 /* Not exactly one char */
Guido van Rossum3837de01997-04-29 15:43:55 +0000174 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 }
176 *p_arg = x[0];
177 return 1;
178}
179
180int
Guido van Rossum3837de01997-04-29 15:43:55 +0000181PyArg_GetLongArraySize(args, nargs, i, p_arg)
182 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183 int nargs, i;
184 long *p_arg;
185{
Guido van Rossum3837de01997-04-29 15:43:55 +0000186 PyObject *v;
187 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000189 if (PyTuple_Check(v)) {
190 *p_arg = PyTuple_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 return 1;
192 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000193 if (PyList_Check(v)) {
194 *p_arg = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 return 1;
196 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000197 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198}
199
200int
Guido van Rossum3837de01997-04-29 15:43:55 +0000201PyArg_GetShortArraySize(args, nargs, i, p_arg)
202 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 int nargs, i;
204 short *p_arg;
205{
206 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000207 if (!PyArg_GetLongArraySize(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000209 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 return 1;
211}
212
213/* XXX The following four are too similar. Should share more code. */
214
215int
Guido van Rossum3837de01997-04-29 15:43:55 +0000216PyArg_GetLongArray(args, nargs, i, n, p_arg)
217 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 int nargs, i;
219 int n;
220 long *p_arg; /* [n] */
221{
Guido van Rossum3837de01997-04-29 15:43:55 +0000222 PyObject *v, *w;
223 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000225 if (PyTuple_Check(v)) {
226 if (PyTuple_Size(v) != n) {
227 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 }
229 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000230 w = PyTuple_GetItem(v, i);
231 if (!PyInt_Check(w)) {
232 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000234 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 }
236 return 1;
237 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000238 else if (PyList_Check(v)) {
239 if (PyList_Size(v) != n) {
240 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 }
242 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000243 w = PyList_GetItem(v, i);
244 if (!PyInt_Check(w)) {
245 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000247 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 }
249 return 1;
250 }
251 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000252 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 }
254}
255
256int
Guido van Rossum3837de01997-04-29 15:43:55 +0000257PyArg_GetShortArray(args, nargs, i, n, p_arg)
258 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 int nargs, i;
260 int n;
261 short *p_arg; /* [n] */
262{
Guido van Rossum3837de01997-04-29 15:43:55 +0000263 PyObject *v, *w;
264 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000266 if (PyTuple_Check(v)) {
267 if (PyTuple_Size(v) != n) {
268 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269 }
270 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000271 w = PyTuple_GetItem(v, i);
272 if (!PyInt_Check(w)) {
273 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000275 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 }
277 return 1;
278 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000279 else if (PyList_Check(v)) {
280 if (PyList_Size(v) != n) {
281 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 }
283 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000284 w = PyList_GetItem(v, i);
285 if (!PyInt_Check(w)) {
286 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000288 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 }
290 return 1;
291 }
292 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000293 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 }
295}
296
297int
Guido van Rossum3837de01997-04-29 15:43:55 +0000298PyArg_GetDoubleArray(args, nargs, i, n, p_arg)
299 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 int nargs, i;
301 int n;
302 double *p_arg; /* [n] */
303{
Guido van Rossum3837de01997-04-29 15:43:55 +0000304 PyObject *v, *w;
305 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000307 if (PyTuple_Check(v)) {
308 if (PyTuple_Size(v) != n) {
309 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 }
311 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000312 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 if (!extractdouble(w, &p_arg[i]))
314 return 0;
315 }
316 return 1;
317 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000318 else if (PyList_Check(v)) {
319 if (PyList_Size(v) != n) {
320 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 }
322 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000323 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 if (!extractdouble(w, &p_arg[i]))
325 return 0;
326 }
327 return 1;
328 }
329 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000330 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 }
332}
333
334int
Guido van Rossum3837de01997-04-29 15:43:55 +0000335PyArg_GetFloatArray(args, nargs, i, n, p_arg)
336 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 int nargs, i;
338 int n;
339 float *p_arg; /* [n] */
340{
Guido van Rossum3837de01997-04-29 15:43:55 +0000341 PyObject *v, *w;
342 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000344 if (PyTuple_Check(v)) {
345 if (PyTuple_Size(v) != n) {
346 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 }
348 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000349 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 if (!extractfloat(w, &p_arg[i]))
351 return 0;
352 }
353 return 1;
354 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000355 else if (PyList_Check(v)) {
356 if (PyList_Size(v) != n) {
357 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 }
359 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000360 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 if (!extractfloat(w, &p_arg[i]))
362 return 0;
363 }
364 return 1;
365 }
366 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000367 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 }
369}