1 /* Convert string to 32-bit wide string. 2 Copyright (C) 2020-2021 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2020. 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 3 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 <uchar.h> 22 23 #include <wchar.h> 24 25 #if (HAVE_WORKING_MBRTOC32 && !defined __GLIBC__) || _GL_LARGE_CHAR32_T 26 /* The char32_t encoding of a multibyte character may be different than its 27 wchar_t encoding, or char32_t is wider than wchar_t. */ 28 29 /* For Cygwin >= 1.7 it would be possible to speed this up a bit by cutting 30 the source into chunks, calling mbsnrtowcs on a chunk, then u16_to_u32 on 31 the result, then proceed with the next chunk, and so on. 32 But speed is not critical here so far. */ 33 34 /* Reuse the implementation of mbsnrtowcs with a different parameterization. */ 35 36 # include <errno.h> 37 # include <limits.h> 38 # include <stdlib.h> 39 40 # include "minmax.h" 41 # include "strnlen1.h" 42 43 extern mbstate_t _gl_mbsrtoc32s_state; 44 45 # define FUNC mbsnrtoc32s 46 # define DCHAR_T char32_t 47 # define INTERNAL_STATE _gl_mbsrtoc32s_state 48 # define MBRTOWC mbrtoc32 49 # include "mbsnrtowcs-impl.h" 50 51 #else 52 /* char32_t and wchar_t are equivalent. */ 53 54 # include "verify.h" 55 56 verify (sizeof (char32_t) == sizeof (wchar_t)); 57 58 size_t 59 mbsnrtoc32s (char32_t *dest, const char **srcp, size_t srclen, size_t len, /* */ 60 mbstate_t *ps) 61 { 62 return mbsnrtowcs ((wchar_t *) dest, srcp, srclen, len, ps); 63 } 64 65 #endif