#include <wchar.h>
#include <wctype.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
#include "rune.h"
#include "runetype.h"
#include "rune_local.h"
#include "_wctrans_local.h"
static inline _RuneType __runetype_w(wint_t);
static inline int __isctype_w(wint_t, _RuneType);
static inline wint_t __toupper_w(wint_t);
static inline wint_t __tolower_w(wint_t);
static inline _RuneType
__runetype_w(wint_t c)
{
_RuneLocale *rl = _CurrentRuneLocale();
return (_RUNE_ISCACHED(c) ?
rl->rl_runetype[c] : ___runetype_mb(c, rl));
}
static inline int
__isctype_w(wint_t c, _RuneType f)
{
return (!!(__runetype_w(c) & f));
}
static inline wint_t
__toupper_w(wint_t c)
{
return (_towctrans(c, _wctrans_upper(_CurrentRuneLocale())));
}
static inline wint_t
__tolower_w(wint_t c)
{
return (_towctrans(c, _wctrans_lower(_CurrentRuneLocale())));
}
int
iswalnum(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_A|_RUNETYPE_D));
}
int
iswalpha(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_A));
}
int
iswblank(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_B));
}
int
iswcntrl(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_C));
}
int
iswdigit(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_D));
}
int
iswgraph(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_G));
}
int
iswlower(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_L));
}
int
iswprint(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_R));
}
int
iswpunct(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_P));
}
int
iswspace(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_S));
}
DEF_STRONG(iswspace);
int
iswupper(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_U));
}
DEF_STRONG(iswupper);
int
iswxdigit(wint_t c)
{
return (__isctype_w((c), _RUNETYPE_X));
}
wint_t
towupper(wint_t c)
{
return (__toupper_w(c));
}
wint_t
towlower(wint_t c)
{
return (__tolower_w(c));
}
DEF_STRONG(towlower);
int
wcwidth(wchar_t c)
{
if (c == L'\0')
return 0;
if (__isctype_w((c), _RUNETYPE_R))
return (((unsigned)__runetype_w(c) & _RUNETYPE_SWM) >>
_RUNETYPE_SWS);
return -1;
}
DEF_WEAK(wcwidth);
wctrans_t
wctrans(const char *charclass)
{
int i;
_RuneLocale *rl = _CurrentRuneLocale();
if (rl->rl_wctrans[_WCTRANS_INDEX_LOWER].te_name==NULL)
_wctrans_init(rl);
for (i=0; i<_WCTRANS_NINDEXES; i++)
if (!strcmp(rl->rl_wctrans[i].te_name, charclass))
return ((wctrans_t)&rl->rl_wctrans[i]);
return ((wctrans_t)NULL);
}
wint_t
towctrans(wint_t c, wctrans_t desc)
{
if (desc==NULL) {
errno = EINVAL;
return (c);
}
return (_towctrans(c, (_WCTransEntry *)desc));
}
DEF_STRONG(towctrans);
int
iswctype(wint_t c, wctype_t charclass)
{
if (charclass == (wctype_t)0) {
return 0;
}
return (__isctype_w(c, ((_WCTypeEntry *)charclass)->te_mask));
}