Blame lib/mbsinit.c

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