1# wcwidth.m4 serial 16 2dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7AC_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/* AIX 3.2.5 declares wcwidth in <string.h>. */ 23#include <string.h> 24/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before 25 <wchar.h>. 26 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included 27 before <wchar.h>. */ 28#include <stddef.h> 29#include <stdio.h> 30#include <time.h> 31#include <wchar.h> 32]) 33 if test $ac_cv_have_decl_wcwidth != yes; then 34 HAVE_DECL_WCWIDTH=0 35 fi 36 37 if test $ac_cv_func_wcwidth = yes; then 38 dnl On MacOS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1. 39 dnl On OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1. 40 dnl This leads to bugs in 'ls' (coreutils). 41 AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales], 42 [gl_cv_func_wcwidth_works], 43 [ 44 AC_TRY_RUN([ 45#include <locale.h> 46/* AIX 3.2.5 declares wcwidth in <string.h>. */ 47#include <string.h> 48/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before 49 <wchar.h>. 50 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included 51 before <wchar.h>. */ 52#include <stddef.h> 53#include <stdio.h> 54#include <time.h> 55#include <wchar.h> 56#if !HAVE_DECL_WCWIDTH 57extern 58# ifdef __cplusplus 59"C" 60# endif 61int wcwidth (int); 62#endif 63int main () 64{ 65 if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL) 66 if (wcwidth (0x0301) > 0 || wcwidth (0x200B) > 0) 67 return 1; 68 return 0; 69}], [gl_cv_func_wcwidth_works=yes], [gl_cv_func_wcwidth_works=no], 70 [ 71changequote(,)dnl 72 case "$host_os" in 73 # Guess yes on glibc systems. 74 *-gnu*) gl_cv_func_wcwidth_works="guessing yes";; 75 *) gl_cv_func_wcwidth_works="guessing no";; 76 esac 77changequote([,])dnl 78 ]) 79 ]) 80 case "$gl_cv_func_wcwidth_works" in 81 *yes) ;; 82 *no) REPLACE_WCWIDTH=1 ;; 83 esac 84 fi 85 if test $ac_cv_func_wcwidth != yes || test $REPLACE_WCWIDTH = 1; then 86 AC_LIBOBJ([wcwidth]) 87 fi 88 if test $ac_cv_func_wcwidth != yes || test $REPLACE_WCWIDTH = 1 \ 89 || test $HAVE_DECL_WCWIDTH = 0; then 90 gl_REPLACE_WCHAR_H 91 fi 92 dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not 93 dnl have the wcwidth function, then it does not declare it. 94]) 95