diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-08-29 20:21:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-29 20:21:32 (GMT) |
commit | 3d4226a832cabc630402589cc671cc4035d504e5 (patch) | |
tree | a1c5b1c51cbbca3aedd52593c979a5c15d72dd52 /Include | |
parent | c5989cd87659acbfd4d19dc00dbe99c3a0fc9bd2 (diff) | |
download | cpython-3d4226a832cabc630402589cc671cc4035d504e5.zip cpython-3d4226a832cabc630402589cc671cc4035d504e5.tar.gz cpython-3d4226a832cabc630402589cc671cc4035d504e5.tar.bz2 |
bpo-34523: Support surrogatepass in locale codecs (GH-8995)
Add support for the "surrogatepass" error handler in
PyUnicode_DecodeFSDefault() and PyUnicode_EncodeFSDefault()
for the UTF-8 encoding.
Changes:
* _Py_DecodeUTF8Ex() and _Py_EncodeUTF8Ex() now support the
surrogatepass error handler (_Py_ERROR_SURROGATEPASS).
* _Py_DecodeLocaleEx() and _Py_EncodeLocaleEx() now use
the _Py_error_handler enum instead of "int surrogateescape" to pass
the error handler. These functions now return -3 if the error
handler is unknown.
* Add unit tests on _Py_DecodeLocaleEx() and _Py_EncodeLocaleEx()
in test_codecs.
* Rename get_error_handler() to _Py_GetErrorHandler() and expose it
as a private function.
* _freeze_importlib doesn't need config.filesystem_errors="strict"
workaround anymore.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/fileutils.h | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/Include/fileutils.h b/Include/fileutils.h index 3708784..f0a8e2c 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -5,6 +5,24 @@ extern "C" { #endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 +typedef enum { + _Py_ERROR_UNKNOWN=0, + _Py_ERROR_STRICT, + _Py_ERROR_SURROGATEESCAPE, + _Py_ERROR_REPLACE, + _Py_ERROR_IGNORE, + _Py_ERROR_BACKSLASHREPLACE, + _Py_ERROR_SURROGATEPASS, + _Py_ERROR_XMLCHARREFREPLACE, + _Py_ERROR_OTHER +} _Py_error_handler; + +PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); +#endif + + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 PyAPI_FUNC(wchar_t *) Py_DecodeLocale( const char *arg, @@ -26,7 +44,7 @@ PyAPI_FUNC(int) _Py_DecodeUTF8Ex( wchar_t **wstr, size_t *wlen, const char **reason, - int surrogateescape); + _Py_error_handler errors); PyAPI_FUNC(int) _Py_EncodeUTF8Ex( const wchar_t *text, @@ -34,19 +52,22 @@ PyAPI_FUNC(int) _Py_EncodeUTF8Ex( size_t *error_pos, const char **reason, int raw_malloc, - int surrogateescape); + _Py_error_handler errors); PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( const char *arg, Py_ssize_t arglen); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 PyAPI_FUNC(int) _Py_DecodeLocaleEx( const char *arg, wchar_t **wstr, size_t *wlen, const char **reason, int current_locale, - int surrogateescape); + _Py_error_handler errors); PyAPI_FUNC(int) _Py_EncodeLocaleEx( const wchar_t *text, @@ -54,7 +75,7 @@ PyAPI_FUNC(int) _Py_EncodeLocaleEx( size_t *error_pos, const char **reason, int current_locale, - int surrogateescape); + _Py_error_handler errors); #endif #ifndef Py_LIMITED_API |