diff options
author | Howard Hinnant <hhinnant@apple.com> | 2013-07-08 19:03:07 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2013-07-08 19:03:07 +0000 |
commit | 271426e6abe83a87644e7aee721e303ae4abdaf9 (patch) | |
tree | f3bd454769ef5f0e884921a5bce9969400cad91d | |
parent | 095fee30e89f4070ad59de7b87679e50ee958572 (diff) | |
download | bcm5719-llvm-271426e6abe83a87644e7aee721e303ae4abdaf9.tar.gz bcm5719-llvm-271426e6abe83a87644e7aee721e303ae4abdaf9.zip |
Windows port for __codecvt_utf8<wchar_t>.
llvm-svn: 185849
3 files changed, 22 insertions, 3 deletions
diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index b15f077cfb1..47c406123f0 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -3201,14 +3201,25 @@ __codecvt_utf8<wchar_t>::do_out(state_type&, 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 @@ __codecvt_utf8<wchar_t>::do_in(state_type&, 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/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp b/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp index 20ecc422865..bcfb16e050e 100644 --- a/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp +++ b/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp @@ -45,14 +45,14 @@ int main() 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/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp b/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp index 1354c0532b5..9c08a353fbd 100644 --- a/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp +++ b/libcxx/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp @@ -79,6 +79,6 @@ int main() assert(f.sbumpc() == 0x4E51); assert(f.sbumpc() == 0x4E52); assert(f.sbumpc() == 0x4E53); - assert(f.sbumpc() == -1); + assert(f.sbumpc() == test_buf::traits_type::eof()); } } |