changeset 4976:4df6aeb9a5c5

Fix portability problem with Tru64 and BSD/OS.
author Bruno Haible <bruno@clisp.org>
date Thu, 18 Mar 2004 13:36:53 +0000
parents 46784934e2d8
children f8d28ac258d6
files lib/ChangeLog lib/mbswidth.c lib/mbswidth.h m4/ChangeLog m4/mbswidth.m4
diffstat 5 files changed, 48 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,10 @@
+2004-03-18  Paul Eggert  <eggert@twinsun.com>
+            Bruno Haible  <bruno@clisp.org>
+
+	* mbswidth.h: Include <wchar.h> only if HAVE_DECL_MBSWIDTH_IN_WCHAR_H,
+	not on all platforms that have <wchar.h>.
+	* mbswidth.c: Include <stdio.h> and <time.h> before <wchar.h>.
+
 2004-03-09  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* argp-parse.c, getopt.c, getopt.h, getopt1.c:
--- a/lib/mbswidth.c
+++ b/lib/mbswidth.c
@@ -1,5 +1,5 @@
 /* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2002 Free Software Foundation, Inc.
+   Copyright (C) 2000-2004 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -34,6 +34,12 @@
 
 /* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth().  */
 #if HAVE_WCHAR_H
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+   <wchar.h>.  */
+# include <stdio.h>
+# include <time.h>
 # include <wchar.h>
 #endif
 
--- a/lib/mbswidth.h
+++ b/lib/mbswidth.h
@@ -1,5 +1,5 @@
 /* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+   Copyright (C) 2000-2004 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -19,8 +19,13 @@
 
 /* Avoid a clash of our mbswidth() with a function of the same name defined
    in UnixWare 7.1.1 <wchar.h>.  We need this #include before the #define
-   below.  */
-#if HAVE_WCHAR_H
+   below.
+   However, we don't want to #include <wchar.h> on all platforms because
+   - Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+     <wchar.h>.
+   - BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+     <wchar.h>.  */
+#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
 # include <wchar.h>
 #endif
 
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,9 @@
+2004-03-18  Paul Eggert  <eggert@twinsun.com>
+            Bruno Haible  <bruno@clisp.org>
+
+	* mbswidth.m4 (gl_MBSWIDTH): Also test whether <wchar.h> declares
+	mbswidth.
+
 2004-03-07  Paul Eggert  <eggert@twinsun.com>
 
 	* c-stack.m4 (gl_PREREQ_C_STACK): Renamed from jm_PREREQ_C_STACK.
--- a/m4/mbswidth.m4
+++ b/m4/mbswidth.m4
@@ -1,4 +1,4 @@
-#serial 9
+#serial 10
 
 dnl autoconf tests required for use of mbswidth.c
 dnl From Bruno Haible.
@@ -32,5 +32,24 @@
   AC_DEFINE_UNQUOTED(HAVE_DECL_WCWIDTH, $ac_val,
     [Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.])
 
+  dnl UnixWare 7.1.1 <wchar.h> has a declaration of a function mbswidth()
+  dnl that clashes with ours.
+  AC_CACHE_CHECK([whether mbswidth is declared in <wchar.h>],
+    ac_cv_have_decl_mbswidth,
+    [AC_TRY_COMPILE([
+#if HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+], [
+  char *p = (char *) mbswidth;
+], ac_cv_have_decl_mbswidth=yes, ac_cv_have_decl_mbswidth=no)])
+  if test $ac_cv_have_decl_mbswidth = yes; then
+    ac_val=1
+  else
+    ac_val=0
+  fi
+  AC_DEFINE_UNQUOTED(HAVE_DECL_MBSWIDTH_IN_WCHAR_H, $ac_val,
+    [Define to 1 if you have a declaration of mbswidth() in <wchar.h>, and to 0 otherwise.])
+
   AC_TYPE_MBSTATE_T
 ])