Jim Meyering wrote:
Conclusion: we'll have to make btowc work properly in the C locale, too.
Perhaps something like the attached (untested) patch? The basic idea is to have btowc and mbtowc use a fixed mbrtowc if the latter has the C-locale problem in question. While we're at it, btowc should invoke mbrtowc not mbtowc, as btowc is thread-safe but mbtowc is not.
diff --git a/lib/btowc.c b/lib/btowc.c index e7badf9..98d0840 100644 --- a/lib/btowc.c +++ b/lib/btowc.c @@ -30,9 +30,10 @@ btowc (int c) { char buf[1]; wchar_t wc; + mbstate_t mbs = { 0 }; buf[0] = c; - if (mbtowc (&wc, buf, 1) >= 0) + if (mbrtowc (&wc, buf, 1, &mbs) >= 0) return wc; } return WEOF; diff --git a/m4/btowc.m4 b/m4/btowc.m4 index 47e8fd8..6e941e1 100644 --- a/m4/btowc.m4 +++ b/m4/btowc.m4 @@ -1,4 +1,4 @@ -# btowc.m4 serial 10 +# btowc.m4 serial 11 dnl Copyright (C) 2008-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -13,15 +13,18 @@ AC_DEFUN([gl_FUNC_BTOWC], dnl <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([gt_LOCALE_FR]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_REQUIRE([gl_MBRTOWC_C_LOCALE]) + AC_CHECK_FUNCS_ONCE([btowc]) if test $ac_cv_func_btowc = no; then HAVE_BTOWC=0 else - - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([gt_LOCALE_FR]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - + case $gl_cv_C_locale_sans_EILSEQ in + *no) REPLACE_BTOWC=1 ;; + *) dnl Cygwin 1.7.2 btowc('\0') is WEOF, not 0. AC_CACHE_CHECK([whether btowc(0) is correct], [gl_cv_func_btowc_nul], @@ -106,7 +109,8 @@ int main () case "$gl_cv_func_btowc_eof" in *yes) ;; *) REPLACE_BTOWC=1 ;; - esac + esac ;; + esac fi ]) diff --git a/m4/mbtowc.m4 b/m4/mbtowc.m4 index e770bbf..825abd4 100644 --- a/m4/mbtowc.m4 +++ b/m4/mbtowc.m4 @@ -1,4 +1,4 @@ -# mbtowc.m4 serial 2 +# mbtowc.m4 serial 3 dnl Copyright (C) 2011-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -7,10 +7,11 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBTOWC], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) + AC_REQUIRE([gl_MBRTOWC_C_LOCALE]) - if false; then - REPLACE_MBTOWC=1 - fi + case $gl_cv_C_locale_sans_EILSEQ in + *no) REPLACE_MBTOWC=1;; + esac ]) # Prerequisites of lib/mbtowc.c. diff --git a/modules/btowc b/modules/btowc index 68f4066..ac6d474 100644 --- a/modules/btowc +++ b/modules/btowc @@ -8,7 +8,7 @@ m4/locale-fr.m4 Depends-on: wchar -mbtowc [test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1] +mbrtowc [test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1] configure.ac: gl_FUNC_BTOWC