• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* Functions used by cgen output */
3 
4 #include "Python.h"
5 #include "cgensupport.h"
6 
7 
8 /* Functions to extract arguments.
9    These needs to know the total number of arguments supplied,
10    since the argument list is a tuple only of there is more than
11    one argument. */
12 
13 int
PyArg_GetObject(register PyObject * args,int nargs,int i,PyObject ** p_arg)14 PyArg_GetObject(register PyObject *args, int nargs, int i, PyObject **p_arg)
15 {
16     if (nargs != 1) {
17         if (args == NULL || !PyTuple_Check(args) ||
18                         nargs != PyTuple_Size(args) ||
19                         i < 0 || i >= nargs) {
20             return PyErr_BadArgument();
21         }
22         else {
23             args = PyTuple_GetItem(args, i);
24         }
25     }
26     if (args == NULL) {
27         return PyErr_BadArgument();
28     }
29     *p_arg = args;
30     return 1;
31 }
32 
33 int
PyArg_GetLong(register PyObject * args,int nargs,int i,long * p_arg)34 PyArg_GetLong(register PyObject *args, int nargs, int i, long *p_arg)
35 {
36     if (nargs != 1) {
37         if (args == NULL || !PyTuple_Check(args) ||
38                         nargs != PyTuple_Size(args) ||
39                         i < 0 || i >= nargs) {
40             return PyErr_BadArgument();
41         }
42         args = PyTuple_GetItem(args, i);
43     }
44     if (args == NULL || !PyInt_Check(args)) {
45         return PyErr_BadArgument();
46     }
47     *p_arg = PyInt_AsLong(args);
48     return 1;
49 }
50 
51 int
PyArg_GetShort(register PyObject * args,int nargs,int i,short * p_arg)52 PyArg_GetShort(register PyObject *args, int nargs, int i, short *p_arg)
53 {
54     long x;
55     if (!PyArg_GetLong(args, nargs, i, &x))
56         return 0;
57     *p_arg = (short) x;
58     return 1;
59 }
60 
61 static int
extractdouble(register PyObject * v,double * p_arg)62 extractdouble(register PyObject *v, double *p_arg)
63 {
64     if (v == NULL) {
65         /* Fall through to error return at end of function */
66     }
67     else if (PyFloat_Check(v)) {
68         *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
69         return 1;
70     }
71     else if (PyInt_Check(v)) {
72         *p_arg = PyInt_AS_LONG((PyIntObject *)v);
73         return 1;
74     }
75     else if (PyLong_Check(v)) {
76         *p_arg = PyLong_AsDouble(v);
77         return 1;
78     }
79     return PyErr_BadArgument();
80 }
81 
82 static int
extractfloat(register PyObject * v,float * p_arg)83 extractfloat(register PyObject *v, float *p_arg)
84 {
85     if (v == NULL) {
86         /* Fall through to error return at end of function */
87     }
88     else if (PyFloat_Check(v)) {
89         *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
90         return 1;
91     }
92     else if (PyInt_Check(v)) {
93         *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
94         return 1;
95     }
96     else if (PyLong_Check(v)) {
97         *p_arg = (float) PyLong_AsDouble(v);
98         return 1;
99     }
100     return PyErr_BadArgument();
101 }
102 
103 int
PyArg_GetFloat(register PyObject * args,int nargs,int i,float * p_arg)104 PyArg_GetFloat(register PyObject *args, int nargs, int i, float *p_arg)
105 {
106     PyObject *v;
107     float x;
108     if (!PyArg_GetObject(args, nargs, i, &v))
109         return 0;
110     if (!extractfloat(v, &x))
111         return 0;
112     *p_arg = x;
113     return 1;
114 }
115 
116 int
PyArg_GetString(PyObject * args,int nargs,int i,string * p_arg)117 PyArg_GetString(PyObject *args, int nargs, int i, string *p_arg)
118 {
119     PyObject *v;
120     if (!PyArg_GetObject(args, nargs, i, &v))
121         return 0;
122     if (!PyString_Check(v)) {
123         return PyErr_BadArgument();
124     }
125     *p_arg = PyString_AsString(v);
126     return 1;
127 }
128 
129 int
PyArg_GetChar(PyObject * args,int nargs,int i,char * p_arg)130 PyArg_GetChar(PyObject *args, int nargs, int i, char *p_arg)
131 {
132     string x;
133     if (!PyArg_GetString(args, nargs, i, &x))
134         return 0;
135     if (x[0] == '\0' || x[1] != '\0') {
136         /* Not exactly one char */
137         return PyErr_BadArgument();
138     }
139     *p_arg = x[0];
140     return 1;
141 }
142 
143 int
PyArg_GetLongArraySize(PyObject * args,int nargs,int i,long * p_arg)144 PyArg_GetLongArraySize(PyObject *args, int nargs, int i, long *p_arg)
145 {
146     PyObject *v;
147     if (!PyArg_GetObject(args, nargs, i, &v))
148         return 0;
149     if (PyTuple_Check(v)) {
150         *p_arg = PyTuple_Size(v);
151         return 1;
152     }
153     if (PyList_Check(v)) {
154         *p_arg = PyList_Size(v);
155         return 1;
156     }
157     return PyErr_BadArgument();
158 }
159 
160 int
PyArg_GetShortArraySize(PyObject * args,int nargs,int i,short * p_arg)161 PyArg_GetShortArraySize(PyObject *args, int nargs, int i, short *p_arg)
162 {
163     long x;
164     if (!PyArg_GetLongArraySize(args, nargs, i, &x))
165         return 0;
166     *p_arg = (short) x;
167     return 1;
168 }
169 
170 /* XXX The following four are too similar.  Should share more code. */
171 
172 int
PyArg_GetLongArray(PyObject * args,int nargs,int i,int n,long * p_arg)173 PyArg_GetLongArray(PyObject *args, int nargs, int i, int n, long *p_arg)
174 {
175     PyObject *v, *w;
176     if (!PyArg_GetObject(args, nargs, i, &v))
177         return 0;
178     if (PyTuple_Check(v)) {
179         if (PyTuple_Size(v) != n) {
180             return PyErr_BadArgument();
181         }
182         for (i = 0; i < n; i++) {
183             w = PyTuple_GetItem(v, i);
184             if (!PyInt_Check(w)) {
185                 return PyErr_BadArgument();
186             }
187             p_arg[i] = PyInt_AsLong(w);
188         }
189         return 1;
190     }
191     else if (PyList_Check(v)) {
192         if (PyList_Size(v) != n) {
193             return PyErr_BadArgument();
194         }
195         for (i = 0; i < n; i++) {
196             w = PyList_GetItem(v, i);
197             if (!PyInt_Check(w)) {
198                 return PyErr_BadArgument();
199             }
200             p_arg[i] = PyInt_AsLong(w);
201         }
202         return 1;
203     }
204     else {
205         return PyErr_BadArgument();
206     }
207 }
208 
209 int
PyArg_GetShortArray(PyObject * args,int nargs,int i,int n,short * p_arg)210 PyArg_GetShortArray(PyObject *args, int nargs, int i, int n, short *p_arg)
211 {
212     PyObject *v, *w;
213     if (!PyArg_GetObject(args, nargs, i, &v))
214         return 0;
215     if (PyTuple_Check(v)) {
216         if (PyTuple_Size(v) != n) {
217             return PyErr_BadArgument();
218         }
219         for (i = 0; i < n; i++) {
220             w = PyTuple_GetItem(v, i);
221             if (!PyInt_Check(w)) {
222                 return PyErr_BadArgument();
223             }
224             p_arg[i] = (short) PyInt_AsLong(w);
225         }
226         return 1;
227     }
228     else if (PyList_Check(v)) {
229         if (PyList_Size(v) != n) {
230             return PyErr_BadArgument();
231         }
232         for (i = 0; i < n; i++) {
233             w = PyList_GetItem(v, i);
234             if (!PyInt_Check(w)) {
235                 return PyErr_BadArgument();
236             }
237             p_arg[i] = (short) PyInt_AsLong(w);
238         }
239         return 1;
240     }
241     else {
242         return PyErr_BadArgument();
243     }
244 }
245 
246 int
PyArg_GetDoubleArray(PyObject * args,int nargs,int i,int n,double * p_arg)247 PyArg_GetDoubleArray(PyObject *args, int nargs, int i, int n, double *p_arg)
248 {
249     PyObject *v, *w;
250     if (!PyArg_GetObject(args, nargs, i, &v))
251         return 0;
252     if (PyTuple_Check(v)) {
253         if (PyTuple_Size(v) != n) {
254             return PyErr_BadArgument();
255         }
256         for (i = 0; i < n; i++) {
257             w = PyTuple_GetItem(v, i);
258             if (!extractdouble(w, &p_arg[i]))
259                 return 0;
260         }
261         return 1;
262     }
263     else if (PyList_Check(v)) {
264         if (PyList_Size(v) != n) {
265             return PyErr_BadArgument();
266         }
267         for (i = 0; i < n; i++) {
268             w = PyList_GetItem(v, i);
269             if (!extractdouble(w, &p_arg[i]))
270                 return 0;
271         }
272         return 1;
273     }
274     else {
275         return PyErr_BadArgument();
276     }
277 }
278 
279 int
PyArg_GetFloatArray(PyObject * args,int nargs,int i,int n,float * p_arg)280 PyArg_GetFloatArray(PyObject *args, int nargs, int i, int n, float *p_arg)
281 {
282     PyObject *v, *w;
283     if (!PyArg_GetObject(args, nargs, i, &v))
284         return 0;
285     if (PyTuple_Check(v)) {
286         if (PyTuple_Size(v) != n) {
287             return PyErr_BadArgument();
288         }
289         for (i = 0; i < n; i++) {
290             w = PyTuple_GetItem(v, i);
291             if (!extractfloat(w, &p_arg[i]))
292                 return 0;
293         }
294         return 1;
295     }
296     else if (PyList_Check(v)) {
297         if (PyList_Size(v) != n) {
298             return PyErr_BadArgument();
299         }
300         for (i = 0; i < n; i++) {
301             w = PyList_GetItem(v, i);
302             if (!extractfloat(w, &p_arg[i]))
303                 return 0;
304         }
305         return 1;
306     }
307     else {
308         return PyErr_BadArgument();
309     }
310 }
311