NUMPY_API * Simulate a C-array * steals a reference to typedescr -- can be NULL */
| 259 | * steals a reference to typedescr -- can be NULL |
| 260 | */ |
| 261 | NPY_NO_EXPORT int |
| 262 | PyArray_AsCArray(PyObject **op, void *ptr, npy_intp *dims, int nd, |
| 263 | PyArray_Descr* typedescr) |
| 264 | { |
| 265 | PyArrayObject *ap; |
| 266 | npy_intp n, m, i, j; |
| 267 | char **ptr2; |
| 268 | char ***ptr3; |
| 269 | |
| 270 | if ((nd < 1) || (nd > 3)) { |
| 271 | PyErr_SetString(PyExc_ValueError, |
| 272 | "C arrays of only 1-3 dimensions available"); |
| 273 | Py_XDECREF(typedescr); |
| 274 | return -1; |
| 275 | } |
| 276 | if ((ap = (PyArrayObject*)PyArray_FromAny(*op, typedescr, nd, nd, |
| 277 | NPY_ARRAY_CARRAY, NULL)) == NULL) { |
| 278 | return -1; |
| 279 | } |
| 280 | switch(nd) { |
| 281 | case 1: |
| 282 | *((char **)ptr) = PyArray_DATA(ap); |
| 283 | break; |
| 284 | case 2: |
| 285 | n = PyArray_DIMS(ap)[0]; |
| 286 | ptr2 = (char **)PyArray_malloc(n * sizeof(char *)); |
| 287 | if (!ptr2) { |
| 288 | PyErr_NoMemory(); |
| 289 | return -1; |
| 290 | } |
| 291 | for (i = 0; i < n; i++) { |
| 292 | ptr2[i] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0]; |
| 293 | } |
| 294 | *((char ***)ptr) = ptr2; |
| 295 | break; |
| 296 | case 3: |
| 297 | n = PyArray_DIMS(ap)[0]; |
| 298 | m = PyArray_DIMS(ap)[1]; |
| 299 | ptr3 = (char ***)PyArray_malloc(n*(m+1) * sizeof(char *)); |
| 300 | if (!ptr3) { |
| 301 | PyErr_NoMemory(); |
| 302 | return -1; |
| 303 | } |
| 304 | for (i = 0; i < n; i++) { |
| 305 | ptr3[i] = (char **) &ptr3[n + m * i]; |
| 306 | for (j = 0; j < m; j++) { |
| 307 | ptr3[i][j] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0] + j*PyArray_STRIDES(ap)[1]; |
| 308 | } |
| 309 | } |
| 310 | *((char ****)ptr) = ptr3; |
| 311 | } |
| 312 | if (nd) { |
| 313 | memcpy(dims, PyArray_DIMS(ap), nd*sizeof(npy_intp)); |
| 314 | } |
| 315 | *op = (PyObject *)ap; |
| 316 | return 0; |
| 317 | } |
| 318 |
nothing calls this directly
no test coverage detected