LibC: Define locale_t as an poiter

A lot of ports seem to depend on this casting nullptr into locale_t
This commit is contained in:
2026-07-20 04:07:23 +03:00
parent 4df58c5155
commit 511ab7e99c
6 changed files with 108 additions and 82 deletions
+15 -15
View File
@@ -45,19 +45,19 @@ size_t wcrtomb(char* __restrict s, wchar_t ws, mbstate_t* __restrict ps)
if (s == nullptr)
return 1;
switch (__getlocale(LC_CTYPE))
switch (__getlocale(LC_CTYPE)->encoding)
{
case locale_t::LOCALE_INVALID:
ASSERT_NOT_REACHED();
case locale_t::LOCALE_POSIX:
case __ENC_ASCII:
if (ws > 0x7F)
break;
*s = ws;
return 1;
case locale_t::LOCALE_UTF8:
case __ENC_UTF8:
if (!BAN::UTF8::from_codepoints(&ws, 1, s))
break;
return BAN::UTF8::byte_length(s[0]);
default:
ASSERT_NOT_REACHED();
}
errno = EILSEQ;
@@ -74,17 +74,17 @@ size_t mbrtowc(wchar_t* __restrict pwc, const char* __restrict s, size_t n, mbst
const auto locale = __getlocale(LC_CTYPE);
size_t bytes = -1;
switch (locale)
switch (locale->encoding)
{
case locale_t::LOCALE_INVALID:
ASSERT_NOT_REACHED();
case locale_t::LOCALE_POSIX:
case __ENC_ASCII:
bytes = 1;
break;
case locale_t::LOCALE_UTF8:
case __ENC_UTF8:
if (auto b = BAN::UTF8::byte_length(s[0]); b != BAN::UTF8::invalid)
bytes = b;
break;
default:
ASSERT_NOT_REACHED();
}
if (bytes == static_cast<size_t>(-1))
@@ -97,17 +97,17 @@ size_t mbrtowc(wchar_t* __restrict pwc, const char* __restrict s, size_t n, mbst
return -1;
wchar_t codepoint = WEOF;
switch (locale)
switch (locale->encoding)
{
case locale_t::LOCALE_INVALID:
ASSERT_NOT_REACHED();
case locale_t::LOCALE_POSIX:
case __ENC_ASCII:
codepoint = s[0];
break;
case locale_t::LOCALE_UTF8:
case __ENC_UTF8:
if (auto cp = BAN::UTF8::to_codepoint(s); cp != BAN::UTF8::invalid)
codepoint = cp;
break;
default:
ASSERT_NOT_REACHED();
}
if (codepoint == WEOF)