root/maint/gnulib/lib/mbsinit.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mbsinit
  2. mbsinit

   1 /* Test for initial conversion state.
   2    Copyright (C) 2008-2021 Free Software Foundation, Inc.
   3    Written by Bruno Haible <bruno@clisp.org>, 2008.
   4 
   5    This file is free software: you can redistribute it and/or modify
   6    it under the terms of the GNU Lesser General Public License as
   7    published by the Free Software Foundation; either version 2.1 of the
   8    License, or (at your option) any later version.
   9 
  10    This file is distributed in the hope that it will be useful,
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13    GNU Lesser General Public License for more details.
  14 
  15    You should have received a copy of the GNU Lesser General Public License
  16    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  17 
  18 #include <config.h>
  19 
  20 /* Specification.  */
  21 #include <wchar.h>
  22 
  23 #include "verify.h"
  24 
  25 #if GNULIB_defined_mbstate_t
  26 
  27 /* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
  28    and wcrtomb(), wcsrtombs().
  29    We assume that
  30      - sizeof (mbstate_t) >= 4,
  31      - only stateless encodings are supported (such as UTF-8 and EUC-JP, but
  32        not ISO-2022 variants),
  33      - for each encoding, the number of bytes for a wide character is <= 4.
  34        (This maximum is attained for UTF-8, GB18030, EUC-TW.)
  35    We define the meaning of mbstate_t as follows:
  36      - In mb -> wc direction, mbstate_t's first byte contains the number of
  37        buffered bytes (in the range 0..3), followed by up to 3 buffered bytes.
  38        See mbrtowc.c.
  39      - In wc -> mb direction, mbstate_t contains no information. In other
  40        words, it is always in the initial state.  */
  41 
  42 verify (sizeof (mbstate_t) >= 4);
  43 
  44 int
  45 mbsinit (const mbstate_t *ps)
     /* [previous][next][first][last][top][bottom][index][help] */
  46 {
  47   const char *pstate = (const char *)ps;
  48 
  49   return pstate == NULL || pstate[0] == 0;
  50 }
  51 
  52 #else
  53 
  54 int
  55 mbsinit (const mbstate_t *ps)
     /* [previous][next][first][last][top][bottom][index][help] */
  56 {
  57 # if defined _WIN32 && !defined __CYGWIN__
  58   /* Native Windows.  */
  59   /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4 bytes matter.
  60      On mingw, 'mbstate_t' is sometimes defined as 'int', sometimes defined as
  61      an 8-byte struct, of which the first 4 bytes matter.  */
  62   return ps == NULL || *(const unsigned int *)ps == 0;
  63 # else
  64   /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ...  */
  65   /* Maybe this definition works, maybe not...  */
  66   return ps == NULL || *(const char *)ps == 0;
  67 # endif
  68 }
  69 
  70 #endif

/* [previous][next][first][last][top][bottom][index][help] */