From 7411b7ffa76cdfb2f5231734d2ce320770a38dad Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 19 Oct 2020 06:46:07 -0600 Subject: [PATCH] rktio: detect and use xlocale --- racket/src/rktio/configure | 56 ++++++++++++++++++++++++++++++ racket/src/rktio/configure.ac | 32 +++++++++++++++++ racket/src/rktio/rktio_config.h.in | 3 ++ racket/src/rktio/rktio_convert.c | 16 +++++---- racket/src/rktio/rktio_private.h | 4 ++- 5 files changed, 103 insertions(+), 8 deletions(-) diff --git a/racket/src/rktio/configure b/racket/src/rktio/configure index 5db973338b..9e718f57fc 100755 --- a/racket/src/rktio/configure +++ b/racket/src/rktio/configure @@ -4188,6 +4188,62 @@ $as_echo "#define HAVE_DIRENT_NAMLEN 1" >>confdefs.h fi + msg="for xlocale.h" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $msg" >&5 +$as_echo_n "checking $msg... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + # include + int main() { + return 0; + } +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define RKTIO_USE_XLOCALE_HEADER 1" >>confdefs.h + + xlocalehon=yes +else + xlocalehon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xlocalehon" >&5 +$as_echo "$xlocalehon" >&6; } + +SAVE_CFLAGS="$CFLAGS" +if test "${xlocalehon}" = "yes" ; then + CFLAGS="$CFLAGS -DRKTIO_USE_XLOCALE_HEADER" +fi + msg="for xlocale functions" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $msg" >&5 +$as_echo_n "checking $msg... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef RKTIO_USE_XLOCALE_HEADER + # include + #endif + #include + int main() { + locale_t l = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK, "C", NULL); + freelocale(l); + return 0; + } +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define RKTIO_USE_XLOCALE 1" >>confdefs.h + + xlocaleon=yes +else + xlocaleon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xlocaleon" >&5 +$as_echo "$xlocaleon" >&6; } +CFLAGS="$SAVE_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 $as_echo_n "checking for getaddrinfo... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext diff --git a/racket/src/rktio/configure.ac b/racket/src/rktio/configure.ac index 288f11036a..bee78e0361 100644 --- a/racket/src/rktio/configure.ac +++ b/racket/src/rktio/configure.ac @@ -158,6 +158,38 @@ AC_CHECK_MEMBER([struct dirent.d_namlen], [AC_DEFINE(HAVE_DIRENT_NAMLEN, 1, [struct dirent has field namlen])],, [#include ]) +[ msg="for xlocale.h" ] +AC_MSG_CHECKING($msg) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + # include + int main() { + return 0; + }])], + AC_DEFINE(RKTIO_USE_XLOCALE_HEADER,1,[Use xlocale.h]) + xlocalehon=yes, xlocalehon=no) +AC_MSG_RESULT($xlocalehon) + +SAVE_CFLAGS="$CFLAGS" +if test "${xlocalehon}" = "yes" ; then + CFLAGS="$CFLAGS -DRKTIO_USE_XLOCALE_HEADER" +fi +[ msg="for xlocale functions" ] +AC_MSG_CHECKING($msg) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #ifdef RKTIO_USE_XLOCALE_HEADER + # include + #endif + #include + int main() { + locale_t l = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK, "C", NULL); + freelocale(l); + return 0; + }])], + AC_DEFINE(RKTIO_USE_XLOCALE,1,[Use xlocale]) + xlocaleon=yes, xlocaleon=no) +AC_MSG_RESULT($xlocaleon) +CFLAGS="$SAVE_CFLAGS" + AC_MSG_CHECKING([for getaddrinfo]) AC_TRY_LINK([#include #include diff --git a/racket/src/rktio/rktio_config.h.in b/racket/src/rktio/rktio_config.h.in index 140ddc0036..7b3f3f5652 100644 --- a/racket/src/rktio/rktio_config.h.in +++ b/racket/src/rktio/rktio_config.h.in @@ -65,3 +65,6 @@ typedef unsigned long long rktio_uint64_t; #undef HAVE_DIRENT_NAMLEN #undef HAVE_DIRENT_NAMELEN +/* In case xlocale is not available: */ +#undef RKTIO_USE_XLOCALE +#undef RKTIO_USE_XLOCALE_HEADER diff --git a/racket/src/rktio/rktio_convert.c b/racket/src/rktio/rktio_convert.c index 5dbb817579..1bc535fa54 100644 --- a/racket/src/rktio/rktio_convert.c +++ b/racket/src/rktio/rktio_convert.c @@ -595,14 +595,12 @@ char *rktio_locale_recase(rktio_t *rktio, wchar_t *wc, *ws, wcbuf[RKTIO_WC_BUF_SIZE], cwc; const char *s; unsigned int j; -# ifdef RKTIO_USE_XLOCALE -# define mz_mbsnrtowcs(t, f, fl, tl, s) mbsrtowcs_l(t, f, tl, s, rktio->locale) -# define mz_wcsnrtombs(t, f, fl, tl, s) wcsrtombs_l(t, f, tl, s, rktio->locale) -# else - /* The "n" versions are apparently not too standard: */ -# define mz_mbsnrtowcs(t, f, fl, tl, s) mbsrtowcs(t, f, tl, s) -# define mz_wcsnrtombs(t, f, fl, tl, s) wcsrtombs(t, f, tl, s) +# if defined(RKTIO_USE_XLOCALE) + locale_t old_l = uselocale(rktio->locale); # endif + /* The "n" versions are apparently not too standard: */ +# define mz_mbsnrtowcs(t, f, fl, tl, s) mbsrtowcs(t, f, tl, s) +# define mz_wcsnrtombs(t, f, fl, tl, s) wcsrtombs(t, f, tl, s) /* ----- to wide char ---- */ @@ -670,6 +668,10 @@ char *rktio_locale_recase(rktio_t *rktio, if (wc != wcbuf) free(wc); +# if defined(RKTIO_USE_XLOCALE) + (void)uselocale(old_l); +# endif + return out; #endif } diff --git a/racket/src/rktio/rktio_private.h b/racket/src/rktio/rktio_private.h index 23a97f33f6..7447f75fa7 100644 --- a/racket/src/rktio/rktio_private.h +++ b/racket/src/rktio/rktio_private.h @@ -12,7 +12,9 @@ # include #endif #ifdef RKTIO_USE_XLOCALE -# include +# ifdef RKTIO_USE_XLOCALE_HEADER +# include +# endif #endif #if defined(RKTIO_SYSTEM_UNIX) && !defined(RKTIO_STATIC_FDSET_SIZE)