locale: Provide a complete 'struct lconv' on Solaris 10, 11.
[gnulib.git] / m4 / locale_h.m4
1 # locale_h.m4 serial 16
2 dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN([gl_LOCALE_H],
8 [
9   dnl Use AC_REQUIRE here, so that the default behavior below is expanded
10   dnl once only, before all statements that occur in other macros.
11   AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
12
13   dnl Persuade glibc <locale.h> to define locale_t and the int_p_*, int_n_*
14   dnl members of 'struct lconv'.
15   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
16
17   dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
18   AC_REQUIRE([gl_STDDEF_H])
19
20   dnl Solaris 11 2011-11 defines the int_p_*, int_n_* members of 'struct lconv'
21   dnl only if _LCONV_C99 is defined.
22   AC_REQUIRE([AC_CANONICAL_HOST])
23   case "$host_os" in
24     solaris*)
25       AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.])
26       ;;
27   esac
28
29   AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001],
30     [gl_cv_header_locale_h_posix2001],
31     [AC_COMPILE_IFELSE(
32        [AC_LANG_PROGRAM(
33           [[#include <locale.h>
34             int x = LC_MESSAGES;
35             int y = sizeof (((struct lconv *) 0)->decimal_point);]],
36           [[]])],
37        [gl_cv_header_locale_h_posix2001=yes],
38        [gl_cv_header_locale_h_posix2001=no])])
39
40   dnl Check for <xlocale.h>.
41   AC_CHECK_HEADERS_ONCE([xlocale.h])
42   if test $ac_cv_header_xlocale_h = yes; then
43     HAVE_XLOCALE_H=1
44     dnl Check whether use of locale_t requires inclusion of <xlocale.h>,
45     dnl e.g. on MacOS X 10.5. If <locale.h> does not define locale_t by
46     dnl itself, we assume that <xlocale.h> will do so.
47     AC_CACHE_CHECK([whether locale.h defines locale_t],
48       [gl_cv_header_locale_has_locale_t],
49       [AC_COMPILE_IFELSE(
50          [AC_LANG_PROGRAM(
51             [[#include <locale.h>
52               locale_t x;]],
53             [[]])],
54          [gl_cv_header_locale_has_locale_t=yes],
55          [gl_cv_header_locale_has_locale_t=no])
56       ])
57     if test $gl_cv_header_locale_has_locale_t = yes; then
58       gl_cv_header_locale_h_needs_xlocale_h=no
59     else
60       gl_cv_header_locale_h_needs_xlocale_h=yes
61     fi
62   else
63     HAVE_XLOCALE_H=0
64     gl_cv_header_locale_h_needs_xlocale_h=no
65   fi
66   AC_SUBST([HAVE_XLOCALE_H])
67
68   dnl Check whether 'struct lconv' is well-defined.
69   dnl Bionic libc's 'struct lconv' is just a dummy.
70   AC_CACHE_CHECK([whether struct lconv is properly defined],
71     [gl_cv_sys_struct_lconv_ok],
72     [AC_COMPILE_IFELSE(
73        [AC_LANG_PROGRAM(
74           [[#include <locale.h>
75             struct lconv l;
76             int x = sizeof (l.decimal_point);]],
77           [[]])],
78        [gl_cv_sys_struct_lconv_ok=yes],
79        [gl_cv_sys_struct_lconv_ok=no])
80     ])
81   if test $gl_cv_sys_struct_lconv_ok = no; then
82     REPLACE_STRUCT_LCONV=1
83   fi
84
85   dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK.
86   gl_NEXT_HEADERS([locale.h])
87
88   dnl Check for declarations of anything we want to poison if the
89   dnl corresponding gnulib module is not in use.
90   gl_WARN_ON_USE_PREPARE([[#include <locale.h>
91 /* Some systems provide declarations in a non-standard header.  */
92 #if HAVE_XLOCALE_H
93 # include <xlocale.h>
94 #endif
95     ]],
96     [setlocale duplocale])
97 ])
98
99 AC_DEFUN([gl_LOCALE_MODULE_INDICATOR],
100 [
101   dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
102   AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
103   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
104   dnl Define it also as a C macro, for the benefit of the unit tests.
105   gl_MODULE_INDICATOR_FOR_TESTS([$1])
106 ])
107
108 AC_DEFUN([gl_LOCALE_H_DEFAULTS],
109 [
110   GNULIB_SETLOCALE=0;  AC_SUBST([GNULIB_SETLOCALE])
111   GNULIB_DUPLOCALE=0;  AC_SUBST([GNULIB_DUPLOCALE])
112   dnl Assume proper GNU behavior unless another module says otherwise.
113   HAVE_DUPLOCALE=1;       AC_SUBST([HAVE_DUPLOCALE])
114   REPLACE_SETLOCALE=0;    AC_SUBST([REPLACE_SETLOCALE])
115   REPLACE_DUPLOCALE=0;    AC_SUBST([REPLACE_DUPLOCALE])
116   REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV])
117 ])