Commit e5095e18 authored by Thomas Heller's avatar Thomas Heller

Structure fields of type c_char array or c_wchar array accept bytes or

(unicode) string.
parent 745f5e2d
"""Test where byte objects are accepted"""
import unittest import unittest
from ctypes import * from ctypes import *
...@@ -22,5 +23,19 @@ class BytesTest(unittest.TestCase): ...@@ -22,5 +23,19 @@ class BytesTest(unittest.TestCase):
c_wchar_p("foo bar") c_wchar_p("foo bar")
c_wchar_p(b"foo bar") c_wchar_p(b"foo bar")
def test_struct(self):
class X(Structure):
_fields_ = [("a", c_char * 3)]
X("abc")
X(b"abc")
def test_struct_W(self):
class X(Structure):
_fields_ = [("a", c_wchar * 3)]
X("abc")
X(b"abc")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -1260,7 +1260,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) ...@@ -1260,7 +1260,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
/* It's easier to calculate in characters than in bytes */ /* It's easier to calculate in characters than in bytes */
length /= sizeof(wchar_t); length /= sizeof(wchar_t);
if (PyString_Check(value)) { if (PyBytes_Check(value)) {
value = PyUnicode_FromEncodedObject(value, value = PyUnicode_FromEncodedObject(value,
conversion_mode_encoding, conversion_mode_encoding,
conversion_mode_errors); conversion_mode_errors);
...@@ -1322,7 +1322,23 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length) ...@@ -1322,7 +1322,23 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length)
char *data; char *data;
Py_ssize_t size; Py_ssize_t size;
data = PyString_AsString(value); if (PyUnicode_Check(value)) {
value = PyUnicode_AsEncodedString(value,
conversion_mode_encoding,
conversion_mode_errors);
if (value == NULL)
return NULL;
assert(PyBytes_Check(value));
} else if(PyBytes_Check(value)) {
Py_INCREF(value);
} else {
PyErr_Format(PyExc_TypeError,
"expected string, %s found",
value->ob_type->tp_name);
return NULL;
}
data = PyBytes_AsString(value);
if (!data) if (!data)
return NULL; return NULL;
size = strlen(data); size = strlen(data);
...@@ -1339,10 +1355,13 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length) ...@@ -1339,10 +1355,13 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length)
"string too long (%zd, maximum length %zd)", "string too long (%zd, maximum length %zd)",
#endif #endif
size, length); size, length);
Py_DECREF(value);
return NULL; return NULL;
} }
/* Also copy the terminating NUL character if there is space */ /* Also copy the terminating NUL character if there is space */
memcpy((char *)ptr, data, size); memcpy((char *)ptr, data, size);
Py_DECREF(value);
_RET(value); _RET(value);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment