/*NUMPY_API * For backward compatibility * * Cast an array using typecode structure. * steals reference to at --- cannot be NULL */ NPY_NO_EXPORT PyObject * PyArray_CastToType(PyArrayObject *mp, PyArray_Descr *at, int fortran) { PyObject *out; int ret; PyArray_Descr *mpd; mpd = mp->descr; if (((mpd == at) || ((mpd->type_num == at->type_num) && PyArray_EquivByteorders(mpd->byteorder, at->byteorder) && ((mpd->elsize == at->elsize) || (at->elsize==0)))) && PyArray_ISBEHAVED_RO(mp)) { Py_DECREF(at); Py_INCREF(mp); return (PyObject *)mp; } if (at->elsize == 0) { PyArray_DESCR_REPLACE(at); if (at == NULL) { return NULL; } if (mpd->type_num == PyArray_STRING && at->type_num == PyArray_UNICODE) { at->elsize = mpd->elsize << 2; } if (mpd->type_num == PyArray_UNICODE && at->type_num == PyArray_STRING) { at->elsize = mpd->elsize >> 2; }
/* new reference */ NPY_NO_EXPORT PyArray_Descr * _array_typedescr_fromstr(char *str) { PyArray_Descr *descr; int type_num; char typechar; int size; char msg[] = "unsupported typestring"; int swap; char swapchar; swapchar = str[0]; str += 1; typechar = str[0]; size = atoi(str + 1); switch (typechar) { case 'b': if (size == sizeof(npy_bool)) { type_num = NPY_BOOL; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case 'u': if (size == sizeof(npy_uintp)) { type_num = NPY_UINTP; } else if (size == sizeof(char)) { type_num = NPY_UBYTE; } else if (size == sizeof(short)) { type_num = NPY_USHORT; } else if (size == sizeof(npy_ulong)) { type_num = NPY_ULONG; } else if (size == sizeof(int)) { type_num = NPY_UINT; } else if (size == sizeof(npy_ulonglong)) { type_num = NPY_ULONGLONG; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case 'i': if (size == sizeof(npy_intp)) { type_num = NPY_INTP; } else if (size == sizeof(char)) { type_num = NPY_BYTE; } else if (size == sizeof(short)) { type_num = NPY_SHORT; } else if (size == sizeof(long)) { type_num = NPY_LONG; } else if (size == sizeof(int)) { type_num = NPY_INT; } else if (size == sizeof(npy_longlong)) { type_num = NPY_LONGLONG; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case 'f': if (size == sizeof(float)) { type_num = NPY_FLOAT; } else if (size == sizeof(double)) { type_num = NPY_DOUBLE; } else if (size == sizeof(npy_longdouble)) { type_num = NPY_LONGDOUBLE; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case 'c': if (size == sizeof(float)*2) { type_num = NPY_CFLOAT; } else if (size == sizeof(double)*2) { type_num = NPY_CDOUBLE; } else if (size == sizeof(npy_longdouble)*2) { type_num = NPY_CLONGDOUBLE; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case 'O': if (size == sizeof(PyObject *)) { type_num = NPY_OBJECT; } else { PyErr_SetString(PyExc_ValueError, msg); return NULL; } break; case NPY_STRINGLTR: type_num = NPY_STRING; break; case NPY_UNICODELTR: type_num = NPY_UNICODE; size <<= 2; break; case 'V': type_num = NPY_VOID; break; default: PyErr_SetString(PyExc_ValueError, msg); return NULL; } descr = PyArray_DescrFromType(type_num); if (descr == NULL) { return NULL; } swap = !PyArray_ISNBO(swapchar); if (descr->elsize == 0 || swap) { /* Need to make a new PyArray_Descr */ PyArray_DESCR_REPLACE(descr); if (descr==NULL) { return NULL; } if (descr->elsize == 0) { descr->elsize = size; } if (swap) { descr->byteorder = swapchar; } } return descr; }