From: Marc-André Lemburg <mal@egenix.com>
Date: Thu, 21 Sep 2000 21:09:45 +0000 (+0000)
Subject: Added a true unicode_internal_encode function and fixed the
X-Git-Tag: v2.0b2~152
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b425f5e35b92ed0ab600c4ab500c7b04f112b68c;p=python

Added a true unicode_internal_encode function and fixed the
unicode_internal_decode function to support Unicode objects
directly rather than by generating a copy of the object.
---

diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c
index 53e63c5f08..37d89e99ee 100644
--- a/Modules/_codecsmodule.c
+++ b/Modules/_codecsmodule.c
@@ -102,17 +102,24 @@ static PyObject *
 unicode_internal_decode(PyObject *self,
 			PyObject *args)
 {
+    PyObject *obj;
+    const char *errors = NULL;
     const char *data;
     int size;
-    const char *errors = NULL;
     
-    if (!PyArg_ParseTuple(args, "s#|z:unicode_internal_decode",
-			  &data, &size, &errors))
-	return NULL;
-
-    return codec_tuple(PyUnicode_FromUnicode((Py_UNICODE *)data, 
-					       size / sizeof(Py_UNICODE)),
-		       size);
+    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
+			  &obj, &errors))
+	return NULL;
+
+    if (PyUnicode_Check(obj))
+	return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
+    else {
+	if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
+	    return NULL;
+	return codec_tuple(PyUnicode_FromUnicode((Py_UNICODE *)data,
+						 size / sizeof(Py_UNICODE)),
+			   size);
+    }
 }
 
 static PyObject *
@@ -346,6 +353,33 @@ charbuffer_encode(PyObject *self,
 		       size);
 }
 
+static PyObject *
+unicode_internal_encode(PyObject *self,
+			PyObject *args)
+{
+    PyObject *obj;
+    const char *errors = NULL;
+    const char *data;
+    int size;
+    
+    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
+			  &obj, &errors))
+	return NULL;
+
+    if (PyUnicode_Check(obj)) {
+	data = PyUnicode_AS_DATA(obj);
+	size = PyUnicode_GET_DATA_SIZE(obj);
+	return codec_tuple(PyString_FromStringAndSize(data, size),
+			   size);
+    }
+    else {
+	if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
+	    return NULL;
+	return codec_tuple(PyString_FromStringAndSize(data, size),
+			   size);
+    }
+}
+
 static PyObject *
 utf_8_encode(PyObject *self,
 	    PyObject *args)
@@ -604,7 +638,7 @@ static PyMethodDef _codecs_functions[] = {
     {"utf_16_ex_decode",	utf_16_ex_decode,		1},
     {"unicode_escape_encode",	unicode_escape_encode,		1},
     {"unicode_escape_decode",	unicode_escape_decode,		1},
-    {"unicode_internal_encode",	readbuffer_encode,		1},
+    {"unicode_internal_encode",	unicode_internal_encode,	1},
     {"unicode_internal_decode",	unicode_internal_decode,	1},
     {"raw_unicode_escape_encode", raw_unicode_escape_encode,	1},
     {"raw_unicode_escape_decode", raw_unicode_escape_decode,	1},