A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/ncoghlan/cpython/commit/188e7807b6d9e49377aacbb287c074e5cabf70c5 below:

Update to latest version of PEP 538 · ncoghlan/cpython@188e780 · GitHub

@@ -15,7 +15,7 @@ wmain(int argc, wchar_t **argv)

15 15

}

16 16

#else

17 17 18 -

/* Helpers to better handle the legacy C locale

18 +

/* Access private pylifecycle helper API to better handle the legacy C locale

19 19

*

20 20

* The legacy C locale assumes ASCII as the default text encoding, which

21 21

* causes problems not only for the CPython runtime, but also other

@@ -27,107 +27,8 @@ wmain(int argc, wchar_t **argv)

27 27

* See the documentation of the PYTHONCOERCECLOCALE setting for more details.

28 28

*

29 29

*/

30 - 31 -

#ifdef PY_COERCE_C_LOCALE

32 -

/* Access private pylifecycle API to check PYTHONCOERCECLOCALE */

33 -

extern int _Py_CLocaleCoercionIsExpected(void);

34 - 35 -

static const char *_C_LOCALE_COERCION_WARNING =

36 -

"Python detected LC_CTYPE=C: %.20s coerced to %.20s (set another locale "

37 -

"or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";

38 - 39 -

typedef struct _CandidateLocale {

40 -

const char *locale_name;

41 -

int category;

42 -

} _LocaleCoercionTarget;

43 - 44 -

static _LocaleCoercionTarget _TARGET_LOCALES[] = {

45 -

{ "C.UTF-8", LC_ALL },

46 -

{ "C.utf8", LC_ALL },

47 -

{ "UTF-8", LC_CTYPE },

48 -

{ NULL, 0 }

49 -

};

50 - 51 -

void

52 -

_coerce_default_locale_settings(const _LocaleCoercionTarget *target)

53 -

{

54 -

const char *newloc = target->locale_name;

55 -

int category = target->category;

56 - 57 -

/* Reset locale back to currently configured defaults */

58 -

setlocale(LC_ALL, "");

59 - 60 -

/* Set the relevant locale environment variables */

61 -

if (category == LC_ALL) {

62 -

const char *env_vars_updated = "LC_ALL & LANG";

63 -

if (setenv("LC_ALL", newloc, 1)) {

64 -

fprintf(stderr,

65 -

"Error setting LC_ALL, skipping C locale coercion\n");

66 -

return;

67 -

}

68 -

if (setenv("LANG", newloc, 1)) {

69 -

fprintf(stderr,

70 -

"Error setting LANG during C locale coercion\n");

71 -

env_vars_updated = "LC_ALL";

72 -

}

73 -

fprintf(stderr, _C_LOCALE_COERCION_WARNING, env_vars_updated, newloc);

74 -

} else if (category == LC_CTYPE) {

75 -

if (setenv("LC_CTYPE", newloc, 1)) {

76 -

fprintf(stderr,

77 -

"Error setting LC_CTYPE, skipping C locale coercion\n");

78 -

return;

79 -

}

80 -

fprintf(stderr, _C_LOCALE_COERCION_WARNING, "LC_CTYPE", newloc);

81 -

} else {

82 -

fprintf(stderr, "Locale coercion must target LC_ALL or LC_CTYPE\n");

83 -

return;

84 -

}

85 - 86 -

/* Set standard stream encoding if PYTHONIOENCODING is not set

87 -

*

88 -

* We avoid setting PYTHONIOENCODING, as that can confuse Python 2

89 -

* instances in subprocesses that inherit the environment (as Python

90 -

* 2 has no 'surrogateescape' error handler).

91 -

*

92 -

* If PEP 540 is also implemented, this check will be replaced with

93 -

* unconditionally setting PYTHONUTF8=1

94 -

*/

95 -

const char *io_encoding = getenv("PYTHONIOENCODING");

96 -

if ((io_encoding == NULL) || (strnlen(io_encoding, 1) == 0)) {

97 -

Py_SetStandardStreamEncoding("utf-8", "surrogateescape");

98 -

}

99 - 100 -

/* Reconfigure with the overridden environment variables */

101 -

setlocale(LC_ALL, "");

102 -

}

103 - 104 -

void

105 -

_handle_legacy_c_locale(void)

106 -

{

107 -

/* We ignore the Python -E and -I flags here, as we need to sort out

108 -

* the locale settings *before* we try to do anything with the command

109 -

* line arguments. For cross-platform debugging purposes, we also need

110 -

* to give end users a way to force even scripts that are otherwise

111 -

* isolated from their environment to use the legacy ASCII-centric C

112 -

* locale.

113 -

*/

114 -

if (_Py_CLocaleCoercionIsExpected()) {

115 -

/* PYTHONCOERCECLOCALE is not set, or is not set to exactly "0" */

116 -

const _LocaleCoercionTarget *target = NULL;

117 -

for (target = _TARGET_LOCALES; target->locale_name; target++) {

118 -

const char *reconfigured_locale = setlocale(target->category,

119 -

target->locale_name);

120 -

if (reconfigured_locale != NULL) {

121 -

/* Successfully configured locale, so make it the default */

122 -

_coerce_default_locale_settings(target);

123 -

return;

124 -

}

125 -

}

126 - 127 -

}

128 -

/* No C locale warning here, as Py_Initialize will emit one later */

129 -

}

130 -

#endif

30 +

extern int _Py_LegacyLocaleDetected(void);

31 +

extern void _Py_CoerceLegacyLocale(void);

131 32 132 33

int

133 34

main(int argc, char **argv)

@@ -177,14 +78,9 @@ main(int argc, char **argv)

177 78

setlocale(LC_ALL, "");

178 79

#endif

179 80 180 -

#ifdef PY_COERCE_C_LOCALE

181 -

/* When the LC_CTYPE category still claims to be using the C locale,

182 -

assume configuration error and try for a UTF-8 based locale instead */

183 -

const char *ctype_loc = setlocale(LC_CTYPE, NULL);

184 -

if (ctype_loc != NULL && strcmp(ctype_loc, "C") == 0) {

185 -

_handle_legacy_c_locale();

81 +

if (_Py_LegacyLocaleDetected()) {

82 +

_Py_CoerceLegacyLocale();

186 83

}

187 -

#endif

188 84 189 85

/* Convert from char to wchar_t based on the locale settings */

190 86

for (i = 0; i < argc; i++) {


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4