/Modules/cgensupport.c

http://unladen-swallow.googlecode.com/ · C · 310 lines · 282 code · 19 blank · 9 comment · 102 complexity · 52789292534afe77cda15b499076db25 MD5 · raw file

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