]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects.
authorThomas Heller <theller@ctypes.org>
Thu, 12 Jul 2007 14:58:32 +0000 (14:58 +0000)
committerThomas Heller <theller@ctypes.org>
Thu, 12 Jul 2007 14:58:32 +0000 (14:58 +0000)
Lib/ctypes/test/test_bytes.py [new file with mode: 0644]
Modules/_ctypes/cfield.c

diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py
new file mode 100644 (file)
index 0000000..778fe09
--- /dev/null
@@ -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()
index 9c49c1ea0ab5aa45f3394960ab499b00f009cf41..75b00b69c0fce385a078d413268e9d67db0f1708 100644 (file)
@@ -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);