Author: thomas.heller
Date: Thu Jul 12 16:58:32 2007
New Revision: 56318

Added:
   python/branches/py3k-struni/Lib/ctypes/test/test_bytes.py   (contents, props 
changed)
Modified:
   python/branches/py3k-struni/Modules/_ctypes/cfield.c
Log:
ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects.

Added: python/branches/py3k-struni/Lib/ctypes/test/test_bytes.py
==============================================================================
--- (empty file)
+++ python/branches/py3k-struni/Lib/ctypes/test/test_bytes.py   Thu Jul 12 
16:58:32 2007
@@ -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()

Modified: python/branches/py3k-struni/Modules/_ctypes/cfield.c
==============================================================================
--- python/branches/py3k-struni/Modules/_ctypes/cfield.c        (original)
+++ python/branches/py3k-struni/Modules/_ctypes/cfield.c        Thu Jul 12 
16:58:32 2007
@@ -1141,6 +1141,27 @@
 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 @@
 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 @@
 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);
_______________________________________________
Python-3000-checkins mailing list
Python-3000-checkins@python.org
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to