#include <ctype.h>
#include <errno.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
#include <wctype.h>
#include "rune.h"
#include "runetype.h"
#include "rune_local.h"
#include "_wctrans_local.h"
static _RuneLocale *__runelocale(locale_t);
static int __isctype_wl(wint_t, _RuneType, locale_t);
static _RuneLocale *
__runelocale(locale_t locale)
{
_RuneLocale *rl;
rl = NULL;
if (locale == _LOCALE_UTF8)
rl = _Utf8RuneLocale;
if (rl == NULL)
rl = &_DefaultRuneLocale;
return rl;
}
static int
__isctype_wl(wint_t c, _RuneType f, locale_t locale)
{
_RuneLocale *rl;
_RuneType rt;
rl = __runelocale(locale);
rt = _RUNE_ISCACHED(c) ? rl->rl_runetype[c] : ___runetype_mb(c, rl);
return (rt & f) != 0;
}
int
iswalnum_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_A|_RUNETYPE_D, locale);
}
int
iswalpha_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_A, locale);
}
int
iswblank_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_B, locale);
}
int
iswcntrl_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_C, locale);
}
int
iswdigit_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_D, locale);
}
int
iswgraph_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_G, locale);
}
int
iswlower_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_L, locale);
}
int
iswprint_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_R, locale);
}
int
iswpunct_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_P, locale);
}
int
iswspace_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_S, locale);
}
int
iswupper_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_U, locale);
}
int
iswxdigit_l(wint_t c, locale_t locale)
{
return __isctype_wl(c, _RUNETYPE_X, locale);
}
wint_t
towupper_l(wint_t c, locale_t locale)
{
return _towctrans(c, _wctrans_upper(__runelocale(locale)));
}
wint_t
towlower_l(wint_t c, locale_t locale)
{
return _towctrans(c, _wctrans_lower(__runelocale(locale)));
}
DEF_WEAK(towlower_l);
wctrans_t
wctrans_l(const char *charclass, locale_t locale)
{
_RuneLocale *rl;
int i;
rl = __runelocale(locale);
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) == 0)
return &rl->rl_wctrans[i];
return NULL;
}
wint_t
towctrans_l(wint_t c, wctrans_t desc,
locale_t locale __attribute__((__unused__)))
{
return towctrans(c, desc);
}
int
iswctype_l(wint_t c, wctype_t charclass, locale_t locale)
{
if (charclass == (wctype_t)0)
return 0;
return __isctype_wl(c, ((_WCTypeEntry *)charclass)->te_mask, locale);
}