2 dnl Copyright (C) 2006-2020 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.
7 AC_DEFUN([gl_FUNC_WCWIDTH],
9 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
12 dnl Persuade glibc <wchar.h> to declare wcwidth().
13 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
15 AC_REQUIRE([gt_TYPE_WCHAR_T])
16 AC_REQUIRE([gt_TYPE_WINT_T])
18 AC_CHECK_HEADERS_ONCE([wchar.h])
19 AC_CHECK_FUNCS_ONCE([wcwidth])
21 AC_CHECK_DECLS([wcwidth], [], [], [[
22 /* AIX 3.2.5 declares wcwidth in <string.h>. */
24 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
26 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
33 if test $ac_cv_have_decl_wcwidth != yes; then
37 if test $ac_cv_func_wcwidth != yes; then
38 AC_CACHE_CHECK([whether wcwidth is a macro],
39 [gl_cv_func_wcwidth_macro],
40 [AC_EGREP_CPP([wchar_header_defines_wcwidth], [
43 wchar_header_defines_wcwidth
45 [gl_cv_func_wcwidth_macro=yes],
46 [gl_cv_func_wcwidth_macro=no])
50 if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
52 dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
53 dnl On NetBSD 9.0, OpenBSD 5.0, wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
54 dnl On NetBSD 9.0, OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
55 dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0.
56 dnl This leads to bugs in 'ls' (coreutils).
57 dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2,
58 dnl even in Western locales.
59 AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales],
60 [gl_cv_func_wcwidth_works],
65 /* AIX 3.2.5 declares wcwidth in <string.h>. */
67 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
69 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
75 #if !HAVE_DECL_WCWIDTH
85 if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
87 if (wcwidth (0x0301) > 0)
89 if (wcwidth (0x05B0) > 0)
91 if (wcwidth (0x200B) > 0)
93 if (wcwidth (0xFF1A) == 0)
95 if (wcwidth (0x2202) > 1)
100 [gl_cv_func_wcwidth_works=yes],
101 [gl_cv_func_wcwidth_works=no],
105 # Guess yes on glibc systems.
106 *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
107 # Guess yes on musl systems.
108 *-musl*) gl_cv_func_wcwidth_works="guessing yes";;
109 # Guess yes on AIX 7 systems.
110 aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";;
111 *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
116 case "$gl_cv_func_wcwidth_works" in
118 *no) REPLACE_WCWIDTH=1 ;;
123 dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not
124 dnl have the wcwidth function, then it does not declare it.
127 # Prerequisites of lib/wcwidth.c.
128 AC_DEFUN([gl_PREREQ_WCWIDTH], [
129 AC_REQUIRE([AC_C_INLINE])