From dcaa20b4119adb900803d8716526525ba172e451 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 29 Oct 2020 15:49:19 -0600 Subject: [PATCH] initialize default locale Changes to use xlocale fixed problems with places and locale settings, but it caused the initial process-wide locale to stay with the C locale, which is bad for things like libedit. To get the good part of the old behavior bback, set the process-wide locale to "" on startup. --- racket/src/bc/cmdline.inc | 2 ++ racket/src/bc/include/scheme.h | 2 ++ racket/src/bc/src/string.c | 5 +++++ racket/src/cs/schemified/io.scm | 13 ++++++++----- racket/src/io/locale/parameter.rkt | 1 + racket/src/rktio/rktio.def | 1 + racket/src/rktio/rktio.h | 3 +++ racket/src/rktio/rktio.inc | 1 + racket/src/rktio/rktio.rktl | 5 +++++ racket/src/rktio/rktio_convert.c | 5 +++++ 10 files changed, 33 insertions(+), 5 deletions(-) diff --git a/racket/src/bc/cmdline.inc b/racket/src/bc/cmdline.inc index 4d89530598..b83ab54c94 100644 --- a/racket/src/bc/cmdline.inc +++ b/racket/src/bc/cmdline.inc @@ -726,6 +726,8 @@ static int run_from_cmd_line(int argc, char *_argv[], FinishArgs *fa; FinishArgsAtoms *fa_a; + scheme_set_default_locale(); + prog = argv[0]; argv++; --argc; diff --git a/racket/src/bc/include/scheme.h b/racket/src/bc/include/scheme.h index 7c8f055c5b..d1088b037b 100644 --- a/racket/src/bc/include/scheme.h +++ b/racket/src/bc/include/scheme.h @@ -2002,6 +2002,8 @@ MZ_EXTERN Scheme_Object *scheme_param_config2(char *name, Scheme_Object *pos, int isbool); MZ_EXTERN Scheme_Object *scheme_register_parameter(Scheme_Prim *function, char *name, int which); +MZ_EXTERN void scheme_set_default_locale(void); + #endif /* SCHEME_DIRECT_EMBEDDED */ /*========================================================================*/ diff --git a/racket/src/bc/src/string.c b/racket/src/bc/src/string.c index af6da101bf..7969e28a86 100644 --- a/racket/src/bc/src/string.c +++ b/racket/src/bc/src/string.c @@ -3448,6 +3448,11 @@ void scheme_pop_c_numeric_locale(char *prev) rktio_pop_c_numeric_locale(scheme_rktio, prev); } +void scheme_set_default_locale(void) +{ + rktio_set_default_locale(""); +} + static int find_special_casing(int ch) { /* Binary search */ diff --git a/racket/src/cs/schemified/io.scm b/racket/src/cs/schemified/io.scm index f009a81103..775e1121bf 100644 --- a/racket/src/cs/schemified/io.scm +++ b/racket/src/cs/schemified/io.scm @@ -3374,6 +3374,8 @@ (define rktio_strcoll_utf16 (hash-ref rktio-table 'rktio_strcoll_utf16)) (define rktio_locale_encoding (hash-ref rktio-table 'rktio_locale_encoding)) (define rktio_set_locale (hash-ref rktio-table 'rktio_set_locale)) +(define rktio_set_default_locale + (hash-ref rktio-table 'rktio_set_default_locale)) (define rktio_push_c_numeric_locale (hash-ref rktio-table 'rktio_push_c_numeric_locale)) (define rktio_pop_c_numeric_locale @@ -15634,6 +15636,7 @@ rktio_set_locale (unsafe-place-local-ref cell.1) (1/string->bytes/utf-8 (unsafe-place-local-ref cell.1$8)))))))) +(define effect_2455 (begin (void (|#%app| rktio_set_default_locale #vu8())) (void))) (define effect_2454 (begin (void (sync-locale!)) (void))) (define locale-encoding-is-utf-8? (lambda () @@ -35992,11 +35995,11 @@ 'subprocess "(or/c (and/c output-port? file-stream-port?) #f 'stdout)" stderr_0)) - (let ((lr3723 unsafe-undefined) + (let ((lr3726 unsafe-undefined) (group_0 unsafe-undefined) (command_0 unsafe-undefined) (exact/args_0 unsafe-undefined)) - (set! lr3723 + (set! lr3726 (call-with-values (lambda () (if (path-string? group/command_0) @@ -36051,9 +36054,9 @@ ((group_1 command_1 exact/args_1) (vector group_1 command_1 exact/args_1)) (args (raise-binding-result-arity-error 3 args))))) - (set! group_0 (unsafe-vector*-ref lr3723 0)) - (set! command_0 (unsafe-vector*-ref lr3723 1)) - (set! exact/args_0 (unsafe-vector*-ref lr3723 2)) + (set! group_0 (unsafe-vector*-ref lr3726 0)) + (set! command_0 (unsafe-vector*-ref lr3726 1)) + (set! exact/args_0 (unsafe-vector*-ref lr3726 2)) (call-with-values (lambda () (if (if (pair? exact/args_0) diff --git a/racket/src/io/locale/parameter.rkt b/racket/src/io/locale/parameter.rkt index 6bc0f2006d..dc4db31a70 100644 --- a/racket/src/io/locale/parameter.rkt +++ b/racket/src/io/locale/parameter.rkt @@ -34,6 +34,7 @@ (set! installed-locale (current-locale)) (rktio_set_locale rktio (string->bytes/utf-8 installed-locale)))) +(void (rktio_set_default_locale #"")) (void (sync-locale!)) (define (locale-encoding-is-utf-8?) diff --git a/racket/src/rktio/rktio.def b/racket/src/rktio/rktio.def index 02ff57127a..d35e130eb9 100644 --- a/racket/src/rktio/rktio.def +++ b/racket/src/rktio/rktio.def @@ -187,6 +187,7 @@ rktio_locale_strcoll rktio_strcoll_utf16 rktio_locale_encoding rktio_set_locale +rktio_set_default_locale rktio_push_c_numeric_locale rktio_pop_c_numeric_locale rktio_system_language_country diff --git a/racket/src/rktio/rktio.h b/racket/src/rktio/rktio.h index c06d529646..41d7cf04e8 100644 --- a/racket/src/rktio/rktio.h +++ b/racket/src/rktio/rktio.h @@ -1203,6 +1203,9 @@ RKTIO_EXTERN void rktio_set_locale(rktio_t *rktio, rktio_const_string_t name); string corresponds to the OS's native locale, and a NULL string pointer corresponds to the C locale. */ +RKTIO_EXTERN void rktio_set_default_locale(rktio_const_string_t name); +/* Similar to rktio_set_locale(), but sets the locale process-wide. */ + RKTIO_EXTERN_NOERR void *rktio_push_c_numeric_locale(rktio_t *rktio); RKTIO_EXTERN void rktio_pop_c_numeric_locale(rktio_t *rktio, void *prev); /* Use this pair of functions to temporarily switch the locale to the diff --git a/racket/src/rktio/rktio.inc b/racket/src/rktio/rktio.inc index c836caa9b1..2ae62df01c 100644 --- a/racket/src/rktio/rktio.inc +++ b/racket/src/rktio/rktio.inc @@ -187,6 +187,7 @@ Sforeign_symbol("rktio_locale_strcoll", (void *)rktio_locale_strcoll); Sforeign_symbol("rktio_strcoll_utf16", (void *)rktio_strcoll_utf16); Sforeign_symbol("rktio_locale_encoding", (void *)rktio_locale_encoding); Sforeign_symbol("rktio_set_locale", (void *)rktio_set_locale); +Sforeign_symbol("rktio_set_default_locale", (void *)rktio_set_default_locale); Sforeign_symbol("rktio_push_c_numeric_locale", (void *)rktio_push_c_numeric_locale); Sforeign_symbol("rktio_pop_c_numeric_locale", (void *)rktio_pop_c_numeric_locale); Sforeign_symbol("rktio_system_language_country", (void *)rktio_system_language_country); diff --git a/racket/src/rktio/rktio.rktl b/racket/src/rktio/rktio.rktl index 53f40d4393..8d1ab2f152 100644 --- a/racket/src/rktio/rktio.rktl +++ b/racket/src/rktio/rktio.rktl @@ -1336,6 +1336,11 @@ void rktio_set_locale (((ref rktio_t) rktio) (rktio_const_string_t name))) +(define-function + () + void + rktio_set_default_locale + ((rktio_const_string_t name))) (define-function () (ref void) diff --git a/racket/src/rktio/rktio_convert.c b/racket/src/rktio/rktio_convert.c index 019dbb7dfa..805e107ad0 100644 --- a/racket/src/rktio/rktio_convert.c +++ b/racket/src/rktio/rktio_convert.c @@ -266,6 +266,11 @@ void rktio_set_locale(rktio_t *rktio, const char *name) #endif } +void rktio_set_default_locale(const char *name) +{ + setlocale(LC_ALL, name); +} + void *rktio_push_c_numeric_locale(rktio_t *rktio) { #ifdef RKTIO_USE_XLOCALE