From 94f1e6b0c62dbcbac64a20d7a8df3a4f18e75027 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Sun, 7 Aug 2016 23:35:04 +0300 Subject: [PATCH] Fixed length calculation and added a test. --- include/boost/detail/utf8_codecvt_facet.ipp | 2 +- test/test_utf8_codecvt.cpp | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/boost/detail/utf8_codecvt_facet.ipp b/include/boost/detail/utf8_codecvt_facet.ipp index 7a211c3..753466b 100644 --- a/include/boost/detail/utf8_codecvt_facet.ipp +++ b/include/boost/detail/utf8_codecvt_facet.ipp @@ -204,7 +204,7 @@ BOOST_UTF8_DECL int utf8_codecvt_facet::do_length( last_octet_count = (get_octet_count(*from_next)); ++char_count; } - return static_cast(from_next-from_end); + return static_cast(from_next-from); } BOOST_UTF8_DECL unsigned int utf8_codecvt_facet::get_octet_count( diff --git a/test/test_utf8_codecvt.cpp b/test/test_utf8_codecvt.cpp index 4702c25..8edfb04 100644 --- a/test/test_utf8_codecvt.cpp +++ b/test/test_utf8_codecvt.cpp @@ -29,7 +29,7 @@ namespace std{ using ::wcslen; #if !defined(UNDER_CE) && !defined(__PGIC__) using ::w_int; -#endif +#endif } // namespace std #endif @@ -251,6 +251,16 @@ test_main(int /* argc */, char * /* argv */[]) { ) ); } + + // Test length calculation + { + std::codecvt const& fac = std::use_facet< std::codecvt >(utf8_locale); + std::mbstate_t mbs = std::mbstate_t(); + const int utf8_len = sizeof(td::utf8_encoding) / sizeof(*td::utf8_encoding); + int res = fac.length(mbs, reinterpret_cast< const char* >(td::utf8_encoding), reinterpret_cast< const char* >(td::utf8_encoding + utf8_len), ~static_cast< std::size_t >(0u)); + BOOST_TEST_EQ(utf8_len, res); + } + return EXIT_SUCCESS; }