X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmbswidth.c;h=a207d0f6e36f6afb226695f650ac4b1604929eb6;hb=7fef1769f5bc137624077568f1a5016dbcee2fda;hp=a2ef5b3fdaf5af14677c3cebc2199224ce69a12f;hpb=c907565811f05a2365d1bd7eaa1c2b40b6e1d4cb;p=gnulib.git diff --git a/lib/mbswidth.c b/lib/mbswidth.c index a2ef5b3fd..a207d0f6e 100644 --- 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-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 @@ -13,13 +13,11 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include /* Specification. */ #include "mbswidth.h" @@ -32,20 +30,26 @@ /* Get isprint(). */ #include -/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */ +/* Get mbstate_t, mbrtowc(), mbsinit(). */ #if HAVE_WCHAR_H +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +# include +# include # include #endif -/* Get iswprint(), iswcntrl(). */ +/* Get wcwidth(). */ +#include "wcwidth.h" + +/* Get iswcntrl(). */ #if HAVE_WCTYPE_H # include #endif -#if !defined iswprint && !HAVE_ISWPRINT -# define iswprint(wc) 1 -#endif #if !defined iswcntrl && !HAVE_ISWCNTRL -# define iswcntrl(wc) 0 +# define iswcntrl(wc) (((wc) & ~0x1f) == 0 || (wc) == 0x7f) #endif #ifndef mbsinit @@ -54,38 +58,12 @@ # 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 -#else -# define IN_CTYPE_DOMAIN(c) isascii(c) -#endif -/* Undefine to protect against the definition in wctype.h of solaris2.6. */ -#undef ISPRINT -#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) -#undef ISCNTRL -#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c)) - /* Returns the number of columns needed to represent the multibyte character string pointed to by STRING. If a non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is - the multibyte analogon of the wcswidth function. */ + the multibyte analogue of the wcswidth function. + If STRING is not of length < INT_MAX / 2, integer overflow can occur. */ int mbswidth (const char *string, int flags) { @@ -95,7 +73,8 @@ mbswidth (const char *string, int flags) /* Returns the number of columns needed to represent the multibyte character string pointed to by STRING of length NBYTES. If a non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is - specified, -1 is returned. */ + specified, -1 is returned. + If NBYTES is not < INT_MAX / 2, integer overflow can occur. */ int mbsnwidth (const char *string, size_t nbytes, int flags) { @@ -202,10 +181,10 @@ mbsnwidth (const char *string, size_t nbytes, int flags) { unsigned char c = (unsigned char) *p++; - if (ISPRINT (c)) + if (isprint (c)) width++; else if (!(flags & MBSW_REJECT_UNPRINTABLE)) - width += (ISCNTRL (c) ? 0 : 1); + width += (iscntrl (c) ? 0 : 1); else return -1; }