diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-05-02 15:28:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-02 15:28:57 (GMT) |
commit | e251095a3f4778102f554cecffcfd837f4d1db6c (patch) | |
tree | 050ebaae241e689f989f42cf3d8bbe23d6f9258b /Python/coreconfig.c | |
parent | c4e78b116f9a4299f3b3bfbbd18ef49782bb1143 (diff) | |
download | cpython-e251095a3f4778102f554cecffcfd837f4d1db6c.zip cpython-e251095a3f4778102f554cecffcfd837f4d1db6c.tar.gz cpython-e251095a3f4778102f554cecffcfd837f4d1db6c.tar.bz2 |
bpo-36775: Add _Py_FORCE_UTF8_FS_ENCODING macro (GH-13056)
Add _Py_FORCE_UTF8_LOCALE and _Py_FORCE_UTF8_FS_ENCODING macros to
avoid factorize "#if defined(__ANDROID__) || defined(__VXWORKS__)"
and "#if defined(__APPLE__)".
Cleanup also config_init_fs_encoding().
Diffstat (limited to 'Python/coreconfig.c')
-rw-r--r-- | Python/coreconfig.c | 72 |
1 files changed, 27 insertions, 45 deletions
diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 1cb4b52..c40c1f8 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1313,7 +1313,7 @@ config_get_locale_encoding(char **locale_encoding) #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); -#elif defined(__ANDROID__) || defined(__VXWORKS__) +#elif defined(_Py_FORCE_UTF8_LOCALE) const char *encoding = "UTF-8"; #else const char *encoding = nl_langinfo(CODESET); @@ -1450,66 +1450,40 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) { _PyInitError err; -#ifdef MS_WINDOWS - if (preconfig->legacy_windows_fs_encoding) { - /* Legacy Windows filesystem encoding: mbcs/replace */ - if (config->filesystem_encoding == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "mbcs"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - if (config->filesystem_errors == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "replace"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - } - - /* Windows defaults to utf-8/surrogatepass (PEP 529). - - Note: UTF-8 Mode takes the same code path and the Legacy Windows FS - encoding has the priortiy over UTF-8 Mode. */ if (config->filesystem_encoding == NULL) { +#ifdef _Py_FORCE_UTF8_FS_ENCODING err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } +#else - if (config->filesystem_errors == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "surrogatepass"); - if (_Py_INIT_FAILED(err)) { - return err; +#ifdef MS_WINDOWS + if (preconfig->legacy_windows_fs_encoding) { + /* Legacy Windows filesystem encoding: mbcs/replace */ + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "mbcs"); } - } -#else - if (config->filesystem_encoding == NULL) { + else +#endif if (preconfig->utf8_mode) { - /* UTF-8 Mode use: utf-8/surrogateescape */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); - /* errors defaults to surrogateescape above */ } +#ifndef MS_WINDOWS else if (_Py_GetForceASCII()) { err = _PyCoreConfig_SetString(&config->filesystem_encoding, "ascii"); } +#endif else { - /* macOS and Android use UTF-8, - other platforms use the locale encoding. */ -#if defined(__APPLE__) || defined(__ANDROID__) +#ifdef MS_WINDOWS + /* Windows defaults to utf-8/surrogatepass (PEP 529). */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); #else err = config_get_locale_encoding(&config->filesystem_encoding); #endif } +#endif /* !_Py_FORCE_UTF8_FS_ENCODING */ if (_Py_INIT_FAILED(err)) { return err; @@ -1517,14 +1491,22 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) } if (config->filesystem_errors == NULL) { - /* by default, use the "surrogateescape" error handler */ - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "surrogateescape"); + const char *errors; +#ifdef MS_WINDOWS + if (preconfig->legacy_windows_fs_encoding) { + errors = "replace"; + } + else { + errors = "surrogatepass"; + } +#else + errors = "surrogateescape"; +#endif + err = _PyCoreConfig_SetString(&config->filesystem_errors, errors); if (_Py_INIT_FAILED(err)) { return err; } } -#endif return _Py_INIT_OK(); } |