PageRenderTime 30ms CodeModel.GetById 1ms app.highlight 25ms RepoModel.GetById 1ms app.codeStats 0ms

/Modules/cgensupport.c

http://unladen-swallow.googlecode.com/
C | 310 lines | 282 code | 19 blank | 9 comment | 102 complexity | 52789292534afe77cda15b499076db25 MD5 | raw file
  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
 13int
 14PyArg_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
 33int
 34PyArg_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
 51int
 52PyArg_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
 61static int
 62extractdouble(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
 82static int
 83extractfloat(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
103int
104PyArg_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
116int
117PyArg_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
129int
130PyArg_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
143int
144PyArg_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
160int
161PyArg_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
172int
173PyArg_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
209int
210PyArg_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
246int
247PyArg_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
279int
280PyArg_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}