xref: /Universal-ctags/m4/wcrtomb.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# wcrtomb.m4 serial 17
2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation
4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it,
5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved.
6*820c1a8dSHiroo HAYASHI
7*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_FUNC_WCRTOMB],
8*820c1a8dSHiroo HAYASHI[
9*820c1a8dSHiroo HAYASHI  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10*820c1a8dSHiroo HAYASHI
11*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_TYPE_MBSTATE_T])
12*820c1a8dSHiroo HAYASHI  gl_MBSTATE_T_BROKEN
13*820c1a8dSHiroo HAYASHI
14*820c1a8dSHiroo HAYASHI  AC_CHECK_FUNCS_ONCE([wcrtomb])
15*820c1a8dSHiroo HAYASHI  if test $ac_cv_func_wcrtomb = no; then
16*820c1a8dSHiroo HAYASHI    HAVE_WCRTOMB=0
17*820c1a8dSHiroo HAYASHI    AC_CHECK_DECLS([wcrtomb],,, [[
18*820c1a8dSHiroo HAYASHI      #include <wchar.h>
19*820c1a8dSHiroo HAYASHI    ]])
20*820c1a8dSHiroo HAYASHI    if test $ac_cv_have_decl_wcrtomb = yes; then
21*820c1a8dSHiroo HAYASHI      dnl On Minix 3.1.8, the system's <wchar.h> declares wcrtomb() although
22*820c1a8dSHiroo HAYASHI      dnl it does not have the function. Avoid a collision with gnulib's
23*820c1a8dSHiroo HAYASHI      dnl replacement.
24*820c1a8dSHiroo HAYASHI      REPLACE_WCRTOMB=1
25*820c1a8dSHiroo HAYASHI    fi
26*820c1a8dSHiroo HAYASHI  else
27*820c1a8dSHiroo HAYASHI    dnl We don't actually need to override wcrtomb when redefining the semantics
28*820c1a8dSHiroo HAYASHI    dnl of the mbstate_t type. Tested on 32-bit AIX.
29*820c1a8dSHiroo HAYASHI    dnl if test $REPLACE_MBSTATE_T = 1; then
30*820c1a8dSHiroo HAYASHI    dnl   REPLACE_WCRTOMB=1
31*820c1a8dSHiroo HAYASHI    dnl fi
32*820c1a8dSHiroo HAYASHI    if test $REPLACE_WCRTOMB = 0; then
33*820c1a8dSHiroo HAYASHI      dnl On Android 4.3, wcrtomb produces wrong characters in the C locale.
34*820c1a8dSHiroo HAYASHI      dnl On AIX 4.3, OSF/1 5.1 and Solaris <= 11.3, wcrtomb (NULL, 0, NULL)
35*820c1a8dSHiroo HAYASHI      dnl sometimes returns 0 instead of 1.
36*820c1a8dSHiroo HAYASHI      AC_REQUIRE([AC_PROG_CC])
37*820c1a8dSHiroo HAYASHI      AC_REQUIRE([gt_LOCALE_FR])
38*820c1a8dSHiroo HAYASHI      AC_REQUIRE([gt_LOCALE_FR_UTF8])
39*820c1a8dSHiroo HAYASHI      AC_REQUIRE([gt_LOCALE_JA])
40*820c1a8dSHiroo HAYASHI      AC_REQUIRE([gt_LOCALE_ZH_CN])
41*820c1a8dSHiroo HAYASHI      AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
42*820c1a8dSHiroo HAYASHI      AC_CACHE_CHECK([whether wcrtomb works in the C locale],
43*820c1a8dSHiroo HAYASHI        [gl_cv_func_wcrtomb_works],
44*820c1a8dSHiroo HAYASHI        [AC_RUN_IFELSE(
45*820c1a8dSHiroo HAYASHI           [AC_LANG_SOURCE([[
46*820c1a8dSHiroo HAYASHI#include <string.h>
47*820c1a8dSHiroo HAYASHI#include <stdlib.h>
48*820c1a8dSHiroo HAYASHI#include <wchar.h>
49*820c1a8dSHiroo HAYASHIint main ()
50*820c1a8dSHiroo HAYASHI{
51*820c1a8dSHiroo HAYASHI  mbstate_t state;
52*820c1a8dSHiroo HAYASHI  char out[64];
53*820c1a8dSHiroo HAYASHI  int count;
54*820c1a8dSHiroo HAYASHI  memset (&state, 0, sizeof (state));
55*820c1a8dSHiroo HAYASHI  out[0] = 'x';
56*820c1a8dSHiroo HAYASHI  count = wcrtomb (out, L'a', &state);
57*820c1a8dSHiroo HAYASHI  return !(count == 1 && out[0] == 'a');
58*820c1a8dSHiroo HAYASHI}]])],
59*820c1a8dSHiroo HAYASHI           [gl_cv_func_wcrtomb_works=yes],
60*820c1a8dSHiroo HAYASHI           [gl_cv_func_wcrtomb_works=no],
61*820c1a8dSHiroo HAYASHI           [case "$host_os" in
62*820c1a8dSHiroo HAYASHI                               # Guess no on Android.
63*820c1a8dSHiroo HAYASHI              linux*-android*) gl_cv_func_wcrtomb_works="guessing no";;
64*820c1a8dSHiroo HAYASHI                               # Guess yes otherwise.
65*820c1a8dSHiroo HAYASHI              *)               gl_cv_func_wcrtomb_works="guessing yes";;
66*820c1a8dSHiroo HAYASHI            esac
67*820c1a8dSHiroo HAYASHI           ])
68*820c1a8dSHiroo HAYASHI        ])
69*820c1a8dSHiroo HAYASHI      case "$gl_cv_func_wcrtomb_works" in
70*820c1a8dSHiroo HAYASHI        *yes) ;;
71*820c1a8dSHiroo HAYASHI        *) AC_DEFINE([WCRTOMB_C_LOCALE_BUG], [1],
72*820c1a8dSHiroo HAYASHI             [Define if the wcrtomb function does not work in the C locale.])
73*820c1a8dSHiroo HAYASHI           REPLACE_WCRTOMB=1 ;;
74*820c1a8dSHiroo HAYASHI      esac
75*820c1a8dSHiroo HAYASHI    fi
76*820c1a8dSHiroo HAYASHI    if test $REPLACE_WCRTOMB = 0; then
77*820c1a8dSHiroo HAYASHI      AC_CACHE_CHECK([whether wcrtomb return value is correct],
78*820c1a8dSHiroo HAYASHI        [gl_cv_func_wcrtomb_retval],
79*820c1a8dSHiroo HAYASHI        [
80*820c1a8dSHiroo HAYASHI          dnl Initial guess, used when cross-compiling or when no suitable locale
81*820c1a8dSHiroo HAYASHI          dnl is present.
82*820c1a8dSHiroo HAYASHIchangequote(,)dnl
83*820c1a8dSHiroo HAYASHI          case "$host_os" in
84*820c1a8dSHiroo HAYASHI            # Guess no on AIX 4, OSF/1, Solaris, native Windows.
85*820c1a8dSHiroo HAYASHI            aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;;
86*820c1a8dSHiroo HAYASHI            # Guess yes otherwise.
87*820c1a8dSHiroo HAYASHI            *)                                gl_cv_func_wcrtomb_retval="guessing yes" ;;
88*820c1a8dSHiroo HAYASHI          esac
89*820c1a8dSHiroo HAYASHIchangequote([,])dnl
90*820c1a8dSHiroo HAYASHI          if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
91*820c1a8dSHiroo HAYASHI            AC_RUN_IFELSE(
92*820c1a8dSHiroo HAYASHI              [AC_LANG_SOURCE([[
93*820c1a8dSHiroo HAYASHI#include <locale.h>
94*820c1a8dSHiroo HAYASHI#include <string.h>
95*820c1a8dSHiroo HAYASHI#include <wchar.h>
96*820c1a8dSHiroo HAYASHI#include <stdlib.h>
97*820c1a8dSHiroo HAYASHIint main ()
98*820c1a8dSHiroo HAYASHI{
99*820c1a8dSHiroo HAYASHI  int result = 0;
100*820c1a8dSHiroo HAYASHI  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
101*820c1a8dSHiroo HAYASHI    {
102*820c1a8dSHiroo HAYASHI      if (wcrtomb (NULL, 0, NULL) != 1)
103*820c1a8dSHiroo HAYASHI        result |= 1;
104*820c1a8dSHiroo HAYASHI    }
105*820c1a8dSHiroo HAYASHI  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
106*820c1a8dSHiroo HAYASHI    {
107*820c1a8dSHiroo HAYASHI      if (wcrtomb (NULL, 0, NULL) != 1)
108*820c1a8dSHiroo HAYASHI        result |= 2;
109*820c1a8dSHiroo HAYASHI      {
110*820c1a8dSHiroo HAYASHI        wchar_t wc = (wchar_t) 0xBADFACE;
111*820c1a8dSHiroo HAYASHI        if (mbtowc (&wc, "\303\274", 2) == 2)
112*820c1a8dSHiroo HAYASHI          if (wcrtomb (NULL, wc, NULL) != 1)
113*820c1a8dSHiroo HAYASHI            result |= 2;
114*820c1a8dSHiroo HAYASHI      }
115*820c1a8dSHiroo HAYASHI    }
116*820c1a8dSHiroo HAYASHI  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
117*820c1a8dSHiroo HAYASHI    {
118*820c1a8dSHiroo HAYASHI      if (wcrtomb (NULL, 0, NULL) != 1)
119*820c1a8dSHiroo HAYASHI        result |= 4;
120*820c1a8dSHiroo HAYASHI    }
121*820c1a8dSHiroo HAYASHI  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
122*820c1a8dSHiroo HAYASHI    {
123*820c1a8dSHiroo HAYASHI      if (wcrtomb (NULL, 0, NULL) != 1)
124*820c1a8dSHiroo HAYASHI        result |= 8;
125*820c1a8dSHiroo HAYASHI    }
126*820c1a8dSHiroo HAYASHI  return result;
127*820c1a8dSHiroo HAYASHI}]])],
128*820c1a8dSHiroo HAYASHI              [gl_cv_func_wcrtomb_retval=yes],
129*820c1a8dSHiroo HAYASHI              [gl_cv_func_wcrtomb_retval=no],
130*820c1a8dSHiroo HAYASHI              [:])
131*820c1a8dSHiroo HAYASHI          fi
132*820c1a8dSHiroo HAYASHI        ])
133*820c1a8dSHiroo HAYASHI      case "$gl_cv_func_wcrtomb_retval" in
134*820c1a8dSHiroo HAYASHI        *yes) ;;
135*820c1a8dSHiroo HAYASHI        *) AC_DEFINE([WCRTOMB_RETVAL_BUG], [1],
136*820c1a8dSHiroo HAYASHI             [Define if the wcrtomb function has an incorrect return value.])
137*820c1a8dSHiroo HAYASHI           REPLACE_WCRTOMB=1 ;;
138*820c1a8dSHiroo HAYASHI      esac
139*820c1a8dSHiroo HAYASHI    fi
140*820c1a8dSHiroo HAYASHI  fi
141*820c1a8dSHiroo HAYASHI])
142*820c1a8dSHiroo HAYASHI
143*820c1a8dSHiroo HAYASHI# Prerequisites of lib/wcrtomb.c.
144*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PREREQ_WCRTOMB], [
145*820c1a8dSHiroo HAYASHI  :
146*820c1a8dSHiroo HAYASHI])
147