summaryrefslogtreecommitdiffstats
path: root/Python/coreconfig.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-05-02 15:28:57 (GMT)
committerGitHub <noreply@github.com>2019-05-02 15:28:57 (GMT)
commite251095a3f4778102f554cecffcfd837f4d1db6c (patch)
tree050ebaae241e689f989f42cf3d8bbe23d6f9258b /Python/coreconfig.c
parentc4e78b116f9a4299f3b3bfbbd18ef49782bb1143 (diff)
downloadcpython-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.c72
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();
}