Blame gl/mbsinit.c

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