diff options
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r-- | Objects/stringobject.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index e918829b72..80da47d3e9 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -152,6 +152,100 @@ PyString_FromString(str) return (PyObject *) op; } +PyObject *PyString_Decode(const char *s, + int size, + const char *encoding, + const char *errors) +{ + PyObject *buffer = NULL, *str; + + if (encoding == NULL) + encoding = PyUnicode_GetDefaultEncoding(); + + /* Decode via the codec registry */ + buffer = PyBuffer_FromMemory((void *)s, size); + if (buffer == NULL) + goto onError; + str = PyCodec_Decode(buffer, encoding, errors); + if (str == NULL) + goto onError; + /* Convert Unicode to a string using the default encoding */ + if (PyUnicode_Check(str)) { + PyObject *temp = str; + str = PyUnicode_AsEncodedString(str, NULL, NULL); + Py_DECREF(temp); + if (str == NULL) + goto onError; + } + if (!PyString_Check(str)) { + PyErr_Format(PyExc_TypeError, + "decoder did not return an string object (type=%.400s)", + str->ob_type->tp_name); + Py_DECREF(str); + goto onError; + } + Py_DECREF(buffer); + return str; + + onError: + Py_XDECREF(buffer); + return NULL; +} + +PyObject *PyString_Encode(const char *s, + int size, + const char *encoding, + const char *errors) +{ + PyObject *v, *str; + + str = PyString_FromStringAndSize(s, size); + if (str == NULL) + return NULL; + v = PyString_AsEncodedString(str, encoding, errors); + Py_DECREF(str); + return v; +} + +PyObject *PyString_AsEncodedString(PyObject *str, + const char *encoding, + const char *errors) +{ + PyObject *v; + + if (!PyString_Check(str)) { + PyErr_BadArgument(); + goto onError; + } + + if (encoding == NULL) + encoding = PyUnicode_GetDefaultEncoding(); + + /* Encode via the codec registry */ + v = PyCodec_Encode(str, encoding, errors); + if (v == NULL) + goto onError; + /* Convert Unicode to a string using the default encoding */ + if (PyUnicode_Check(v)) { + PyObject *temp = v; + v = PyUnicode_AsEncodedString(v, NULL, NULL); + Py_DECREF(temp); + if (v == NULL) + goto onError; + } + if (!PyString_Check(v)) { + PyErr_Format(PyExc_TypeError, + "encoder did not return a string object (type=%.400s)", + v->ob_type->tp_name); + Py_DECREF(v); + goto onError; + } + return v; + + onError: + return NULL; +} + static void string_dealloc(op) PyObject *op; @@ -1686,6 +1780,25 @@ string_endswith(self, args) } +static char encode__doc__[] = +"S.encode([encoding[,errors]]) -> string\n\ +\n\ +Return an encoded string version of S. Default encoding is the current\n\ +default string encoding. errors may be given to set a different error\n\ +handling scheme. Default is 'strict' meaning that encoding errors raise\n\ +a ValueError. Other possible values are 'ignore' and 'replace'."; + +static PyObject * +string_encode(PyStringObject *self, PyObject *args) +{ + char *encoding = NULL; + char *errors = NULL; + if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors)) + return NULL; + return PyString_AsEncodedString((PyObject *)self, encoding, errors); +} + + static char expandtabs__doc__[] = "S.expandtabs([tabsize]) -> string\n\ \n\ @@ -2252,6 +2365,7 @@ string_methods[] = { {"ljust", (PyCFunction)string_ljust, 1, ljust__doc__}, {"rjust", (PyCFunction)string_rjust, 1, rjust__doc__}, {"center", (PyCFunction)string_center, 1, center__doc__}, + {"encode", (PyCFunction)string_encode, 1, encode__doc__}, {"expandtabs", (PyCFunction)string_expandtabs, 1, expandtabs__doc__}, {"splitlines", (PyCFunction)string_splitlines, 1, splitlines__doc__}, #if 0 |