symbian-qemu-0.9.1-12/python-2.6.1/Modules/cgensupport.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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
       
    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
       
    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
       
    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
       
    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
       
    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
       
   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
       
   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
       
   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
       
   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
       
   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
       
   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
       
   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
       
   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
       
   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 }