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