Blame lib/mbsinit.c

Packit 709fb3
/* Test for initial conversion state.
Packit 709fb3
   Copyright (C) 2008-2017 Free Software Foundation, Inc.
Packit 709fb3
   Written by Bruno Haible <bruno@clisp.org>, 2008.
Packit 709fb3
Packit 709fb3
   This program is free software: you can redistribute it and/or modify
Packit 709fb3
   it under the terms of the GNU General Public License as published by
Packit 709fb3
   the Free Software Foundation; either version 3 of the License, or
Packit 709fb3
   (at your option) any later version.
Packit 709fb3
Packit 709fb3
   This program is distributed in the hope that it will be useful,
Packit 709fb3
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 709fb3
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 709fb3
   GNU General Public License for more details.
Packit 709fb3
Packit 709fb3
   You should have received a copy of the GNU General Public License
Packit 709fb3
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 709fb3
Packit 709fb3
#include <config.h>
Packit 709fb3
Packit 709fb3
/* Specification.  */
Packit 709fb3
#include <wchar.h>
Packit 709fb3
Packit 709fb3
#include "verify.h"
Packit 709fb3
Packit 709fb3
#if GNULIB_defined_mbstate_t
Packit 709fb3
Packit 709fb3
/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
Packit 709fb3
   and wcrtomb(), wcsrtombs().
Packit 709fb3
   We assume that
Packit 709fb3
     - sizeof (mbstate_t) >= 4,
Packit 709fb3
     - only stateless encodings are supported (such as UTF-8 and EUC-JP, but
Packit 709fb3
       not ISO-2022 variants),
Packit 709fb3
     - for each encoding, the number of bytes for a wide character is <= 4.
Packit 709fb3
       (This maximum is attained for UTF-8, GB18030, EUC-TW.)
Packit 709fb3
   We define the meaning of mbstate_t as follows:
Packit 709fb3
     - In mb -> wc direction, mbstate_t's first byte contains the number of
Packit 709fb3
       buffered bytes (in the range 0..3), followed by up to 3 buffered bytes.
Packit 709fb3
       See mbrtowc.c.
Packit 709fb3
     - In wc -> mb direction, mbstate_t contains no information. In other
Packit 709fb3
       words, it is always in the initial state.  */
Packit 709fb3
Packit 709fb3
verify (sizeof (mbstate_t) >= 4);
Packit 709fb3
Packit 709fb3
int
Packit 709fb3
mbsinit (const mbstate_t *ps)
Packit 709fb3
{
Packit 709fb3
  const char *pstate = (const char *)ps;
Packit 709fb3
Packit 709fb3
  return pstate == NULL || pstate[0] == 0;
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
#else
Packit 709fb3
Packit 709fb3
int
Packit 709fb3
mbsinit (const mbstate_t *ps)
Packit 709fb3
{
Packit 709fb3
# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
Packit 709fb3
  /* Native Windows.  */
Packit 709fb3
#  ifdef __MINGW32__
Packit 709fb3
  /* On mingw, 'mbstate_t' is defined as 'int'.  */
Packit 709fb3
  return ps == NULL || *ps == 0;
Packit 709fb3
#  else
Packit 709fb3
  /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4-bytes matter.  */
Packit 709fb3
  return ps == NULL || *(const unsigned int *)ps == 0;
Packit 709fb3
#  endif
Packit 709fb3
# else
Packit 709fb3
  /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ...  */
Packit 709fb3
  /* Maybe this definition works, maybe not...  */
Packit 709fb3
  return ps == NULL || *(const char *)ps == 0;
Packit 709fb3
# endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
#endif