#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/locale/nextwctype.c,v 1.1 2004/07/08 06:43:37 tjr Exp $");
#include "xlocale_private.h"
#include <runetype.h>
#include <wchar.h>
#include <wctype.h>
wint_t
nextwctype_l(wint_t wc, wctype_t wct, locale_t loc)
{
size_t lim;
_RuneRange *rr;
_RuneEntry *base, *re;
int noinc;
_RuneLocale *rl = &loc->__lc_ctype->_CurrentRuneLocale;
noinc = 0;
if (wc < _CACHED_RUNES) {
wc++;
while (wc < _CACHED_RUNES) {
if (rl->__runetype[wc] & wct)
return (wc);
wc++;
}
wc--;
}
rr = &rl->__runetype_ext;
if (rr->__ranges != NULL && wc < rr->__ranges[0].__min) {
wc = rr->__ranges[0].__min;
noinc = 1;
}
base = rr->__ranges;
for (lim = rr->__nranges; lim != 0; lim >>= 1) {
re = base + (lim >> 1);
if (re->__min <= wc && wc <= re->__max)
goto found;
else if (wc > re->__max) {
base = re + 1;
lim--;
}
}
return (-1);
found:
if (!noinc)
wc++;
if (re->__min <= wc && wc <= re->__max) {
if (re->__types != NULL) {
for (; wc <= re->__max; wc++)
if (re->__types[wc - re->__min] & wct)
return (wc);
} else if (re->__map & wct)
return (wc);
}
while (++re < rr->__ranges + rr->__nranges) {
wc = re->__min;
if (re->__types != NULL) {
for (; wc <= re->__max; wc++)
if (re->__types[wc - re->__min] & wct)
return (wc);
} else if (re->__map & wct)
return (wc);
}
return (-1);
}
wint_t
nextwctype(wint_t wc, wctype_t wct)
{
return nextwctype_l(wc, wct, __current_locale());
}