summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorOndrej Certik <ondrej.certik@gmail.com>2012-08-03 10:39:25 -0700
committerOndrej Certik <ondrej.certik@gmail.com>2012-08-03 11:44:39 -0700
commitf2ac38f09ff258339ef44572a3abba02019e1f55 (patch)
tree29b4ddb27c4d5d00dcdc5e329cbd6440480f5905 /numpy
parent09d2c51fa1d09b17060a8545b925f4dded9dedb1 (diff)
downloadnumpy-f2ac38f09ff258339ef44572a3abba02019e1f55.tar.gz
Use PyUnicode_DecodeUTF32()
This function handles the swapping automatically and it returns a unicode object in one of: UCS1, UCS2 or UCS4 internal Python format.
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/scalarapi.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c
index 97a5e4be4..d9bc492be 100644
--- a/numpy/core/src/multiarray/scalarapi.c
+++ b/numpy/core/src/multiarray/scalarapi.c
@@ -644,25 +644,18 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
#if PY_VERSION_HEX >= 0x03030000
if (type_num == NPY_UNICODE) {
PyObject *u, *args;
- char *buffer;
+ int byteorder;
- if (swap) {
- buffer = malloc(itemsize);
- if (buffer == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- memcpy(buffer, data, itemsize);
- byte_swap_vector(buffer, itemsize >> 2, 4);
- }
- else {
- buffer = data;
- }
- u = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer,
- itemsize >> 2);
- if (swap) {
- free(buffer);
- }
+#if NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN
+ byteorder = -1;
+#elif NPY_BYTE_ORDER == NPY_BIG_ENDIAN
+ byteorder = +1;
+#else
+ #error Endianness undefined ?
+#endif
+ if (swap) byteorder *= -1;
+
+ u = PyUnicode_DecodeUTF32(data, itemsize, NULL, &byteorder);
if (u == NULL) {
return NULL;
}