From a00eb65ac29fabecc40fd47c4c0651a47c7b2877 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 21 Apr 2017 16:43:01 +0200 Subject: [PATCH] mbsinit: Fix for MSVC 14. * lib/mbsinit.c (mbsinit): If GNULIB_defined_mbstate_t, provide an implementation that is in sync with mbrtowc.c. On other platforms, use an adequate ad-hoc implementation. --- ChangeLog | 7 +++++++ lib/mbsinit.c | 34 +++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8840fca73c..7ef61bea37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-04-21 Bruno Haible + + mbsinit: Fix for MSVC 14. + * lib/mbsinit.c (mbsinit): If GNULIB_defined_mbstate_t, provide an + implementation that is in sync with mbrtowc.c. On other platforms, use + an adequate ad-hoc implementation. + 2017-04-21 Bruno Haible Fix test-mbrtowc5.sh failure on native Windows. diff --git a/lib/mbsinit.c b/lib/mbsinit.c index 58e0441a65..758012668f 100644 --- a/lib/mbsinit.c +++ b/lib/mbsinit.c @@ -22,17 +22,7 @@ #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 +#if GNULIB_defined_mbstate_t /* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs() and wcrtomb(), wcsrtombs(). @@ -45,6 +35,7 @@ mbsinit (const mbstate_t *ps) We define the meaning of mbstate_t as follows: - In mb -> wc direction, mbstate_t's first byte contains the number of buffered bytes (in the range 0..3), followed by up to 3 buffered bytes. + See mbrtowc.c. - In wc -> mb direction, mbstate_t contains no information. In other words, it is always in the initial state. */ @@ -58,4 +49,25 @@ mbsinit (const mbstate_t *ps) return pstate == NULL || pstate[0] == 0; } +#else + +int +mbsinit (const mbstate_t *ps) +{ +# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ + /* Native Windows. */ +# ifdef __MINGW32__ + /* On mingw, 'mbstate_t' is defined as 'int'. */ + return ps == NULL || *ps == 0; +# else + /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4-bytes matter. */ + return ps == NULL || *(const unsigned int *)ps == 0; +# endif +# else + /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ... */ + /* Maybe this definition works, maybe not... */ + return ps == NULL || *(const char *)ps == 0; +# endif +} + #endif -- 2.39.5