diff --git a/src/libimp/codecvt.cpp b/src/libimp/codecvt.cpp index b10c5b5..d9411be 100644 --- a/src/libimp/codecvt.cpp +++ b/src/libimp/codecvt.cpp @@ -3,4 +3,35 @@ #include "libimp/platform/win/codecvt.h" #else #include "libimp/platform/posix/codecvt.h" -#endif \ No newline at end of file +#endif + +#include +#include + +LIBIMP_NAMESPACE_BEG_ + +namespace { + +template +std::size_t cpy_cstr(CharT *des, std::size_t dlen, CharT const *src, std::size_t slen) noexcept { + if ((des == nullptr) || (dlen == 0)) { + return slen; + } + std::size_t r = (std::min)(slen, dlen); + std::memcpy(des, src, r * sizeof(CharT)); + return r; +} + +} // namespace + +template <> +std::size_t cvt_cstr(char const *src, std::size_t slen, char *des, std::size_t dlen) noexcept { + return cpy_cstr(des, dlen, src, slen); +} + +template <> +std::size_t cvt_cstr(wchar_t const *src, std::size_t slen, wchar_t *des, std::size_t dlen) noexcept { + return cpy_cstr(des, dlen, src, slen); +} + +LIBIMP_NAMESPACE_END_ diff --git a/test/test_imp_codecvt.cpp b/test/test_imp_codecvt.cpp index 722d58c..34d5b12 100644 --- a/test/test_imp_codecvt.cpp +++ b/test/test_imp_codecvt.cpp @@ -22,8 +22,22 @@ TEST(codecvt, cvt_cstr) { { auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (char *)nullptr, 0); EXPECT_NE(cvt_len, 0); - std::string str(cvt_len, L'\0'); + std::string str(cvt_len, '\0'); EXPECT_EQ(imp::cvt_cstr(utf16, std::wcslen(utf16), &str[0], str.size()), cvt_len); EXPECT_STREQ(str.c_str(), utf8); } + { + auto cvt_len = imp::cvt_cstr(utf8, std::strlen(utf8), (char *)nullptr, 0); + EXPECT_EQ(cvt_len, std::strlen(utf8)); + std::string str(cvt_len, '\0'); + EXPECT_EQ(imp::cvt_cstr(utf8, cvt_len, &str[0], str.size()), cvt_len); + EXPECT_STREQ(str.c_str(), utf8); + } + { + auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (wchar_t *)nullptr, 0); + EXPECT_EQ(cvt_len, std::wcslen(utf16)); + std::wstring wstr(cvt_len, L'\0'); + EXPECT_EQ(imp::cvt_cstr(utf16, cvt_len, &wstr[0], wstr.size()), cvt_len); + EXPECT_STREQ(wstr.c_str(), utf16); + } } \ No newline at end of file