Bump to m4 1.4.19
[platform/upstream/m4.git] / m4 / wcwidth.m4
1 # wcwidth.m4 serial 34
2 dnl Copyright (C) 2006-2021 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_FUNC_WCWIDTH],
8 [
9   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
11
12   dnl Persuade glibc <wchar.h> to declare wcwidth().
13   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
14
15   AC_REQUIRE([gt_TYPE_WCHAR_T])
16   AC_REQUIRE([gt_TYPE_WINT_T])
17
18   AC_CHECK_HEADERS_ONCE([wchar.h])
19   AC_CHECK_FUNCS_ONCE([wcwidth])
20
21   AC_CHECK_DECLS([wcwidth], [], [], [[
22     #include <wchar.h>
23   ]])
24   if test $ac_cv_have_decl_wcwidth != yes; then
25     HAVE_DECL_WCWIDTH=0
26   fi
27
28   if test $ac_cv_func_wcwidth != yes; then
29     AC_CACHE_CHECK([whether wcwidth is a macro],
30       [gl_cv_func_wcwidth_macro],
31       [AC_EGREP_CPP([wchar_header_defines_wcwidth], [
32 #include <wchar.h>
33 #ifdef wcwidth
34  wchar_header_defines_wcwidth
35 #endif],
36          [gl_cv_func_wcwidth_macro=yes],
37          [gl_cv_func_wcwidth_macro=no])
38       ])
39   fi
40
41   if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
42     HAVE_WCWIDTH=1
43     dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
44     dnl On NetBSD 9.0, OpenBSD 5.0, MidnightBSD 1.1,
45     dnl wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
46     dnl On NetBSD 9.0, MidnightBSD 1.1, OSF/1 5.1,
47     dnl wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
48     dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0.
49     dnl This leads to bugs in 'ls' (coreutils).
50     dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2,
51     dnl even in Western locales.
52     AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales],
53       [gl_cv_func_wcwidth_works],
54       [
55         AC_RUN_IFELSE(
56           [AC_LANG_SOURCE([[
57 #include <locale.h>
58 #include <wchar.h>
59 #if !HAVE_DECL_WCWIDTH
60 extern
61 # ifdef __cplusplus
62 "C"
63 # endif
64 int wcwidth (int);
65 #endif
66 int main ()
67 {
68   int result = 0;
69   if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
70     {
71       if (wcwidth (0x0301) > 0)
72         result |= 1;
73       if (wcwidth (0x05B0) > 0)
74         result |= 2;
75       if (wcwidth (0x200B) > 0)
76         result |= 4;
77       if (wcwidth (0xFF1A) == 0)
78         result |= 8;
79       if (wcwidth (0x2202) > 1)
80         result |= 16;
81     }
82   return result;
83 }]])],
84           [gl_cv_func_wcwidth_works=yes],
85           [gl_cv_func_wcwidth_works=no],
86           [
87 changequote(,)dnl
88            case "$host_os" in
89                             # Guess yes on glibc systems.
90              *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
91                             # Guess yes on musl systems.
92              *-musl*)       gl_cv_func_wcwidth_works="guessing yes";;
93                             # Guess yes on AIX 7 systems.
94              aix[7-9]*)     gl_cv_func_wcwidth_works="guessing yes";;
95              *)             gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
96            esac
97 changequote([,])dnl
98           ])
99       ])
100     case "$gl_cv_func_wcwidth_works" in
101       *yes) ;;
102       *no) REPLACE_WCWIDTH=1 ;;
103     esac
104   else
105     HAVE_WCWIDTH=0
106   fi
107   dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not
108   dnl have the wcwidth function, then it does not declare it.
109 ])
110
111 # Prerequisites of lib/wcwidth.c.
112 AC_DEFUN([gl_PREREQ_WCWIDTH], [
113   AC_REQUIRE([AC_C_INLINE])
114   :
115 ])