mbsinit: Work around mingw bug.
authorBruno Haible <bruno@clisp.org>
Sun, 13 Feb 2011 17:17:22 +0000 (18:17 +0100)
committerBruno Haible <bruno@clisp.org>
Sun, 13 Feb 2011 17:23:20 +0000 (18:23 +0100)
* m4/mbsinit.m4 (gl_FUNC_MBSINIT): Replace mbsinit also on mingw.
* lib/mbsinit.c (mbsinit): Provide an alternate definition for native
Windows.
* doc/posix-functions/mbsinit.texi: Mention the mingw bug.

ChangeLog
doc/posix-functions/mbsinit.texi
lib/mbsinit.c
m4/mbsinit.m4

index 3382c603366280fe0be9d32c803aa7e5df9f1b1a..e705ca536ba47015bbee508f8882058500edcdb6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-02-13  Bruno Haible  <bruno@clisp.org>
+
+       mbsinit: Work around mingw bug.
+       * m4/mbsinit.m4 (gl_FUNC_MBSINIT): Replace mbsinit also on mingw.
+       * lib/mbsinit.c (mbsinit): Provide an alternate definition for native
+       Windows.
+       * doc/posix-functions/mbsinit.texi: Mention the mingw bug.
+
 2011-02-13  Bruno Haible  <bruno@clisp.org>
 
        mbsinit: Don't crash for a NULL argument.
index 306df87d5d2764e06ccce3f14ff3cf716ce26353..a75dfa3ce290620fa0171ae375c210c02571010e 100644 (file)
@@ -11,6 +11,9 @@ Portability problems fixed by Gnulib:
 @item
 This function is missing on some platforms:
 HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+This function always returns 1, even in multibyte locales, on some platforms:
+mingw.
 @end itemize
 
 Portability problems not fixed by Gnulib:
index 869c0a6ab9e542c372a17282e1ee70df124f0ea6..8ac213703a3a341182213256badfb65031eb6581 100644 (file)
 
 #include "verify.h"
 
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+
+/* On native Windows, 'mbstate_t' is defined as 'int'.  */
+
+int
+mbsinit (const mbstate_t *ps)
+{
+  return ps == NULL || *ps == 0;
+}
+
+#else
+
 /* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
    and wcrtomb(), wcsrtombs().
    We assume that
@@ -45,3 +57,5 @@ mbsinit (const mbstate_t *ps)
 
   return pstate == NULL || pstate[0] == 0;
 }
+
+#endif
index 03b31447cf75664468539ad947cb19a4173bb2fe..47e2d14a73538d34bb60946fd0af8dae40a26c6e 100644 (file)
@@ -1,4 +1,4 @@
-# mbsinit.m4 serial 4
+# mbsinit.m4 serial 5
 dnl Copyright (C) 2008, 2010-2011 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,6 +7,7 @@ dnl with or without modifications, as long as this notice is preserved.
 AC_DEFUN([gl_FUNC_MBSINIT],
 [
   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
 
   AC_REQUIRE([AC_TYPE_MBSTATE_T])
   gl_MBSTATE_T_BROKEN
@@ -17,6 +18,13 @@ AC_DEFUN([gl_FUNC_MBSINIT],
   else
     if test $REPLACE_MBSTATE_T = 1; then
       REPLACE_MBSINIT=1
+    else
+      dnl On mingw, mbsinit() always returns 1, which is inappropriate for
+      dnl states produced by mbrtowc() for an incomplete multibyte character
+      dnl in multibyte locales.
+      case "$host_os" in
+        mingw*) REPLACE_MBSINIT=1 ;;
+      esac
     fi
   fi
   if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then