diff --git a/src/conversions.cpp b/src/conversions.cpp index ded01e0e..a01c51f5 100644 --- a/src/conversions.cpp +++ b/src/conversions.cpp @@ -160,24 +160,43 @@ unsigned short from_python(PyObject* p, boost::python::type type return integer_from_python(p, type); } -PyObject* to_python(unsigned char i) +PyObject* char_to_python(char c) { - return integer_to_python(i); + return PyString_FromStringAndSize(&c, 1); +} + +char char_from_python(PyObject* p) +{ + if (! PyString_Check(p)) { + PyErr_SetString(PyExc_TypeError, "expected string with exactly one character"); + throw boost::python::argument_error(); + } + const char* s = PyString_AsString(p); + if (! s || s[0] == '\0' || s[1] != '\0') { + PyErr_SetString(PyExc_ValueError, "expected string with exactly one character"); + throw boost::python::argument_error(); + } + return s[0]; +} + +PyObject* to_python(unsigned char c) +{ + return char_to_python(static_cast(c)); } unsigned char from_python(PyObject* p, boost::python::type type) { - return integer_from_python(p, type); + return static_cast(char_from_python(p)); } -PyObject* to_python(signed char i) +PyObject* to_python(signed char c) { - return integer_to_python(i); + return char_to_python(static_cast(c)); } signed char from_python(PyObject* p, boost::python::type type) { - return integer_from_python(p, type); + return static_cast(char_from_python(p)); } PyObject* to_python(unsigned long x)