-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 According to Bruno Haible on 6/27/2006 12:15 PM: >> I note that mbswidth.c takes precautions to ensure wcwidth exists; >> should we break that out into a wcwidth module and make both mbchar and >> mbswidth depend on it? > > This would make sense, yes. I'm normally not fond of major changes > that avoid an "implicit declaration of function" warning of a function > that returns 'int' anyway. But here we have gone through the trouble > of doing it right already in mbswidth.c - why not reuse this technique.
OK, applied as follows based on your feedback, after testing in both cygwin (which has wcwidth) and mingw (which has iswprint, but not wcwidth). If there is any fallout, we can add further patches later. By the way, is it safe to assume wchar_t exists, or should wcwidth pull in m4/wchar_t.m4? Also, on mingw, where sizeof(wchar_t)==2 but sizeof(int)==4, a prototype of int wcwidth() is incompatible with a declaration of int wcwidth(wchar_t wc) because of promotion rules. 2006-06-28 Eric Blake <[EMAIL PROTECTED]> * modules/wcwidth: New file. * modules/mbchar (Depends-on): Add wcwidth. * modules/mbswidth (Depends-on): Add wcwidth. * MODULES.html.sh: Add wcwidth. 2006-06-28 Eric Blake <[EMAIL PROTECTED]> * mbchar.h (wcwidth): Include wcwidth.h. * mbswidth.c (wcwidth): Move from here... * wcwidth.h: ...to this new file. 2006-06-28 Eric Blake <[EMAIL PROTECTED]> * mbswidth.m4 (gl_MBSDWIDTH): Move wcwidth from here... * wcwidth.m4 (gl_FUNC_WCWIDTH): ...to this new file. - -- Life is short - so eat dessert first! Eric Blake [EMAIL PROTECTED] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.1 (Cygwin) Comment: Public key at home.comcast.net/~ericblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFEon7w84KuGfSFAYARAsT1AJ4qlkfCp+/rIwjVwq8FUs9V57er4ACfSSw4 17OsMd39JW8XI0oqc4xJk1E= =MRhe -----END PGP SIGNATURE-----
Index: lib/wcwidth.h =================================================================== RCS file: lib/wcwidth.h diff -N lib/wcwidth.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/wcwidth.h 28 Jun 2006 12:59:33 -0000 @@ -0,0 +1,52 @@ +/* Determine the number of screen columns needed for a character. + Copyright (C) 2006 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 + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _gl_WCWIDTH_H +#define _gl_WCWIDTH_H + +/* Get wcwidth if available, along with wchar_t. */ +#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 + +/* Get iswprint. */ +#if HAVE_WCTYPE_H +# include <wctype.h> +#endif +#if !defined iswprint && !HAVE_ISWPRINT +# define iswprint(wc) 1 +#endif + +#if !defined wcwidth && !HAVE_WCWIDTH + +/* wcwidth doesn't exist, so assume all printable characters have + width 1. */ +static inline int +wcwidth (wchar_t wc) +{ + return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; +} + +#endif + +#endif /* _gl_WCWIDTH_H */ Index: lib/mbchar.h =================================================================== RCS file: /sources/gnulib/gnulib/lib/mbchar.h,v retrieving revision 1.2 diff -u -p -r1.2 mbchar.h --- lib/mbchar.h 16 Aug 2005 16:07:59 -0000 1.2 +++ lib/mbchar.h 28 Jun 2006 12:59:33 -0000 @@ -1,5 +1,5 @@ /* Multibyte character data type. - Copyright (C) 2001, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2005-2006 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 @@ -158,6 +158,8 @@ #include <wctype.h> +#include "wcwidth.h" + #define MBCHAR_BUF_SIZE 24 struct mbchar Index: lib/mbswidth.c =================================================================== RCS file: /sources/gnulib/gnulib/lib/mbswidth.c,v retrieving revision 1.14 diff -u -p -r1.14 mbswidth.c --- lib/mbswidth.c 14 May 2005 06:03:58 -0000 1.14 +++ lib/mbswidth.c 28 Jun 2006 12:59:33 -0000 @@ -1,5 +1,5 @@ /* Determine the number of screen columns needed for a string. - Copyright (C) 2000-2005 Free Software Foundation, Inc. + Copyright (C) 2000-2006 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 @@ -33,23 +33,9 @@ #include <ctype.h> /* 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 +#include "wcwidth.h" -/* Get iswprint(), iswcntrl(). */ -#if HAVE_WCTYPE_H -# include <wctype.h> -#endif -#if !defined iswprint && !HAVE_ISWPRINT -# define iswprint(wc) 1 -#endif +/* Get iswcntrl(). */ #if !defined iswcntrl && !HAVE_ISWCNTRL # define iswcntrl(wc) 0 #endif @@ -60,21 +46,6 @@ # endif #endif -#ifndef HAVE_DECL_WCWIDTH -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_WCWIDTH -int wcwidth (); -#endif - -#ifndef wcwidth -# if !HAVE_WCWIDTH -/* wcwidth doesn't exist, so assume all printable characters have - width 1. */ -# define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1) -# endif -#endif - /* Get ISPRINT. */ #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) # define IN_CTYPE_DOMAIN(c) 1 Index: m4/wcwidth.m4 =================================================================== RCS file: m4/wcwidth.m4 diff -N m4/wcwidth.m4 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ m4/wcwidth.m4 28 Jun 2006 12:59:33 -0000 @@ -0,0 +1,37 @@ +# wcwidth.m4 serial 1 +dnl Copyright (C) 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl autoconf tests required for use of mbswidth.c + +AC_DEFUN([gl_FUNC_WCWIDTH], +[ AC_CHECK_HEADERS_ONCE([wchar.h wctype.h]) + AC_CHECK_FUNCS_ONCE([iswprint wcwidth]) + + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_CACHE_CHECK([whether wcwidth is declared], [ac_cv_have_decl_wcwidth], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +/* AIX 3.2.5 declares wcwidth in <string.h>. */ +#if HAVE_STRING_H +# include <string.h> +#endif +#if HAVE_WCHAR_H +# include <wchar.h> +#endif +], [ +#ifndef wcwidth + char *p = (char *) wcwidth; +#endif +])], [ac_cv_have_decl_wcwidth=yes], [ac_cv_have_decl_wcwidth=no])]) + if test $ac_cv_have_decl_wcwidth = yes; then + ac_val=1 + else + ac_val=0 + fi + AC_DEFINE_UNQUOTED([HAVE_DECL_WCWIDTH], [$ac_val], + [Define to 1 if you have the declaration of wcwidth(), and to 0 + otherwise.]) +]) Index: m4/mbswidth.m4 =================================================================== RCS file: /sources/gnulib/gnulib/m4/mbswidth.m4,v retrieving revision 1.14 diff -u -p -r1.14 mbswidth.m4 --- m4/mbswidth.m4 18 Jan 2005 13:07:56 -0000 1.14 +++ m4/mbswidth.m4 28 Jun 2006 12:59:33 -0000 @@ -1,5 +1,5 @@ -# mbswidth.m4 serial 11 -dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. +# mbswidth.m4 serial 12 +dnl Copyright (C) 2000-2002, 2004, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -9,33 +9,11 @@ dnl From Bruno Haible. AC_DEFUN([gl_MBSWIDTH], [ - AC_CHECK_HEADERS_ONCE(wchar.h wctype.h) - AC_CHECK_FUNCS_ONCE(isascii iswprint mbsinit) - AC_CHECK_FUNCS(iswcntrl wcwidth) + AC_CHECK_HEADERS_ONCE([wchar.h wctype.h]) + AC_CHECK_FUNCS_ONCE([isascii mbsinit]) + AC_CHECK_FUNCS([iswcntrl]) gl_FUNC_MBRTOWC - AC_CACHE_CHECK([whether wcwidth is declared], ac_cv_have_decl_wcwidth, - [AC_TRY_COMPILE([ -/* AIX 3.2.5 declares wcwidth in <string.h>. */ -#if HAVE_STRING_H -# include <string.h> -#endif -#if HAVE_WCHAR_H -# include <wchar.h> -#endif -], [ -#ifndef wcwidth - char *p = (char *) wcwidth; -#endif -], ac_cv_have_decl_wcwidth=yes, ac_cv_have_decl_wcwidth=no)]) - if test $ac_cv_have_decl_wcwidth = yes; then - ac_val=1 - else - ac_val=0 - fi - 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>], Index: modules/wcwidth =================================================================== RCS file: modules/wcwidth diff -N modules/wcwidth --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/wcwidth 28 Jun 2006 12:59:33 -0000 @@ -0,0 +1,23 @@ +Description: +Determine the number of screen columns needed for a character. + +Files: +lib/wcwidth.h +m4/wcwidth.m4 + +Depends-on: + +configure.ac: +gl_FUNC_WCWIDTH + +Makefile.am: +lib_SOURCES += wcwidth.h + +Include: +"wcwidth.h" + +License: +GPL + +Maintainer: +Bruno Haible Index: modules/mbchar =================================================================== RCS file: /sources/gnulib/gnulib/modules/mbchar,v retrieving revision 1.2 diff -u -p -r1.2 mbchar --- modules/mbchar 26 Sep 2005 13:58:51 -0000 1.2 +++ modules/mbchar 28 Jun 2006 12:59:33 -0000 @@ -8,6 +8,7 @@ m4/mbchar.m4 Depends-on: stdbool +wcwidth configure.ac: gl_MBCHAR Index: modules/mbswidth =================================================================== RCS file: /sources/gnulib/gnulib/modules/mbswidth,v retrieving revision 1.4 diff -u -p -r1.4 mbswidth --- modules/mbswidth 22 Sep 2004 15:11:04 -0000 1.4 +++ modules/mbswidth 28 Jun 2006 12:59:33 -0000 @@ -9,6 +9,7 @@ m4/mbrtowc.m4 m4/mbswidth.m4 Depends-on: +wcwidth configure.ac: gl_MBSWIDTH Index: MODULES.html.sh =================================================================== RCS file: /sources/gnulib/gnulib/MODULES.html.sh,v retrieving revision 1.117 diff -u -p -r1.117 MODULES.html.sh --- MODULES.html.sh 21 Jun 2006 10:00:08 -0000 1.117 +++ MODULES.html.sh 28 Jun 2006 12:59:33 -0000 @@ -1811,6 +1811,7 @@ func_all_modules () func_module strtok_r func_module unistd func_module utime + func_module wcwidth func_end_table element="Enhancements for POSIX:2001 functions"