/* ------------------------------------------------------------------------ _codecs -- Provides access to the codec registry and the builtin codecs. This module should never be imported directly. The standard library module "codecs" wraps this builtin module for use within Python. The codec registry is accessible via: register(search_function) -> None lookup(encoding) -> CodecInfo object The builtin Unicode codecs use the following interface: <encoding>_encode(Unicode_object[,errors='strict']) -> (string object, bytes consumed) <encoding>_decode(char_buffer_obj[,errors='strict']) -> (Unicode object, bytes consumed) These <encoding>s are available: utf_8, unicode_escape, raw_unicode_escape, latin_1, ascii (7-bit), mbcs (on win32). Written by Marc-Andre Lemburg ([email protected]). Copyright (c) Corporation for National Research Initiatives. ------------------------------------------------------------------------ */ #include "Python.h" #include "pycore_codecs.h" // _PyCodec_Lookup() #ifdef MS_WINDOWS #include <windows.h> #endif /*[clinic input] module _codecs [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e1390e3da3cb9deb]*/ #include "pycore_runtime.h" #include "clinic/_codecsmodule.c.h" /* --- Registry ----------------------------------------------------------- */ /*[clinic input] _codecs.register search_function: object / Register a codec search function. Search functions are expected to take one argument, the encoding name in all lower case letters, and either return None, or a tuple of functions (encoder, decoder, stream_reader, stream_writer) (or a CodecInfo object). [clinic start generated code]*/ static PyObject * _codecs_register(PyObject *module, PyObject *search_function) /*[clinic end generated code: output=d1bf21e99db7d6d3 input=369578467955cae4]*/ { … } /*[clinic input] _codecs.unregister search_function: object / Unregister a codec search function and clear the registry's cache. If the search function is not registered, do nothing. [clinic start generated code]*/ static PyObject * _codecs_unregister(PyObject *module, PyObject *search_function) /*[clinic end generated code: output=1f0edee9cf246399 input=dd7c004c652d345e]*/ { … } /*[clinic input] _codecs.lookup encoding: str / Looks up a codec tuple in the Python codec registry and returns a CodecInfo object. [clinic start generated code]*/ static PyObject * _codecs_lookup_impl(PyObject *module, const char *encoding) /*[clinic end generated code: output=9f0afa572080c36d input=3c572c0db3febe9c]*/ { … } /*[clinic input] _codecs.encode obj: object encoding: str(c_default="NULL") = "utf-8" errors: str(c_default="NULL") = "strict" Encodes obj using the codec registered for encoding. The default encoding is 'utf-8'. errors may be given to set a different error handling scheme. Default is 'strict' meaning that encoding errors raise a ValueError. Other possible values are 'ignore', 'replace' and 'backslashreplace' as well as any other name registered with codecs.register_error that can handle ValueErrors. [clinic start generated code]*/ static PyObject * _codecs_encode_impl(PyObject *module, PyObject *obj, const char *encoding, const char *errors) /*[clinic end generated code: output=385148eb9a067c86 input=cd5b685040ff61f0]*/ { … } /*[clinic input] _codecs.decode obj: object encoding: str(c_default="NULL") = "utf-8" errors: str(c_default="NULL") = "strict" Decodes obj using the codec registered for encoding. Default encoding is 'utf-8'. errors may be given to set a different error handling scheme. Default is 'strict' meaning that encoding errors raise a ValueError. Other possible values are 'ignore', 'replace' and 'backslashreplace' as well as any other name registered with codecs.register_error that can handle ValueErrors. [clinic start generated code]*/ static PyObject * _codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding, const char *errors) /*[clinic end generated code: output=679882417dc3a0bd input=7702c0cc2fa1add6]*/ { … } /* --- Helpers ------------------------------------------------------------ */ static PyObject *codec_tuple(PyObject *decoded, Py_ssize_t len) { … } /* --- String codecs ------------------------------------------------------ */ /*[clinic input] _codecs.escape_decode data: Py_buffer(accept={str, buffer}) errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_escape_decode_impl(PyObject *module, Py_buffer *data, const char *errors) /*[clinic end generated code: output=505200ba8056979a input=77298a561c90bd82]*/ { … } /*[clinic input] _codecs.escape_encode data: object(subclass_of='&PyBytes_Type') errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_escape_encode_impl(PyObject *module, PyObject *data, const char *errors) /*[clinic end generated code: output=4af1d477834bab34 input=8f4b144799a94245]*/ { … } /* --- Decoder ------------------------------------------------------------ */ /*[clinic input] _codecs.utf_7_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=0cd3a944a32a4089 input=dbf8c8998102dc7d]*/ { … } /*[clinic input] _codecs.utf_8_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=10f74dec8d9bb8bf input=ca06bc8a9c970e25]*/ { … } /*[clinic input] _codecs.utf_16_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=783b442abcbcc2d0 input=5b0f52071ba6cadc]*/ { … } /*[clinic input] _codecs.utf_16_le_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=899b9e6364379dcd input=115bd8c7b783d0bf]*/ { … } /*[clinic input] _codecs.utf_16_be_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=49f6465ea07669c8 input=63131422b01f9cb4]*/ { … } /* This non-standard version also provides access to the byteorder parameter of the builtin UTF-16 codec. It returns a tuple (unicode, bytesread, byteorder) with byteorder being the value in effect at the end of data. */ /*[clinic input] _codecs.utf_16_ex_decode data: Py_buffer errors: str(accept={str, NoneType}) = None byteorder: int = 0 final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int byteorder, int final) /*[clinic end generated code: output=0f385f251ecc1988 input=f368a51cf384bf4c]*/ { … } /*[clinic input] _codecs.utf_32_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=2fc961807f7b145f input=fcdf3658c5e9b5f3]*/ { … } /*[clinic input] _codecs.utf_32_le_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=ec8f46b67a94f3e6 input=12220556e885f817]*/ { … } /*[clinic input] _codecs.utf_32_be_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=ff82bae862c92c4e input=2bc669b4781598db]*/ { … } /* This non-standard version also provides access to the byteorder parameter of the builtin UTF-32 codec. It returns a tuple (unicode, bytesread, byteorder) with byteorder being the value in effect at the end of data. */ /*[clinic input] _codecs.utf_32_ex_decode data: Py_buffer errors: str(accept={str, NoneType}) = None byteorder: int = 0 final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int byteorder, int final) /*[clinic end generated code: output=6bfb177dceaf4848 input=4a2323d0013620df]*/ { … } /*[clinic input] _codecs.unicode_escape_decode data: Py_buffer(accept={str, buffer}) errors: str(accept={str, NoneType}) = None final: bool = True / [clinic start generated code]*/ static PyObject * _codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=b284f97b12c635ee input=15019f081ffe272b]*/ { … } /*[clinic input] _codecs.raw_unicode_escape_decode data: Py_buffer(accept={str, buffer}) errors: str(accept={str, NoneType}) = None final: bool = True / [clinic start generated code]*/ static PyObject * _codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=11dbd96301e2879e input=b93f823aa8c343ad]*/ { … } /*[clinic input] _codecs.latin_1_decode data: Py_buffer errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data, const char *errors) /*[clinic end generated code: output=07f3dfa3f72c7d8f input=76ca58fd6dcd08c7]*/ { … } /*[clinic input] _codecs.ascii_decode data: Py_buffer errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_ascii_decode_impl(PyObject *module, Py_buffer *data, const char *errors) /*[clinic end generated code: output=2627d72058d42429 input=e428a267a04b4481]*/ { … } /*[clinic input] _codecs.charmap_decode data: Py_buffer errors: str(accept={str, NoneType}) = None mapping: object = None / [clinic start generated code]*/ static PyObject * _codecs_charmap_decode_impl(PyObject *module, Py_buffer *data, const char *errors, PyObject *mapping) /*[clinic end generated code: output=2c335b09778cf895 input=15b69df43458eb40]*/ { … } #ifdef MS_WINDOWS /*[clinic input] _codecs.mbcs_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=39b65b8598938c4b input=f144ad1ed6d8f5a6]*/ { Py_ssize_t consumed = data->len; PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len, errors, final ? NULL : &consumed); return codec_tuple(decoded, consumed); } /*[clinic input] _codecs.oem_decode data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_oem_decode_impl(PyObject *module, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=da1617612f3fcad8 input=629bf87376d211b4]*/ { Py_ssize_t consumed = data->len; PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP, data->buf, data->len, errors, final ? NULL : &consumed); return codec_tuple(decoded, consumed); } /*[clinic input] _codecs.code_page_decode codepage: int data: Py_buffer errors: str(accept={str, NoneType}) = None final: bool = False / [clinic start generated code]*/ static PyObject * _codecs_code_page_decode_impl(PyObject *module, int codepage, Py_buffer *data, const char *errors, int final) /*[clinic end generated code: output=53008ea967da3fff input=6a32589b0658c277]*/ { Py_ssize_t consumed = data->len; PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage, data->buf, data->len, errors, final ? NULL : &consumed); return codec_tuple(decoded, consumed); } #endif /* MS_WINDOWS */ /* --- Encoder ------------------------------------------------------------ */ /*[clinic input] _codecs.readbuffer_encode data: Py_buffer(accept={str, buffer}) errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data, const char *errors) /*[clinic end generated code: output=c645ea7cdb3d6e86 input=aa10cfdf252455c5]*/ { … } /*[clinic input] _codecs.utf_7_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_7_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=0feda21ffc921bc8 input=2546dbbb3fa53114]*/ { … } /*[clinic input] _codecs.utf_8_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_8_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=02bf47332b9c796c input=a3e71ae01c3f93f3]*/ { … } /* This version provides access to the byteorder parameter of the builtin UTF-16 codecs as optional third argument. It defaults to 0 which means: use the native byte order and prepend the data with a BOM mark. */ /*[clinic input] _codecs.utf_16_encode str: unicode errors: str(accept={str, NoneType}) = None byteorder: int = 0 / [clinic start generated code]*/ static PyObject * _codecs_utf_16_encode_impl(PyObject *module, PyObject *str, const char *errors, int byteorder) /*[clinic end generated code: output=c654e13efa2e64e4 input=68cdc2eb8338555d]*/ { … } /*[clinic input] _codecs.utf_16_le_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=431b01e55f2d4995 input=83d042706eed6798]*/ { … } /*[clinic input] _codecs.utf_16_be_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=96886a6fd54dcae3 input=6f1e9e623b03071b]*/ { … } /* This version provides access to the byteorder parameter of the builtin UTF-32 codecs as optional third argument. It defaults to 0 which means: use the native byte order and prepend the data with a BOM mark. */ /*[clinic input] _codecs.utf_32_encode str: unicode errors: str(accept={str, NoneType}) = None byteorder: int = 0 / [clinic start generated code]*/ static PyObject * _codecs_utf_32_encode_impl(PyObject *module, PyObject *str, const char *errors, int byteorder) /*[clinic end generated code: output=5c760da0c09a8b83 input=8ec4c64d983bc52b]*/ { … } /*[clinic input] _codecs.utf_32_le_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=b65cd176de8e36d6 input=f0918d41de3eb1b1]*/ { … } /*[clinic input] _codecs.utf_32_be_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=1d9e71a9358709e9 input=967a99a95748b557]*/ { … } /*[clinic input] _codecs.unicode_escape_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=66271b30bc4f7a3c input=8c4de07597054e33]*/ { … } /*[clinic input] _codecs.raw_unicode_escape_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=a66a806ed01c830a input=4aa6f280d78e4574]*/ { … } /*[clinic input] _codecs.latin_1_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_latin_1_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=2c28c83a27884e08 input=ec3ef74bf85c5c5d]*/ { … } /*[clinic input] _codecs.ascii_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_ascii_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=b5e035182d33befc input=93e6e602838bd3de]*/ { … } /*[clinic input] _codecs.charmap_encode str: unicode errors: str(accept={str, NoneType}) = None mapping: object = None / [clinic start generated code]*/ static PyObject * _codecs_charmap_encode_impl(PyObject *module, PyObject *str, const char *errors, PyObject *mapping) /*[clinic end generated code: output=047476f48495a9e9 input=2a98feae73dadce8]*/ { … } /*[clinic input] _codecs.charmap_build map: unicode / [clinic start generated code]*/ static PyObject * _codecs_charmap_build_impl(PyObject *module, PyObject *map) /*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/ { … } #ifdef MS_WINDOWS /*[clinic input] _codecs.mbcs_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=76e2e170c966c080 input=2e932fc289ea5a5b]*/ { return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors), PyUnicode_GET_LENGTH(str)); } /*[clinic input] _codecs.oem_encode str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors) /*[clinic end generated code: output=65d5982c737de649 input=9eac86dc21eb14f2]*/ { return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors), PyUnicode_GET_LENGTH(str)); } /*[clinic input] _codecs.code_page_encode code_page: int str: unicode errors: str(accept={str, NoneType}) = None / [clinic start generated code]*/ static PyObject * _codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str, const char *errors) /*[clinic end generated code: output=45673f6085657a9e input=7d18a33bc8cd0f94]*/ { return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors), PyUnicode_GET_LENGTH(str)); } #endif /* MS_WINDOWS */ /* --- Error handler registry --------------------------------------------- */ /*[clinic input] _codecs.register_error errors: str handler: object / Register the specified error handler under the name errors. handler must be a callable object, that will be called with an exception instance containing information about the location of the encoding/decoding error and must return a (replacement, new position) tuple. [clinic start generated code]*/ static PyObject * _codecs_register_error_impl(PyObject *module, const char *errors, PyObject *handler) /*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/ { … } /*[clinic input] _codecs._unregister_error -> bool errors: str / Un-register the specified error handler for the error handling `errors'. Only custom error handlers can be un-registered. An exception is raised if the error handling is a built-in one (e.g., 'strict'), or if an error occurs. Otherwise, this returns True if a custom handler has been successfully un-registered, and False if no custom handler for the specified error handling exists. [clinic start generated code]*/ static int _codecs__unregister_error_impl(PyObject *module, const char *errors) /*[clinic end generated code: output=28c22be667465503 input=a63ab9e9ce1686d4]*/ { … } /*[clinic input] _codecs.lookup_error name: str / lookup_error(errors) -> handler Return the error handler for the specified error handling name or raise a LookupError, if no handler exists under this name. [clinic start generated code]*/ static PyObject * _codecs_lookup_error_impl(PyObject *module, const char *name) /*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/ { … } /* --- Module API --------------------------------------------------------- */ static PyMethodDef _codecs_functions[] = …; static PyModuleDef_Slot _codecs_slots[] = …; static struct PyModuleDef codecsmodule = …; PyMODINIT_FUNC PyInit__codecs(void) { … }