Commit 3af4266d authored by Thomas Heller's avatar Thomas Heller

ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects.

parent f7c6d868
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()
...@@ -1141,6 +1141,27 @@ O_set(void *ptr, PyObject *value, Py_ssize_t size) ...@@ -1141,6 +1141,27 @@ O_set(void *ptr, PyObject *value, Py_ssize_t size)
static PyObject * static PyObject *
c_set(void *ptr, PyObject *value, Py_ssize_t size) 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))) { if (!PyString_Check(value) || (1 != PyString_Size(value))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"one character string expected"); "one character string expected");
...@@ -1154,6 +1175,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size) ...@@ -1154,6 +1175,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
static PyObject * static PyObject *
c_get(void *ptr, Py_ssize_t size) c_get(void *ptr, Py_ssize_t size)
{ {
/* XXX struni return PyBytes (or PyUnicode?) later */
return PyString_FromStringAndSize((char *)ptr, 1); return PyString_FromStringAndSize((char *)ptr, 1);
} }
...@@ -1163,8 +1185,7 @@ static PyObject * ...@@ -1163,8 +1185,7 @@ static PyObject *
u_set(void *ptr, PyObject *value, Py_ssize_t size) u_set(void *ptr, PyObject *value, Py_ssize_t size)
{ {
Py_ssize_t len; Py_ssize_t len;
if (PyBytes_Check(value)) {
if (PyString_Check(value)) {
value = PyUnicode_FromEncodedObject(value, value = PyUnicode_FromEncodedObject(value,
conversion_mode_encoding, conversion_mode_encoding,
conversion_mode_errors); conversion_mode_errors);
......
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