Windows port for __codecvt_utf8<wchar_t>.
llvm-svn: 185849
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 271426e6abe83a87644e7aee721e303ae4abdaf9
diff --git a/src/locale.cpp b/src/locale.cpp
index b15f077..47c4061 100644
--- a/src/locale.cpp
+++ b/src/locale.cpp
@@ -3201,14 +3201,25 @@
const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
{
+#if _WIN32
+ const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
+ const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
+ const uint16_t* _frm_nxt = _frm;
+#else
const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
const uint32_t* _frm_nxt = _frm;
+#endif
uint8_t* _to = reinterpret_cast<uint8_t*>(to);
uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
uint8_t* _to_nxt = _to;
+#if _WIN32
+ result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
+ _Maxcode_, _Mode_);
+#else
result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
_Maxcode_, _Mode_);
+#endif
frm_nxt = frm + (_frm_nxt - _frm);
to_nxt = to + (_to_nxt - _to);
return r;
@@ -3222,11 +3233,19 @@
const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
const uint8_t* _frm_nxt = _frm;
+#if _WIN32
+ uint16_t* _to = reinterpret_cast<uint16_t*>(to);
+ uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
+ uint16_t* _to_nxt = _to;
+ result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
+ _Maxcode_, _Mode_);
+#else
uint32_t* _to = reinterpret_cast<uint32_t*>(to);
uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
uint32_t* _to_nxt = _to;
result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
_Maxcode_, _Mode_);
+#endif
frm_nxt = frm + (_frm_nxt - _frm);
to_nxt = to + (_to_nxt - _to);
return r;
diff --git a/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp b/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
index 20ecc42..bcfb16e 100644
--- a/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
+++ b/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
@@ -45,14 +45,14 @@
test_buf f(bs.rdbuf());
assert(f.sbumpc() == L'1');
assert(f.sgetc() == L'2');
- assert(f.pbackfail(L'a') == -1);
+ assert(f.pbackfail(L'a') == test_buf::traits_type::eof());
}
{
std::fstream bs("underflow.dat");
test_buf f(bs.rdbuf());
assert(f.sbumpc() == L'1');
assert(f.sgetc() == L'2');
- assert(f.pbackfail(L'a') == -1);
+ assert(f.pbackfail(L'a') == test_buf::traits_type::eof());
assert(f.sbumpc() == L'2');
assert(f.sgetc() == L'3');
}
diff --git a/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp b/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
index 1354c05..9c08a35 100644
--- a/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
+++ b/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
@@ -79,6 +79,6 @@
assert(f.sbumpc() == 0x4E51);
assert(f.sbumpc() == 0x4E52);
assert(f.sbumpc() == 0x4E53);
- assert(f.sbumpc() == -1);
+ assert(f.sbumpc() == test_buf::traits_type::eof());
}
}