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},