summaryrefslogtreecommitdiff
path: root/gnulib-m4/getlocalename_l.m4
blob: 2b648ee45a178d8c1d5f4a19f3dc4d3c8f63cada (plain)
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
# getlocalename_l.m4
# serial 5
dnl Copyright (C) 2025-2026 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_GETLOCALENAME_L_SIMPLE],
[
  AC_REQUIRE([gl_LOCALE_H_DEFAULTS])

  dnl Persuade glibc <locale.h> to declare getlocalename_l().
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])

  AC_REQUIRE([gl_FUNC_GETLOCALENAME_L_UNSAFE])
])

# Prerequisites of lib/getlocalename_l.c.
AC_DEFUN([gl_PREREQ_GETLOCALENAME_L_SIMPLE],
[
  :
])

AC_DEFUN_ONCE([gl_FUNC_GETLOCALENAME_L_UNSAFE],
[
  AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
  AC_REQUIRE([gl_FUNC_SETLOCALE_NULL])
  AC_CHECK_FUNCS_ONCE([getlocalename_l])
  if test $ac_cv_func_getlocalename_l = yes; then
    dnl Check against the Cygwin 3.6.0 bug: It returns an invalid pointer when
    dnl the second argument is LC_GLOBAL_LOCALE.
    dnl Check against a Haiku >= hrev59293 oddity: It returns "POSIX" instead
    dnl of "C". We prefer "C".
    AC_REQUIRE([AC_CANONICAL_HOST])
    AC_CACHE_CHECK([whether getlocalename_l works],
      [gl_cv_func_getlocalename_l_works],
      [AC_RUN_IFELSE(
         [AC_LANG_SOURCE([[
#include <locale.h>
#include <string.h>
int main ()
{
  int result = 0;
  /* Check against the Cygwin bug.  */
  {
    const char *ret = getlocalename_l (LC_COLLATE, LC_GLOBAL_LOCALE);
    if (strlen (ret) == 0)
      result |= 1;
  }
  /* Check against the Haiku oddity.  */
  {
    const char *ret =
      getlocalename_l (LC_COLLATE, newlocale (LC_ALL_MASK, "C", NULL));
    if (strcmp (ret, "C") != 0)
      result |= 2;
  }
  return result;
}]])],
         [gl_cv_func_getlocalename_l_works=yes],
         [gl_cv_func_getlocalename_l_works=no],
         [case "$host_os" in
            cygwin*) # Guess no on Cygwin.
              gl_cv_func_getlocalename_l_works="guessing no" ;;
            haiku*)  # Guess no on Haiku.
              gl_cv_func_getlocalename_l_works="guessing no" ;;
            *)       # Guess yes otherwise.
              gl_cv_func_getlocalename_l_works="guessing yes" ;;
          esac
         ])
      ])
    case "$gl_cv_func_getlocalename_l_works" in
      *yes) ;;
      *) REPLACE_GETLOCALENAME_L=1 ;;
    esac
  else
    HAVE_GETLOCALENAME_L=0
  fi
  if test $HAVE_GETLOCALENAME_L = 0 || test $REPLACE_GETLOCALENAME_L = 1; then
    GETLOCALENAME_L_LIB="$SETLOCALE_NULL_LIB"
  else
    GETLOCALENAME_L_LIB=
  fi
  dnl GETLOCALENAME_L_LIB is expected to be '-pthread' or '-lpthread' on AIX
  dnl with gcc or xlc, and empty otherwise.
  AC_SUBST([GETLOCALENAME_L_LIB])
])

# Prerequisites of lib/getlocalename_l-unsafe.c.
AC_DEFUN([gl_PREREQ_GETLOCALENAME_L_UNSAFE],
[
  AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
  AC_REQUIRE([gl_LOCALE_T])
  AC_REQUIRE([gt_INTL_THREAD_LOCALE_NAME])
  AC_CHECK_HEADERS_ONCE([langinfo.h])
  if test $HAVE_LOCALE_T = 1; then
    gl_CHECK_FUNCS_ANDROID([newlocale], [[#include <locale.h>]])
    gl_CHECK_FUNCS_ANDROID([duplocale], [[#include <locale.h>]])
    gl_CHECK_FUNCS_ANDROID([freelocale], [[#include <locale.h>]])
    gl_func_newlocale="$ac_cv_func_newlocale"
    gl_func_duplocale="$ac_cv_func_duplocale"
    gl_func_freelocale="$ac_cv_func_freelocale"
  else
    dnl In 2019, some versions of z/OS lack the locale_t type and have broken
    dnl newlocale, duplocale, freelocale functions.
    gl_cv_onwards_func_newlocale='future OS version'
    gl_cv_onwards_func_duplocale='future OS version'
    gl_cv_onwards_func_freelocale='future OS version'
    gl_func_newlocale=no
    gl_func_duplocale=no
    gl_func_freelocale=no
  fi
  if test $gl_func_newlocale != yes; then
    HAVE_NEWLOCALE=0
    case "$gl_cv_onwards_func_newlocale" in
      future*) REPLACE_NEWLOCALE=1 ;;
    esac
  fi
  if test $gl_func_duplocale != yes; then
    HAVE_DUPLOCALE=0
    case "$gl_cv_onwards_func_duplocale" in
      future*) REPLACE_DUPLOCALE=1 ;;
    esac
  fi
  if test $gl_func_freelocale != yes; then
    HAVE_FREELOCALE=0
    case "$gl_cv_onwards_func_freelocale" in
      future*) REPLACE_FREELOCALE=1 ;;
    esac
  fi
  if test $gt_localename_enhances_locale_funcs = yes; then
    REPLACE_NEWLOCALE=1
    REPLACE_DUPLOCALE=1
    REPLACE_FREELOCALE=1
  fi
])