Branch
Hash :
7b089321
Author :
Date :
2025-01-01T09:24:36
maint: run 'make update-copyright'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
# mbsnrtowcs.m4
# serial 9
dnl Copyright (C) 2008, 2010-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl This file is offered as-is, without any warranty.
AC_DEFUN([gl_FUNC_MBSNRTOWCS],
[
AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
dnl Persuade glibc <wchar.h> to declare mbsnrtowcs().
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
AC_REQUIRE([AC_TYPE_MBSTATE_T])
gl_MBSTATE_T_BROKEN
gl_CHECK_FUNCS_ANDROID([mbsnrtowcs], [[#include <wchar.h>]])
if test $ac_cv_func_mbsnrtowcs = no; then
HAVE_MBSNRTOWCS=0
case "$gl_cv_onwards_func_mbsnrtowcs" in
future*) REPLACE_MBSNRTOWCS=1 ;;
esac
else
if test $REPLACE_MBSTATE_T = 1; then
REPLACE_MBSNRTOWCS=1
else
gl_MBSNRTOWCS_WORKS_IN_TRADITIONAL_LOCALE
case "$gl_cv_func_mbsnrtowcs_works_in_traditional_locale" in
*yes) ;;
*) REPLACE_MBSNRTOWCS=1 ;;
esac
if test $REPLACE_MBSNRTOWCS = 0; then
gl_MBRTOWC_C_LOCALE
case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in
*yes) ;;
*) REPLACE_MBSNRTOWCS=1 ;;
esac
fi
fi
fi
])
# Prerequisites of lib/mbsnrtowcs.c.
AC_DEFUN([gl_PREREQ_MBSNRTOWCS], [
:
])
dnl Test whether mbsnrtowcs works in an ISO-8859-1 locale.
dnl Result is gl_cv_func_mbsnrtowcs_works_in_traditional_locale.
AC_DEFUN([gl_MBSNRTOWCS_WORKS_IN_TRADITIONAL_LOCALE],
[
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([gt_LOCALE_FR])
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
AC_CACHE_CHECK([whether mbsnrtowcs works in a traditional locale],
[gl_cv_func_mbsnrtowcs_works_in_traditional_locale],
[
dnl Initial guess, used when cross-compiling or when no suitable locale
dnl is present.
changequote(,)dnl
case "$host_os" in
# Guess no on Solaris.
solaris*) gl_cv_func_mbsnrtowcs_works_in_traditional_locale="guessing no" ;;
# Guess yes otherwise.
*) gl_cv_func_mbsnrtowcs_works_in_traditional_locale="guessing yes" ;;
esac
changequote([,])dnl
if test $LOCALE_FR != none; then
AC_RUN_IFELSE(
[AC_LANG_SOURCE([[
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
int main ()
{
/* This fails on Solaris 11.4:
mbsnrtowcs stores a wrong wide character: 0xDF instead of btowc (0xDF). */
if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
{
/* Locale encoding is ISO-8859-1 or ISO-8859-15. */
char input[] = "B\374\337er"; /* "Büßer" */
mbstate_t state;
mbstate_t temp_state;
wchar_t wc;
size_t ret;
const char *src;
#define BUFSIZE 10
wchar_t buf[BUFSIZE];
{
size_t i;
for (i = 0; i < BUFSIZE; i++)
buf[i] = (wchar_t) 0xBADFACE;
}
memset (&state, '\0', sizeof (mbstate_t));
wc = (wchar_t) 0xBADFACE;
ret = mbrtowc (&wc, input, 1, &state);
if (!(ret == 1 && wc == 'B' && mbsinit (&state)))
return 1;
input[0] = '\0';
wc = (wchar_t) 0xBADFACE;
ret = mbrtowc (&wc, input + 1, 1, &state);
if (!(ret == 1 && wctob (wc) == (unsigned char) '\374' && mbsinit (&state)))
return 2;
input[1] = '\0';
src = input + 2;
temp_state = state;
ret = mbsnrtowcs (NULL, &src, 4, 1, &temp_state);
if (!(ret == 3 && src == input + 2 && mbsinit (&state)))
return 3;
src = input + 2;
ret = mbsnrtowcs (buf, &src, 4, 1, &state);
if (!(ret == 1))
return 4;
if (!(src == input + 3))
return 5;
if (!(buf[0] == btowc ((unsigned char) '\337')))
return 6;
}
return 0;
}]])],
[gl_cv_func_mbsnrtowcs_works_in_traditional_locale=yes],
[gl_cv_func_mbsnrtowcs_works_in_traditional_locale=no],
[:])
fi
])
])