LibC: Implement mbtowc
This commit is contained in:
parent
66fe2f2e50
commit
07e4e764a0
|
@ -570,6 +570,45 @@ int mblen(const char* s, size_t n)
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mbtowc(wchar_t* __restrict pwc, const char* __restrict s, size_t n)
|
||||||
|
{
|
||||||
|
// no state-dependent encodings
|
||||||
|
if (s == nullptr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (__getlocale(LC_CTYPE))
|
||||||
|
{
|
||||||
|
case LOCALE_INVALID:
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
case LOCALE_POSIX:
|
||||||
|
if (pwc != nullptr)
|
||||||
|
*pwc = *s;
|
||||||
|
return *s ? 1 : 0;
|
||||||
|
case LOCALE_UTF8:
|
||||||
|
const auto* us = reinterpret_cast<const unsigned char*>(s);
|
||||||
|
|
||||||
|
const uint32_t length = BAN::UTF8::byte_length(*us);
|
||||||
|
if (length == BAN::UTF8::invalid || n < length)
|
||||||
|
{
|
||||||
|
errno = EILSEQ;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto wch = BAN::UTF8::to_codepoint(us);
|
||||||
|
if (wch == BAN::UTF8::invalid)
|
||||||
|
{
|
||||||
|
errno = EILSEQ;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pwc)
|
||||||
|
*pwc = wch;
|
||||||
|
|
||||||
|
return wch ? length : 0;
|
||||||
|
}
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
size_t mbstowcs(wchar_t* __restrict pwcs, const char* __restrict s, size_t n)
|
size_t mbstowcs(wchar_t* __restrict pwcs, const char* __restrict s, size_t n)
|
||||||
{
|
{
|
||||||
size_t written = 0;
|
size_t written = 0;
|
||||||
|
|
Loading…
Reference in New Issue