Implement wcwidth() as an inline function.

This commit is contained in:
Tim J. Robbins 2004-08-12 12:19:11 +00:00
parent b9de27c005
commit de6c9c9d5b
3 changed files with 20 additions and 11 deletions

View File

@ -67,6 +67,8 @@
#define _CTYPE_SW1 0x40000000L /* 1 width character */
#define _CTYPE_SW2 0x80000000L /* 2 width character */
#define _CTYPE_SW3 0xc0000000L /* 3 width character */
#define _CTYPE_SWM 0xe0000000L /* Mask for screen width data */
#define _CTYPE_SWS 30 /* Bits to shift to get width */
/* See comments in <sys/_types.h> about __ct_rune_t. */
__BEGIN_DECLS
@ -127,6 +129,19 @@ __tolower(__ct_rune_t _c)
_CurrentRuneLocale->__maplower[_c];
}
static __inline int
__wcwidth(__ct_rune_t _c)
{
unsigned int _x;
if (_c == 0)
return (0);
_x = (unsigned int)__maskrune(_c, _CTYPE_SWM|_CTYPE_R);
if ((_x & _CTYPE_SWM) != 0)
return ((_x & _CTYPE_SWM) >> _CTYPE_SWS);
return ((_x & _CTYPE_R) != 0 ? 1 : -1);
}
#else /* not using inlines */
__BEGIN_DECLS
@ -135,6 +150,7 @@ int __istype(__ct_rune_t, unsigned long);
int __isctype(__ct_rune_t, unsigned long);
__ct_rune_t __toupper(__ct_rune_t);
__ct_rune_t __tolower(__ct_rune_t);
int __wcwidth(__ct_rune_t);
__END_DECLS
#endif /* using inlines */

View File

@ -71,6 +71,7 @@
#include <sys/_null.h>
#include <sys/_types.h>
#include <machine/_limits.h>
#include <_ctype.h>
#ifndef _MBSTATE_T_DECLARED
typedef __mbstate_t mbstate_t;
@ -206,6 +207,7 @@ unsigned long long
#if __XSI_VISIBLE
int wcswidth(const wchar_t *, size_t);
int wcwidth(wchar_t);
#define wcwidth(_c) __wcwidth(_c)
#endif
#if __BSD_VISIBLE

View File

@ -43,21 +43,12 @@
__FBSDID("$FreeBSD$");
#include <wchar.h>
#include <wctype.h>
#define _CTYPE_SWM 0xe0000000L /* Mask to get screen width data */
#define _CTYPE_SWS 30 /* Bits to shift to get width */
#undef wcwidth
int
wcwidth(wchar_t wc)
{
unsigned int x;
if (wc == L'\0')
return (0);
x = (unsigned int)__maskrune(wc, _CTYPE_SWM|_CTYPE_R);
if ((x & _CTYPE_SWM) != 0)
return ((x & _CTYPE_SWM) >> _CTYPE_SWS);
return ((x & _CTYPE_R) != 0 ? 1 : -1);
return (__wcwidth(wc));
}