17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ------------------------------------------------------------------------
27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   _codecs -- Provides access to the codec registry and the builtin
47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              codecs.
57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   This module should never be imported directly. The standard library
77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   module "codecs" wraps this builtin module for use within Python.
87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   The codec registry is accessible via:
107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     register(search_function) -> None
127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     lookup(encoding) -> CodecInfo object
147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   The builtin Unicode codecs use the following interface:
167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     <encoding>_encode(Unicode_object[,errors='strict']) ->
187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        (string object, bytes consumed)
197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     <encoding>_decode(char_buffer_obj[,errors='strict']) ->
217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        (Unicode object, bytes consumed)
227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   <encoding>_encode() interfaces also accept non-Unicode object as
247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   input. The objects are then converted to Unicode using
257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   PyUnicode_FromObject() prior to applying the conversion.
267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   These <encoding>s are available: utf_8, unicode_escape,
287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit),
297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   mbcs (on win32).
307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielWritten by Marc-Andre Lemburg (mal@lemburg.com).
337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielCopyright (c) Corporation for National Research Initiatives.
357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   ------------------------------------------------------------------------ */
377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define PY_SSIZE_T_CLEAN
397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include "Python.h"
407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Registry ----------------------------------------------------------- */
427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(register__doc__,
447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"register(search_function)\n\
457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielRegister a codec search function. Search functions are expected to take\n\
477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielone argument, the encoding name in all lower case letters, and return\n\
487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniela tuple of functions (encoder, decoder, stream_reader, stream_writer)\n\
497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel(or a CodecInfo object).");
507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic
527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyObject *codec_register(PyObject *self, PyObject *search_function)
537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (PyCodec_Register(search_function))
557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_RETURN_NONE;
587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(lookup__doc__,
617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"lookup(encoding) -> CodecInfo\n\
627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielLooks up a codec tuple in the Python codec registry and returns\n\
647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniela CodecInfo object.");
657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic
677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyObject *codec_lookup(PyObject *self, PyObject *args)
687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *encoding;
707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s:lookup", &encoding))
727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return _PyCodec_Lookup(encoding);
757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(encode__doc__,
787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"encode(obj, [encoding[,errors]]) -> object\n\
797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielEncodes obj using the codec registered for encoding. encoding defaults\n\
817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielto the default encoding. errors may be given to set a different error\n\
827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielhandling scheme. Default is 'strict' meaning that encoding errors raise\n\
837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniela ValueError. Other possible values are 'ignore', 'replace' and\n\
847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel'xmlcharrefreplace' as well as any other name registered with\n\
857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcodecs.register_error that can handle ValueErrors.");
867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcodec_encode(PyObject *self, PyObject *args)
897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *encoding = NULL;
917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *v;
937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))
957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Py_USING_UNICODE
987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (encoding == NULL)
997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        encoding = PyUnicode_GetDefaultEncoding();
1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (encoding == NULL) {
1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        PyErr_SetString(PyExc_ValueError, "no encoding specified");
1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Encode via the codec registry */
1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PyCodec_Encode(v, encoding, errors);
1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(decode__doc__,
1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"decode(obj, [encoding[,errors]]) -> object\n\
1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielDecodes obj using the codec registered for encoding. encoding defaults\n\
1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielto the default encoding. errors may be given to set a different error\n\
1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielhandling scheme. Default is 'strict' meaning that encoding errors raise\n\
1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniela ValueError. Other possible values are 'ignore' and 'replace'\n\
1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielas well as any other name registered with codecs.register_error that is\n\
1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielable to handle ValueErrors.");
1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcodec_decode(PyObject *self, PyObject *args)
1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *encoding = NULL;
1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *v;
1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))
1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Py_USING_UNICODE
1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (encoding == NULL)
1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        encoding = PyUnicode_GetDefaultEncoding();
1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (encoding == NULL) {
1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        PyErr_SetString(PyExc_ValueError, "no encoding specified");
1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Decode via the codec registry */
1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PyCodec_Decode(v, encoding, errors);
1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Helpers ------------------------------------------------------------ */
1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic
1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyObject *codec_tuple(PyObject *unicode,
1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                      Py_ssize_t len)
1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *v;
1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (unicode == NULL)
1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = Py_BuildValue("On", unicode, len);
1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(unicode);
1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- String codecs ------------------------------------------------------ */
1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielescape_decode(PyObject *self,
1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              PyObject *args)
1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *data;
1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t size;
1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s#|z:escape_decode",
1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &data, &size, &errors))
1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL),
1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       size);
1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielescape_encode(PyObject *self,
1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              PyObject *args)
1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str;
1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *buf;
1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed, len;
1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "S|z:escape_encode",
1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = PyString_GET_SIZE(str);
1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyString_Repr(str, 0);
1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!str)
1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* The string will be quoted. Unquote, similar to unicode-escape. */
1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    buf = PyString_AS_STRING (str);
1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    len = PyString_GET_SIZE (str);
1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    memmove(buf, buf+1, len-2);
1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (_PyString_Resize(&str, len-2) < 0)
1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(str, consumed);
2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Py_USING_UNICODE
2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Decoder ------------------------------------------------------------ */
2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielunicode_internal_decode(PyObject *self,
2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        PyObject *args)
2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *obj;
2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *data;
2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t size;
2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &obj, &errors))
2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (PyUnicode_Check(obj)) {
2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        Py_INCREF(obj);
2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else {
2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return NULL;
2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                           size);
2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_7_decode(PyObject *self,
2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             PyObject *args)
2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded = NULL;
2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_7_decode",
2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len;
2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,
2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                           final ? NULL : &consumed);
2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_8_decode(PyObject *self,
2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded = NULL;
2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_8_decode",
2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len;
2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,
2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                           final ? NULL : &consumed);
2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_decode(PyObject *self,
2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded;
2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_decode",
2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_le_decode(PyObject *self,
3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = -1;
3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded = NULL;
3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_le_decode",
3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        &byteorder, final ? NULL : &consumed);
3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_be_decode(PyObject *self,
3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 1;
3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded = NULL;
3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_be_decode",
3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        &byteorder, final ? NULL : &consumed);
3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This non-standard version also provides access to the byteorder
3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   parameter of the builtin UTF-16 codec.
3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   It returns a tuple (unicode, bytesread, byteorder) with byteorder
3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   being the value in effect at the end of data.
3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_ex_decode(PyObject *self,
3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode, *tuple;
3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zii:utf_16_ex_decode",
3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &byteorder, &final))
3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (unicode == NULL)
3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(unicode);
3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return tuple;
3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_decode(PyObject *self,
3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded;
3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_decode",
3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_le_decode(PyObject *self,
4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = -1;
4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded;
4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_le_decode",
4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_be_decode(PyObject *self,
4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 1;
4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded;
4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_be_decode",
4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This non-standard version also provides access to the byteorder
4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   parameter of the builtin UTF-32 codec.
4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   It returns a tuple (unicode, bytesread, byteorder) with byteorder
4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   being the value in effect at the end of data.
4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_ex_decode(PyObject *self,
4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode, *tuple;
4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zii:utf_32_ex_decode",
4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &byteorder, &final))
4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len; /* This is overwritten unless final is true. */
4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                        &byteorder, final ? NULL : &consumed);
4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (unicode == NULL)
4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(unicode);
4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return tuple;
4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielunicode_escape_decode(PyObject *self,
4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                     PyObject *args)
4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        PyObject *unicode;
4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",
4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors))
4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);
4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(unicode, pbuf.len);
4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielraw_unicode_escape_decode(PyObject *self,
5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        PyObject *args)
5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode;
5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",
5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors))
5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);
5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(unicode, pbuf.len);
5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniellatin_1_decode(PyObject *self,
5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               PyObject *args)
5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode;
5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|z:latin_1_decode",
5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors))
5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);
5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(unicode, pbuf.len);
5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielascii_decode(PyObject *self,
5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             PyObject *args)
5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode;
5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|z:ascii_decode",
5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors))
5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);
5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(unicode, pbuf.len);
5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcharmap_decode(PyObject *self,
5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               PyObject *args)
5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *unicode;
5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *mapping = NULL;
5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zO:charmap_decode",
5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &mapping))
5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (mapping == Py_None)
5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        mapping = NULL;
5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);
5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(unicode, pbuf.len);
5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielmbcs_decode(PyObject *self,
5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_buffer pbuf;
5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int final = 0;
5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t consumed;
5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *decoded = NULL;
5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s*|zi:mbcs_decode",
5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &pbuf, &errors, &final))
5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    consumed = pbuf.len;
5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,
5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                           final ? NULL : &consumed);
5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyBuffer_Release(&pbuf);
5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (decoded == NULL)
5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(decoded, consumed);
5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* MS_WINDOWS */
5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Encoder ------------------------------------------------------------ */
6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
6027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielreadbuffer_encode(PyObject *self,
6037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                  PyObject *args)
6047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *data;
6067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t size;
6077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
6087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode",
6107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &data, &size, &errors))
6117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(PyString_FromStringAndSize(data, size),
6147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       size);
6157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
6167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
6187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcharbuffer_encode(PyObject *self,
6197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                  PyObject *args)
6207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *data;
6227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t size;
6237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
6247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode",
6267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &data, &size, &errors))
6277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return codec_tuple(PyString_FromStringAndSize(data, size),
6307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       size);
6317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
6327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
6347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielunicode_internal_encode(PyObject *self,
6357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        PyObject *args)
6367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *obj;
6387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
6397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *data;
6407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_ssize_t size;
6417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
6437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &obj, &errors))
6447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (PyUnicode_Check(obj)) {
6477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        data = PyUnicode_AS_DATA(obj);
6487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        size = PyUnicode_GET_DATA_SIZE(obj);
6497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return codec_tuple(PyString_FromStringAndSize(data, size),
6507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                           PyUnicode_GET_SIZE(obj));
6517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
6527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else {
6537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
6547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return NULL;
6557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return codec_tuple(PyString_FromStringAndSize(data, size),
6567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                           size);
6577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
6587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
6597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
6617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_7_encode(PyObject *self,
6627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
6637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
6657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
6667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
6687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
6697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
6727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
6737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
6757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         PyUnicode_GET_SIZE(str),
6767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         0,
6777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         0,
6787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         errors),
6797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
6807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
6817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
6827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
6837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
6857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_8_encode(PyObject *self,
6867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
6877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
6897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
6907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
6927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
6937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
6967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
6977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
6987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(str),
6997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         PyUnicode_GET_SIZE(str),
7007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                         errors),
7017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
7027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
7037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
7047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
7057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This version provides access to the byteorder parameter of the
7077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   builtin UTF-16 codecs as optional third argument. It defaults to 0
7087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   which means: use the native byte order and prepend the data with a
7097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   BOM mark.
7107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
7127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
7147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_encode(PyObject *self,
7157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
7167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
7177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
7187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
7197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
7207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
7227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors, &byteorder))
7237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
7267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
7277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
7297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          PyUnicode_GET_SIZE(str),
7307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          errors,
7317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          byteorder),
7327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
7337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
7347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
7357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
7367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
7387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_le_encode(PyObject *self,
7397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
7407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
7417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
7427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
7437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
7457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
7467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
7497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
7507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
7527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             PyUnicode_GET_SIZE(str),
7537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             errors,
7547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             -1),
7557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       PyUnicode_GET_SIZE(str));
7567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
7577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
7587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
7597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
7617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_16_be_encode(PyObject *self,
7627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
7637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
7647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
7657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
7667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
7687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
7697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
7727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
7737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
7747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
7757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          PyUnicode_GET_SIZE(str),
7767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          errors,
7777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          +1),
7787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
7797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
7807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
7817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
7827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This version provides access to the byteorder parameter of the
7847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   builtin UTF-32 codecs as optional third argument. It defaults to 0
7857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   which means: use the native byte order and prepend the data with a
7867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   BOM mark.
7877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
7897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
7917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_encode(PyObject *self,
7927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
7937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
7947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
7957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
7967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int byteorder = 0;
7977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
7997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors, &byteorder))
8007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
8037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
8047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
8067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          PyUnicode_GET_SIZE(str),
8077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          errors,
8087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          byteorder),
8097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
8107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
8117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
8127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
8137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
8157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_le_encode(PyObject *self,
8167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
8177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
8187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
8197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
8207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
8227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
8237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
8267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
8277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
8297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             PyUnicode_GET_SIZE(str),
8307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             errors,
8317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                             -1),
8327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       PyUnicode_GET_SIZE(str));
8337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
8347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
8357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
8367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
8387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielutf_32_be_encode(PyObject *self,
8397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 PyObject *args)
8407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
8417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
8427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
8437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
8457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
8467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
8497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
8507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
8527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          PyUnicode_GET_SIZE(str),
8537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          errors,
8547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                          +1),
8557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
8567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
8577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
8587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
8597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
8617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielunicode_escape_encode(PyObject *self,
8627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                     PyObject *args)
8637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
8647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
8657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
8667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
8687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
8697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
8727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
8737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
8757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                                  PyUnicode_GET_SIZE(str)),
8767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
8777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
8787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
8797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
8807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
8827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielraw_unicode_escape_encode(PyObject *self,
8837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        PyObject *args)
8847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
8857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
8867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
8877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
8897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
8907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
8937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
8947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
8957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
8967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_AS_UNICODE(str),
8977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_GET_SIZE(str)),
8987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
8997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
9007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
9017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
9047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniellatin_1_encode(PyObject *self,
9057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               PyObject *args)
9067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
9087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
9097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
9117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
9127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
9157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
9167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeLatin1(
9187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_AS_UNICODE(str),
9197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_GET_SIZE(str),
9207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               errors),
9217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
9227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
9237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
9247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
9277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielascii_encode(PyObject *self,
9287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             PyObject *args)
9297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
9317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
9327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
9347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
9357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
9387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
9397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeASCII(
9417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_AS_UNICODE(str),
9427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_GET_SIZE(str),
9437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               errors),
9447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
9457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
9467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
9477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
9507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcharmap_encode(PyObject *self,
9517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             PyObject *args)
9527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
9547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
9557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *mapping = NULL;
9567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
9587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors, &mapping))
9597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (mapping == Py_None)
9617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        mapping = NULL;
9627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
9647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
9657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeCharmap(
9677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_AS_UNICODE(str),
9687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_GET_SIZE(str),
9697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               mapping,
9707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               errors),
9717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
9727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
9737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
9747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject*
9777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcharmap_build(PyObject *self, PyObject *args)
9787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *map;
9807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
9817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PyUnicode_BuildEncodingMap(map);
9837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
9867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *
9887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielmbcs_encode(PyObject *self,
9897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            PyObject *args)
9907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *str, *v;
9927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *errors = NULL;
9937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
9957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &str, &errors))
9967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
9977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    str = PyUnicode_FromObject(str);
9997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (str == NULL)
10007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
10017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    v = codec_tuple(PyUnicode_EncodeMBCS(
10027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_AS_UNICODE(str),
10037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               PyUnicode_GET_SIZE(str),
10047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                               errors),
10057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    PyUnicode_GET_SIZE(str));
10067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_DECREF(str);
10077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return v;
10087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
10097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* MS_WINDOWS */
10117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* Py_USING_UNICODE */
10127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Error handler registry --------------------------------------------- */
10147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(register_error__doc__,
10167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"register_error(errors, handler)\n\
10177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
10187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielRegister the specified error handler under the name\n\
10197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielerrors. handler must be a callable object, that\n\
10207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielwill be called with an exception instance containing\n\
10217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielinformation about the location of the encoding/decoding\n\
10227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielerror and must return a (replacement, new position) tuple.");
10237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *register_error(PyObject *self, PyObject *args)
10257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
10267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *name;
10277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    PyObject *handler;
10287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "sO:register_error",
10307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &name, &handler))
10317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
10327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (PyCodec_RegisterError(name, handler))
10337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
10347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_RETURN_NONE;
10357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
10367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(lookup_error__doc__,
10387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"lookup_error(errors) -> handler\n\
10397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel\n\
10407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielReturn the error handler for the specified error handling name\n\
10417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielor raise a LookupError, if no handler exists under this name.");
10427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *lookup_error(PyObject *self, PyObject *args)
10447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
10457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *name;
10467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!PyArg_ParseTuple(args, "s:lookup_error",
10487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          &name))
10497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
10507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PyCodec_LookupError(name);
10517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
10527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* --- Module API --------------------------------------------------------- */
10547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
10557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyMethodDef _codecs_functions[] = {
10567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"register",                codec_register,                 METH_O,
10577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        register__doc__},
10587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"lookup",                  codec_lookup,                   METH_VARARGS,
10597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        lookup__doc__},
10607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"encode",                  codec_encode,                   METH_VARARGS,
10617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        encode__doc__},
10627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"decode",                  codec_decode,                   METH_VARARGS,
10637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        decode__doc__},
10647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"escape_encode",           escape_encode,                  METH_VARARGS},
10657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"escape_decode",           escape_decode,                  METH_VARARGS},
10667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Py_USING_UNICODE
10677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_8_encode",            utf_8_encode,                   METH_VARARGS},
10687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_8_decode",            utf_8_decode,                   METH_VARARGS},
10697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_7_encode",            utf_7_encode,                   METH_VARARGS},
10707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_7_decode",            utf_7_decode,                   METH_VARARGS},
10717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_encode",           utf_16_encode,                  METH_VARARGS},
10727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_le_encode",        utf_16_le_encode,               METH_VARARGS},
10737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_be_encode",        utf_16_be_encode,               METH_VARARGS},
10747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_decode",           utf_16_decode,                  METH_VARARGS},
10757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_le_decode",        utf_16_le_decode,               METH_VARARGS},
10767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_be_decode",        utf_16_be_decode,               METH_VARARGS},
10777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_16_ex_decode",        utf_16_ex_decode,               METH_VARARGS},
10787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_encode",           utf_32_encode,                  METH_VARARGS},
10797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_le_encode",        utf_32_le_encode,               METH_VARARGS},
10807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_be_encode",        utf_32_be_encode,               METH_VARARGS},
10817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_decode",           utf_32_decode,                  METH_VARARGS},
10827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_le_decode",        utf_32_le_decode,               METH_VARARGS},
10837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_be_decode",        utf_32_be_decode,               METH_VARARGS},
10847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"utf_32_ex_decode",        utf_32_ex_decode,               METH_VARARGS},
10857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"unicode_escape_encode",   unicode_escape_encode,          METH_VARARGS},
10867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"unicode_escape_decode",   unicode_escape_decode,          METH_VARARGS},
10877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"unicode_internal_encode", unicode_internal_encode,        METH_VARARGS},
10887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"unicode_internal_decode", unicode_internal_decode,        METH_VARARGS},
10897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"raw_unicode_escape_encode", raw_unicode_escape_encode,    METH_VARARGS},
10907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"raw_unicode_escape_decode", raw_unicode_escape_decode,    METH_VARARGS},
10917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"latin_1_encode",          latin_1_encode,                 METH_VARARGS},
10927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"latin_1_decode",          latin_1_decode,                 METH_VARARGS},
10937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"ascii_encode",            ascii_encode,                   METH_VARARGS},
10947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"ascii_decode",            ascii_decode,                   METH_VARARGS},
10957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"charmap_encode",          charmap_encode,                 METH_VARARGS},
10967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"charmap_decode",          charmap_decode,                 METH_VARARGS},
10977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"charmap_build",           charmap_build,                  METH_VARARGS},
10987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"readbuffer_encode",       readbuffer_encode,              METH_VARARGS},
10997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"charbuffer_encode",       charbuffer_encode,              METH_VARARGS},
11007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
11017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"mbcs_encode",             mbcs_encode,                    METH_VARARGS},
11027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"mbcs_decode",             mbcs_decode,                    METH_VARARGS},
11037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
11047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* Py_USING_UNICODE */
11057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"register_error",          register_error,                 METH_VARARGS,
11067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        register_error__doc__},
11077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {"lookup_error",            lookup_error,                   METH_VARARGS,
11087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        lookup_error__doc__},
11097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {NULL, NULL}                /* sentinel */
11107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel};
11117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
11127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyMODINIT_FUNC
11137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielinit_codecs(void)
11147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
11157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Py_InitModule("_codecs", _codecs_functions);
11167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1117