X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmbswidth.c;h=3c54133a99005e5d31e1c29aecb0de09a58b17b3;hb=3d45e2853ce7ba93f0c2a84f88a200aa3fb4392c;hp=f196ac18dc21e4c342fef6bd4ccb631a97fc719d;hpb=3bd332e0480039351f7af17df00264bf5ee732d7;p=gnulib.git diff --git a/lib/mbswidth.c b/lib/mbswidth.c index f196ac18d..3c54133a9 100644 --- a/lib/mbswidth.c +++ b/lib/mbswidth.c @@ -1,10 +1,10 @@ /* Determine the number of screen columns needed for a string. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000-2007 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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. + the Free Software Foundation; either version 3 of the License, 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 @@ -12,82 +12,41 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* Written by Bruno Haible . */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include -/* Get MB_LEN_MAX. */ -#if HAVE_LIMITS_H -# include -#endif +/* Specification. */ +#include "mbswidth.h" /* Get MB_CUR_MAX. */ -#if HAVE_STDLIB_H -# include -#endif +#include -#if HAVE_STRING_H -# include -#endif +#include /* Get isprint(). */ #include /* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */ -#if HAVE_WCHAR_H -# include -#endif +#include -/* Get iswprint(). */ -#if HAVE_WCTYPE_H -# include -#endif -#if !defined iswprint && !HAVE_ISWPRINT -# define iswprint(wc) 1 -#endif +/* Get iswcntrl(). */ +#include -/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ -#if HAVE_MBRTOWC && defined mbstate_t -# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) -# define mbsinit(ps) 1 -#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) +#ifndef mbsinit +# if !HAVE_MBSINIT +# define mbsinit(ps) 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)) - -#include "mbswidth.h" - /* Returns the number of columns needed to represent the multibyte character string pointed to by STRING. If a non-printable character - occurs, -1 is returned, unless MBSW_ACCEPT_UNPRINTABLE is specified. - With flags = 0, this is the multibyte analogon of the wcswidth function. */ + occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. + With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is + 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) { @@ -96,8 +55,9 @@ 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, -1 is returned, unless - MBSW_ACCEPT_UNPRINTABLE is specified. */ + non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is + 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) { @@ -106,7 +66,7 @@ mbsnwidth (const char *string, size_t nbytes, int flags) int width; width = 0; -#if HAVE_MBRTOWC && (MB_LEN_MAX > 1) +#if HAVE_MBRTOWC if (MB_CUR_MAX > 1) { while (p < plimit) @@ -152,8 +112,12 @@ mbsnwidth (const char *string, size_t nbytes, int flags) if (bytes == (size_t) -1) /* An invalid multibyte sequence was encountered. */ { - if (flags & MBSW_ACCEPT_INVALID) - break; + if (!(flags & MBSW_REJECT_INVALID)) + { + p++; + width++; + break; + } else return -1; } @@ -161,8 +125,12 @@ mbsnwidth (const char *string, size_t nbytes, int flags) if (bytes == (size_t) -2) /* An incomplete multibyte character at the end. */ { - if (flags & MBSW_ACCEPT_INVALID) - break; + if (!(flags & MBSW_REJECT_INVALID)) + { + p = plimit; + width++; + break; + } else return -1; } @@ -177,8 +145,8 @@ mbsnwidth (const char *string, size_t nbytes, int flags) width += w; else /* An unprintable multibyte character. */ - if (flags & MBSW_ACCEPT_UNPRINTABLE) - width += 1; + if (!(flags & MBSW_REJECT_UNPRINTABLE)) + width += (iswcntrl (wc) ? 0 : 1); else return -1; @@ -196,8 +164,10 @@ mbsnwidth (const char *string, size_t nbytes, int flags) { unsigned char c = (unsigned char) *p++; - if ((flags & MBSW_ACCEPT_UNPRINTABLE) || ISPRINT (c)) + if (isprint (c)) width++; + else if (!(flags & MBSW_REJECT_UNPRINTABLE)) + width += (iscntrl (c) ? 0 : 1); else return -1; }