diff options
author | Thomas Heller <theller@ctypes.org> | 2007-07-12 14:58:32 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2007-07-12 14:58:32 (GMT) |
commit | 3af4266d07c38a136858acd63fe663d24590400c (patch) | |
tree | 57a1cfb0191b8d4b392557195cdea0c690c0e9af | |
parent | f7c6d868325b999c32ec759934eac7a96c4b56fd (diff) | |
download | cpython-3af4266d07c38a136858acd63fe663d24590400c.zip cpython-3af4266d07c38a136858acd63fe663d24590400c.tar.gz cpython-3af4266d07c38a136858acd63fe663d24590400c.tar.bz2 |
ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects.
-rw-r--r-- | Lib/ctypes/test/test_bytes.py | 18 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 25 |
2 files changed, 41 insertions, 2 deletions
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); |