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
|
# strfmon_l.m4 serial 3
dnl Copyright (C) 2017-2022 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.
AC_DEFUN([gl_FUNC_STRFMON_L],
[
AC_REQUIRE([gl_MONETARY_H_DEFAULTS])
AC_REQUIRE([gt_LOCALE_FR_UTF8])
dnl Persuade glibc <monetary.h> to declare strfmon_l().
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
dnl On Mac OS X 10.12, <monetary.h> may declare strfmon_l() if
dnl _USE_EXTENDED_LOCALES_ is defined. But this symbol is supposed
dnl to be defined by <xlocale.h>, not by us.
AC_CHECK_FUNCS_ONCE([strfmon_l])
if test $ac_cv_func_strfmon_l = yes; then
dnl Test for bug <https://sourceware.org/bugzilla/show_bug.cgi?id=19633>
dnl which was fixed in glibc-2.24.
AC_CACHE_CHECK([whether strfmon_l works],
[gl_cv_strfmon_l_works],
[
dnl Initial guess, used when cross-compiling or when no suitable locale
dnl is present.
case "$host_os" in
# Guess no on glibc versions < 2.24.
*-gnu* | gnu*)
AC_EGREP_CPP([Unlucky],
[
#include <features.h>
#ifdef __GNU_LIBRARY__
#if (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)
Unlucky GNU user
#endif
#endif
],
[gl_cv_strfmon_l_works="guessing no"],
[gl_cv_strfmon_l_works="guessing yes"])
;;
# Guess no on FreeBSD and Cygwin.
freebsd* | midnightbsd* | cygwin*) gl_cv_strfmon_l_works="guessing no" ;;
# Guess yes otherwise.
*) gl_cv_strfmon_l_works="guessing yes" ;;
esac
if test $LOCALE_FR_UTF8 != none; then
AC_CHECK_HEADERS_ONCE([xlocale.h])
AC_RUN_IFELSE(
[AC_LANG_SOURCE([[
#include <monetary.h>
#include <locale.h>
#if HAVE_XLOCALE_H
# include <xlocale.h>
#endif
#include <string.h>
int main ()
{
/* On older glibc systems: expected_buf="$123.50" buf="$123,50"
On FreeBSD 12.0, Cygwin 2.9: expected_buf="$123.50" buf="123,50 $"
*/
if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
{
char expected_buf[80];
if (strfmon (expected_buf, sizeof (expected_buf), "%.2n", 123.5) >= 0)
if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
{
locale_t loc = newlocale (LC_ALL_MASK, "en_US.UTF-8", NULL);
if (loc != (locale_t) 0)
{
char buf[80];
if (strfmon_l (buf, sizeof (buf), loc, "%.2n", 123.5) >= 0)
return strcmp (buf, expected_buf) != 0;
}
}
}
return 0;
}]])],
[gl_cv_strfmon_l_works=yes],
[gl_cv_strfmon_l_works=no],
[:])
fi
])
if test "$gl_cv_strfmon_l_works" = no; then
REPLACE_STRFMON_L=1
fi
else
HAVE_STRFMON_L=0
fi
])
# Prerequisites of lib/strfmon_l.c.
AC_DEFUN([gl_PREREQ_STRFMON_L], [
:
])
|