blob: 71b55865e8381fa0a8c95ca928c153cf556fcef0 [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
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000023PyArg_GetObject(register PyObject *args, int nargs, int i, PyObject **p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024{
25 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000026 if (args == NULL || !PyTuple_Check(args) ||
27 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000029 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 }
31 else {
Guido van Rossum3837de01997-04-29 15:43:55 +000032 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 }
34 }
35 if (args == NULL) {
Guido van Rossum3837de01997-04-29 15:43:55 +000036 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037 }
38 *p_arg = args;
39 return 1;
40}
41
42int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000043PyArg_GetLong(register PyObject *args, int nargs, int i, long *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044{
45 if (nargs != 1) {
Guido van Rossum3837de01997-04-29 15:43:55 +000046 if (args == NULL || !PyTuple_Check(args) ||
47 nargs != PyTuple_Size(args) ||
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 i < 0 || i >= nargs) {
Guido van Rossum3837de01997-04-29 15:43:55 +000049 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 }
Guido van Rossum3837de01997-04-29 15:43:55 +000051 args = PyTuple_GetItem(args, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 }
Guido van Rossum3837de01997-04-29 15:43:55 +000053 if (args == NULL || !PyInt_Check(args)) {
54 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 }
Guido van Rossum3837de01997-04-29 15:43:55 +000056 *p_arg = PyInt_AsLong(args);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 return 1;
58}
59
60int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000061PyArg_GetShort(register PyObject *args, int nargs, int i, short *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062{
63 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +000064 if (!PyArg_GetLong(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +000066 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 return 1;
68}
69
70static int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000071extractdouble(register PyObject *v, double *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072{
73 if (v == NULL) {
74 /* Fall through to error return at end of function */
75 }
Guido van Rossum3837de01997-04-29 15:43:55 +000076 else if (PyFloat_Check(v)) {
77 *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 return 1;
79 }
Guido van Rossum3837de01997-04-29 15:43:55 +000080 else if (PyInt_Check(v)) {
81 *p_arg = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 return 1;
83 }
Guido van Rossum3837de01997-04-29 15:43:55 +000084 else if (PyLong_Check(v)) {
85 *p_arg = PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +000086 return 1;
87 }
Guido van Rossum3837de01997-04-29 15:43:55 +000088 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089}
90
91static int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000092extractfloat(register PyObject *v, float *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
94 if (v == NULL) {
95 /* Fall through to error return at end of function */
96 }
Guido van Rossum3837de01997-04-29 15:43:55 +000097 else if (PyFloat_Check(v)) {
98 *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 return 1;
100 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000101 else if (PyInt_Check(v)) {
102 *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return 1;
104 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000105 else if (PyLong_Check(v)) {
106 *p_arg = (float) PyLong_AsDouble(v);
Guido van Rossum76a00af1991-07-27 21:34:00 +0000107 return 1;
108 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000109 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110}
111
112int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000113PyArg_GetFloat(register PyObject *args, int nargs, int i, float *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossum3837de01997-04-29 15:43:55 +0000115 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 float x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000117 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 return 0;
119 if (!extractfloat(v, &x))
120 return 0;
121 *p_arg = x;
122 return 1;
123}
124
125int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000126PyArg_GetString(PyObject *args, int nargs, int i, string *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127{
Guido van Rossum3837de01997-04-29 15:43:55 +0000128 PyObject *v;
129 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum7cdf5eb1992-04-06 12:34:45 +0000130 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000131 if (!PyString_Check(v)) {
132 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000134 *p_arg = PyString_AsString(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 return 1;
136}
137
138int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000139PyArg_GetChar(PyObject *args, int nargs, int i, char *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140{
141 string x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000142 if (!PyArg_GetString(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143 return 0;
144 if (x[0] == '\0' || x[1] != '\0') {
145 /* Not exactly one char */
Guido van Rossum3837de01997-04-29 15:43:55 +0000146 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147 }
148 *p_arg = x[0];
149 return 1;
150}
151
152int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000153PyArg_GetLongArraySize(PyObject *args, int nargs, int i, long *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154{
Guido van Rossum3837de01997-04-29 15:43:55 +0000155 PyObject *v;
156 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000158 if (PyTuple_Check(v)) {
159 *p_arg = PyTuple_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 return 1;
161 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000162 if (PyList_Check(v)) {
163 *p_arg = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164 return 1;
165 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000166 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167}
168
169int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000170PyArg_GetShortArraySize(PyObject *args, int nargs, int i, short *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171{
172 long x;
Guido van Rossum3837de01997-04-29 15:43:55 +0000173 if (!PyArg_GetLongArraySize(args, nargs, i, &x))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 return 0;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000175 *p_arg = (short) x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176 return 1;
177}
178
179/* XXX The following four are too similar. Should share more code. */
180
181int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000182PyArg_GetLongArray(PyObject *args, int nargs, int i, int n, long *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183{
Guido van Rossum3837de01997-04-29 15:43:55 +0000184 PyObject *v, *w;
185 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000187 if (PyTuple_Check(v)) {
188 if (PyTuple_Size(v) != n) {
189 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190 }
191 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000192 w = PyTuple_GetItem(v, i);
193 if (!PyInt_Check(w)) {
194 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000196 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197 }
198 return 1;
199 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000200 else if (PyList_Check(v)) {
201 if (PyList_Size(v) != n) {
202 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 }
204 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000205 w = PyList_GetItem(v, i);
206 if (!PyInt_Check(w)) {
207 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000209 p_arg[i] = PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 }
211 return 1;
212 }
213 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000214 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 }
216}
217
218int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000219PyArg_GetShortArray(PyObject *args, int nargs, int i, int n, short *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Guido van Rossum3837de01997-04-29 15:43:55 +0000221 PyObject *v, *w;
222 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000224 if (PyTuple_Check(v)) {
225 if (PyTuple_Size(v) != n) {
226 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 }
228 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000229 w = PyTuple_GetItem(v, i);
230 if (!PyInt_Check(w)) {
231 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000233 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 }
235 return 1;
236 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000237 else if (PyList_Check(v)) {
238 if (PyList_Size(v) != n) {
239 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 }
241 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000242 w = PyList_GetItem(v, i);
243 if (!PyInt_Check(w)) {
244 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000246 p_arg[i] = (short) PyInt_AsLong(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 }
248 return 1;
249 }
250 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000251 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252 }
253}
254
255int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000256PyArg_GetDoubleArray(PyObject *args, int nargs, int i, int n, double *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
Guido van Rossum3837de01997-04-29 15:43:55 +0000258 PyObject *v, *w;
259 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000261 if (PyTuple_Check(v)) {
262 if (PyTuple_Size(v) != n) {
263 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 }
265 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000266 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267 if (!extractdouble(w, &p_arg[i]))
268 return 0;
269 }
270 return 1;
271 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000272 else if (PyList_Check(v)) {
273 if (PyList_Size(v) != n) {
274 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 }
276 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000277 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278 if (!extractdouble(w, &p_arg[i]))
279 return 0;
280 }
281 return 1;
282 }
283 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000284 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 }
286}
287
288int
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000289PyArg_GetFloatArray(PyObject *args, int nargs, int i, int n, float *p_arg)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290{
Guido van Rossum3837de01997-04-29 15:43:55 +0000291 PyObject *v, *w;
292 if (!PyArg_GetObject(args, nargs, i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 return 0;
Guido van Rossum3837de01997-04-29 15:43:55 +0000294 if (PyTuple_Check(v)) {
295 if (PyTuple_Size(v) != n) {
296 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 }
298 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000299 w = PyTuple_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 if (!extractfloat(w, &p_arg[i]))
301 return 0;
302 }
303 return 1;
304 }
Guido van Rossum3837de01997-04-29 15:43:55 +0000305 else if (PyList_Check(v)) {
306 if (PyList_Size(v) != n) {
307 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 }
309 for (i = 0; i < n; i++) {
Guido van Rossum3837de01997-04-29 15:43:55 +0000310 w = PyList_GetItem(v, i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 if (!extractfloat(w, &p_arg[i]))
312 return 0;
313 }
314 return 1;
315 }
316 else {
Guido van Rossum3837de01997-04-29 15:43:55 +0000317 return PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 }
319}