diff Modules/_ctypes/cfield.c @ 42257:c280647c330c

c_char, c_char_p objects and c_char array structure fields return their value now as str, no longer str8.
author Thomas Heller <theller@ctypes.org>
date Fri, 13 Jul 2007 12:52:51 +0000
parents 17bb3980483e
children e70cdce0e8b2
line wrap: on
line diff
--- a/Modules/_ctypes/cfield.c	Fri Jul 13 12:07:59 2007 +0000
+++ b/Modules/_ctypes/cfield.c	Fri Jul 13 12:52:51 2007 +0000
@@ -1137,9 +1137,7 @@
 			return NULL;
 		if (PyBytes_GET_SIZE(value) != 1) {
 			Py_DECREF(value);
-			PyErr_Format(PyExc_TypeError,
-				     "one character string expected");
-			return NULL;
+			goto error;
 		}
 		*(char *)ptr = PyBytes_AsString(value)[0];
 		Py_DECREF(value);
@@ -1149,22 +1147,17 @@
 		*(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");
-		return NULL;
-	}
-	*(char *)ptr = PyString_AS_STRING(value)[0];
-	_RET(value);
+  error:
+	PyErr_Format(PyExc_TypeError,
+		     "one character string expected");
+	return NULL;
 }
 
 
 static PyObject *
 c_get(void *ptr, Py_ssize_t size)
 {
-	/* XXX struni return PyBytes (or PyUnicode?) later */
-	return PyString_FromStringAndSize((char *)ptr, 1);
+	return PyUnicode_FromStringAndSize((char *)ptr, 1);
 }
 
 #ifdef CTYPES_UNICODE
@@ -1280,24 +1273,16 @@
 static PyObject *
 s_get(void *ptr, Py_ssize_t size)
 {
-	PyObject *result;
-	size_t slen;
+	Py_ssize_t i;
+	char *p;
 
-	result = PyString_FromString((char *)ptr);
-	if (!result)
-		return NULL;
-	/* chop off at the first NUL character, if any.
-	 * On error, result will be deallocated and set to NULL.
-	 */
-	slen = strlen(PyString_AS_STRING(result));
-	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);
+	p = (char *)ptr;
+	for (i = 0; i < size; ++i) {
+		if (*p++ == '\0')
+			break;
+	}
+
+	return PyUnicode_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
 }
 
 static PyObject *
@@ -1393,7 +1378,7 @@
 			return NULL;
 		}
 #endif
-		return PyString_FromString(*(char **)ptr);
+		return PyUnicode_FromString(*(char **)ptr);
 	} else {
 		Py_INCREF(Py_None);
 		return Py_None;