c_char, c_char_p objects and c_char array structure fields return

their value now as str, no longer str8.
This commit is contained in:
Thomas Heller 2007-07-13 12:52:51 +00:00
parent 27384da6e8
commit 19b52545df
7 changed files with 29 additions and 40 deletions

View File

@ -7,12 +7,12 @@ class StringBufferTestCase(unittest.TestCase):
b = create_string_buffer(32) b = create_string_buffer(32)
self.failUnlessEqual(len(b), 32) self.failUnlessEqual(len(b), 32)
self.failUnlessEqual(sizeof(b), 32 * sizeof(c_char)) self.failUnlessEqual(sizeof(b), 32 * sizeof(c_char))
self.failUnless(type(b[0]) is str8) self.failUnless(type(b[0]) is str)
b = create_string_buffer("abc") b = create_string_buffer("abc")
self.failUnlessEqual(len(b), 4) # trailing nul char self.failUnlessEqual(len(b), 4) # trailing nul char
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char)) self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
self.failUnless(type(b[0]) is str8) self.failUnless(type(b[0]) is str)
self.failUnlessEqual(b[0], "a") self.failUnlessEqual(b[0], "a")
self.failUnlessEqual(b[:], "abc\0") self.failUnlessEqual(b[:], "abc\0")
@ -20,7 +20,7 @@ class StringBufferTestCase(unittest.TestCase):
b = create_string_buffer("abc") b = create_string_buffer("abc")
self.failUnlessEqual(len(b), 4) # trailing nul char self.failUnlessEqual(len(b), 4) # trailing nul char
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char)) self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
self.failUnless(type(b[0]) is str8) self.failUnless(type(b[0]) is str)
self.failUnlessEqual(b[0], "a") self.failUnlessEqual(b[0], "a")
self.failUnlessEqual(b[:], "abc\0") self.failUnlessEqual(b[:], "abc\0")

View File

@ -29,14 +29,18 @@ class BytesTest(unittest.TestCase):
_fields_ = [("a", c_char * 3)] _fields_ = [("a", c_char * 3)]
X("abc") X("abc")
X(b"abc") x = X(b"abc")
self.assertEqual(x.a, "abc")
self.assertEqual(type(x.a), str)
def test_struct_W(self): def test_struct_W(self):
class X(Structure): class X(Structure):
_fields_ = [("a", c_wchar * 3)] _fields_ = [("a", c_wchar * 3)]
X("abc") X("abc")
X(b"abc") x = X(b"abc")
self.assertEqual(x.a, "abc")
self.assertEqual(type(x.a), str)
if sys.platform == "win32": if sys.platform == "win32":
def test_BSTR(self): def test_BSTR(self):

View File

@ -24,7 +24,7 @@ assigned from Python must be kept.
>>> array._objects >>> array._objects
{'4': b'foo bar'} {'4': b'foo bar'}
>>> array[4] >>> array[4]
s'foo bar' 'foo bar'
>>> >>>
It gets more complicated when the ctypes instance itself is contained It gets more complicated when the ctypes instance itself is contained

View File

@ -69,7 +69,7 @@ class CallbackTracbackTestCase(unittest.TestCase):
out = self.capture_stderr(cb, "spam") out = self.capture_stderr(cb, "spam")
self.failUnlessEqual(out.splitlines()[-1], self.failUnlessEqual(out.splitlines()[-1],
"TypeError: " "TypeError: "
"unsupported operand type(s) for /: 'int' and 'str8'") "unsupported operand type(s) for /: 'int' and 'str'")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -22,7 +22,7 @@ class ReprTest(unittest.TestCase):
self.failUnlessEqual("<X object at", repr(typ(42))[:12]) self.failUnlessEqual("<X object at", repr(typ(42))[:12])
def test_char(self): def test_char(self):
self.failUnlessEqual("c_char(s'x')", repr(c_char('x'))) self.failUnlessEqual("c_char('x')", repr(c_char('x')))
self.failUnlessEqual("<X object at", repr(X('x'))[:12]) self.failUnlessEqual("<X object at", repr(X('x'))[:12])
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -70,7 +70,7 @@ class SlicesTestCase(unittest.TestCase):
dll.my_strdup.errcheck = errcheck dll.my_strdup.errcheck = errcheck
try: try:
res = dll.my_strdup(s) res = dll.my_strdup(s)
self.failUnlessEqual(res, s) self.failUnlessEqual(res, str(s))
finally: finally:
del dll.my_strdup.errcheck del dll.my_strdup.errcheck

View File

@ -1137,9 +1137,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
return NULL; return NULL;
if (PyBytes_GET_SIZE(value) != 1) { if (PyBytes_GET_SIZE(value) != 1) {
Py_DECREF(value); Py_DECREF(value);
PyErr_Format(PyExc_TypeError, goto error;
"one character string expected");
return NULL;
} }
*(char *)ptr = PyBytes_AsString(value)[0]; *(char *)ptr = PyBytes_AsString(value)[0];
Py_DECREF(value); Py_DECREF(value);
@ -1149,22 +1147,17 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
*(char *)ptr = PyBytes_AsString(value)[0]; *(char *)ptr = PyBytes_AsString(value)[0];
_RET(value); _RET(value);
} }
/* XXX struni remove later */ error:
if (!PyString_Check(value) || (1 != PyString_Size(value))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"one character string expected"); "one character string expected");
return NULL; return NULL;
} }
*(char *)ptr = PyString_AS_STRING(value)[0];
_RET(value);
}
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 PyUnicode_FromStringAndSize((char *)ptr, 1);
return PyString_FromStringAndSize((char *)ptr, 1);
} }
#ifdef CTYPES_UNICODE #ifdef CTYPES_UNICODE
@ -1280,24 +1273,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
static PyObject * static PyObject *
s_get(void *ptr, Py_ssize_t size) s_get(void *ptr, Py_ssize_t size)
{ {
PyObject *result; Py_ssize_t i;
size_t slen; char *p;
result = PyString_FromString((char *)ptr); p = (char *)ptr;
if (!result) for (i = 0; i < size; ++i) {
return NULL; if (*p++ == '\0')
/* chop off at the first NUL character, if any. break;
* On error, result will be deallocated and set to NULL. }
*/
slen = strlen(PyString_AS_STRING(result)); return PyUnicode_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
size = min(size, (Py_ssize_t)slen);
if (result->ob_refcnt == 1) {
/* shorten the result */
_PyString_Resize(&result, size);
return result;
} else
/* cannot shorten the result */
return PyString_FromStringAndSize(ptr, size);
} }
static PyObject * static PyObject *
@ -1393,7 +1378,7 @@ z_get(void *ptr, Py_ssize_t size)
return NULL; return NULL;
} }
#endif #endif
return PyString_FromString(*(char **)ptr); return PyUnicode_FromString(*(char **)ptr);
} else { } else {
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;