From 3af4266d07c38a136858acd63fe663d24590400c Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Thu, 12 Jul 2007 14:58:32 +0000 Subject: ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects. --- Lib/ctypes/test/test_bytes.py | 18 ++++++++++++++++++ Modules/_ctypes/cfield.c | 25 +++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 Lib/ctypes/test/test_bytes.py diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py new file mode 100644 index 0000000..778fe09 --- /dev/null +++ b/Lib/ctypes/test/test_bytes.py @@ -0,0 +1,18 @@ +import unittest +from ctypes import * + +class BytesTest(unittest.TestCase): + def test_c_char(self): + x = c_char(b"x") + x.value = b"y" + c_char.from_param(b"x") + (c_char * 3)(b"a", b"b", b"c") + + def test_c_wchar(self): + x = c_wchar(b"x") + x.value = b"y" + c_wchar.from_param(b"x") + (c_wchar * 3)(b"a", b"b", b"c") + +if __name__ == '__main__': + unittest.main() diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 9c49c1e..75b00b6 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1141,6 +1141,27 @@ O_set(void *ptr, PyObject *value, Py_ssize_t size) static PyObject * c_set(void *ptr, PyObject *value, Py_ssize_t size) { + if (PyUnicode_Check(value)) { + value = PyUnicode_AsEncodedString(value, + conversion_mode_encoding, + conversion_mode_errors); + if (value == NULL) + return NULL; + if (PyBytes_GET_SIZE(value) != 1) { + Py_DECREF(value); + PyErr_Format(PyExc_TypeError, + "one character string expected"); + return NULL; + } + *(char *)ptr = PyBytes_AsString(value)[0]; + Py_DECREF(value); + _RET(value); + } + if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) { + *(char *)ptr = PyBytes_AsString(value)[0]; + _RET(value); + } + /* XXX struni remove later */ if (!PyString_Check(value) || (1 != PyString_Size(value))) { PyErr_Format(PyExc_TypeError, "one character string expected"); @@ -1154,6 +1175,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size) static PyObject * c_get(void *ptr, Py_ssize_t size) { + /* XXX struni return PyBytes (or PyUnicode?) later */ return PyString_FromStringAndSize((char *)ptr, 1); } @@ -1163,8 +1185,7 @@ static PyObject * u_set(void *ptr, PyObject *value, Py_ssize_t size) { Py_ssize_t len; - - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); -- cgit v0.12