blob: 23fb2a983bf4ab28e3d1abe21fc3232b0b769322 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Functions used by cgen output */
12
Guido van Rossum3837de01997-04-29 15:43:55 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "cgensupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015
16
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017/* 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. */
21
22int
Guido van Rossum3837de01997-04-29 15:43:55 +000023PyArg_GetObject(args, nargs, i, p_arg)
24 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025 int nargs, i;
Guido van Rossum3837de01997-04-29 15:43:55 +000026 PyObject **p_arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027{
28 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000029 if (args == NULL || !PyTuple_Check(args) ||
30 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000032 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 }
34 else {
Guido van Rossum3837de01997-04-29 15:43:55 +000035 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 }
37 }
38 if (args == NULL) {
Guido van Rossum3837de01997-04-29 15:43:55 +000039 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040 }
41 *p_arg = args;
42 return 1;
43}
44
45int
Guido van Rossum3837de01997-04-29 15:43:55 +000046PyArg_GetLong(args, nargs, i, p_arg)
47 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 int nargs, i;
49 long *p_arg;
50{
51 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000052 if (args == NULL || !PyTuple_Check(args) ||
53 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000055 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 }
Guido van Rossum3837de01997-04-29 15:43:55 +000057 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 }
Guido van Rossum3837de01997-04-29 15:43:55 +000059 if (args == NULL || !PyInt_Check(args)) {
60 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 }
Guido van Rossum3837de01997-04-29 15:43:55 +000062 *p_arg = PyInt_AsLong(args);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 return 1;
64}
65
66int
Guido van Rossum3837de01997-04-29 15:43:55 +000067PyArg_GetShort(args, nargs, i, p_arg)
68 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 int nargs, i;
70 short *p_arg;
71{
72 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +000073 if (!PyArg_GetLong(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +000075 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 return 1;
77}
78
79static int
80extractdouble(v, p_arg)
Guido van Rossum3837de01997-04-29 15:43:55 +000081 register PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 double *p_arg;
83{
84 if (v == NULL) {
85 /* Fall through to error return at end of function */
86 }
Guido van Rossum3837de01997-04-29 15:43:55 +000087 else if (PyFloat_Check(v)) {
88 *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 return 1;
90 }
Guido van Rossum3837de01997-04-29 15:43:55 +000091 else if (PyInt_Check(v)) {
92 *p_arg = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 return 1;
94 }
Guido van Rossum3837de01997-04-29 15:43:55 +000095 else if (PyLong_Check(v)) {
96 *p_arg = PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +000097 return 1;
98 }
Guido van Rossum3837de01997-04-29 15:43:55 +000099 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
102static int
103extractfloat(v, p_arg)
Guido van Rossum3837de01997-04-29 15:43:55 +0000104 register PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105 float *p_arg;
106{
107 if (v == NULL) {
108 /* Fall through to error return at end of function */
109 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000110 else if (PyFloat_Check(v)) {
111 *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 return 1;
113 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000114 else if (PyInt_Check(v)) {
115 *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return 1;
117 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000118 else if (PyLong_Check(v)) {
119 *p_arg = (float) PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +0000120 return 1;
121 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000122 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
125int
Guido van Rossum3837de01997-04-29 15:43:55 +0000126PyArg_GetFloat(args, nargs, i, p_arg)
127 register PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 int nargs, i;
129 float *p_arg;
130{
Guido van Rossum3837de01997-04-29 15:43:55 +0000131 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 float x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000133 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 return 0;
135 if (!extractfloat(v, &x))
136 return 0;
137 *p_arg = x;
138 return 1;
139}
140
141int
Guido van Rossum3837de01997-04-29 15:43:55 +0000142PyArg_GetString(args, nargs, i, p_arg)
143 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 int nargs, i;
145 string *p_arg;
146{
Guido van Rossum3837de01997-04-29 15:43:55 +0000147 PyObject *v;
148 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum7cdf5eb1992-04-06 12:34:45 +0000149 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000150 if (!PyString_Check(v)) {
151 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000153 *p_arg = PyString_AsString(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154 return 1;
155}
156
157int
Guido van Rossum3837de01997-04-29 15:43:55 +0000158PyArg_GetChar(args, nargs, i, p_arg)
159 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 int nargs, i;
161 char *p_arg;
162{
163 string x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000164 if (!PyArg_GetString(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 return 0;
166 if (x[0] == '\0' || x[1] != '\0') {
167 /* Not exactly one char */
Guido van Rossum3837de01997-04-29 15:43:55 +0000168 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
170 *p_arg = x[0];
171 return 1;
172}
173
174int
Guido van Rossum3837de01997-04-29 15:43:55 +0000175PyArg_GetLongArraySize(args, nargs, i, p_arg)
176 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177 int nargs, i;
178 long *p_arg;
179{
Guido van Rossum3837de01997-04-29 15:43:55 +0000180 PyObject *v;
181 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000183 if (PyTuple_Check(v)) {
184 *p_arg = PyTuple_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185 return 1;
186 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000187 if (PyList_Check(v)) {
188 *p_arg = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189 return 1;
190 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000191 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192}
193
194int
Guido van Rossum3837de01997-04-29 15:43:55 +0000195PyArg_GetShortArraySize(args, nargs, i, p_arg)
196 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197 int nargs, i;
198 short *p_arg;
199{
200 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000201 if (!PyArg_GetLongArraySize(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000203 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 return 1;
205}
206
207/* XXX The following four are too similar. Should share more code. */
208
209int
Guido van Rossum3837de01997-04-29 15:43:55 +0000210PyArg_GetLongArray(args, nargs, i, n, p_arg)
211 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 int nargs, i;
213 int n;
214 long *p_arg; /* [n] */
215{
Guido van Rossum3837de01997-04-29 15:43:55 +0000216 PyObject *v, *w;
217 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000219 if (PyTuple_Check(v)) {
220 if (PyTuple_Size(v) != n) {
221 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 }
223 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000224 w = PyTuple_GetItem(v, i);
225 if (!PyInt_Check(w)) {
226 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000228 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 }
230 return 1;
231 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000232 else if (PyList_Check(v)) {
233 if (PyList_Size(v) != n) {
234 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 }
236 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000237 w = PyList_GetItem(v, i);
238 if (!PyInt_Check(w)) {
239 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000241 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 }
243 return 1;
244 }
245 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000246 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 }
248}
249
250int
Guido van Rossum3837de01997-04-29 15:43:55 +0000251PyArg_GetShortArray(args, nargs, i, n, p_arg)
252 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 int nargs, i;
254 int n;
255 short *p_arg; /* [n] */
256{
Guido van Rossum3837de01997-04-29 15:43:55 +0000257 PyObject *v, *w;
258 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000260 if (PyTuple_Check(v)) {
261 if (PyTuple_Size(v) != n) {
262 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263 }
264 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000265 w = PyTuple_GetItem(v, i);
266 if (!PyInt_Check(w)) {
267 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000269 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 }
271 return 1;
272 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000273 else if (PyList_Check(v)) {
274 if (PyList_Size(v) != n) {
275 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 }
277 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000278 w = PyList_GetItem(v, i);
279 if (!PyInt_Check(w)) {
280 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000282 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 }
284 return 1;
285 }
286 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000287 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 }
289}
290
291int
Guido van Rossum3837de01997-04-29 15:43:55 +0000292PyArg_GetDoubleArray(args, nargs, i, n, p_arg)
293 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 int nargs, i;
295 int n;
296 double *p_arg; /* [n] */
297{
Guido van Rossum3837de01997-04-29 15:43:55 +0000298 PyObject *v, *w;
299 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000301 if (PyTuple_Check(v)) {
302 if (PyTuple_Size(v) != n) {
303 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 }
305 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000306 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 if (!extractdouble(w, &p_arg[i]))
308 return 0;
309 }
310 return 1;
311 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000312 else if (PyList_Check(v)) {
313 if (PyList_Size(v) != n) {
314 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 }
316 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000317 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 if (!extractdouble(w, &p_arg[i]))
319 return 0;
320 }
321 return 1;
322 }
323 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000324 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 }
326}
327
328int
Guido van Rossum3837de01997-04-29 15:43:55 +0000329PyArg_GetFloatArray(args, nargs, i, n, p_arg)
330 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 int nargs, i;
332 int n;
333 float *p_arg; /* [n] */
334{
Guido van Rossum3837de01997-04-29 15:43:55 +0000335 PyObject *v, *w;
336 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000338 if (PyTuple_Check(v)) {
339 if (PyTuple_Size(v) != n) {
340 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 }
342 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000343 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344 if (!extractfloat(w, &p_arg[i]))
345 return 0;
346 }
347 return 1;
348 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000349 else if (PyList_Check(v)) {
350 if (PyList_Size(v) != n) {
351 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352 }
353 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000354 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 if (!extractfloat(w, &p_arg[i]))
356 return 0;
357 }
358 return 1;
359 }
360 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000361 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 }
363}