Blame lib/mbsinit.c

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