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