@@ -25,6 +25,11 @@ enum class MacOSIconvIssue {
2525 No_CN_Support,
2626};
2727
28+ #if defined(BOOST_LOCALE_WITH_ICONV)
29+ # include < cerrno>
30+ # include < iconv.h>
31+ # include " ../src/util/encoding.hpp"
32+ #endif
2833#if defined(BOOST_LOCALE_WITH_ICONV) && defined(__APPLE__)
2934// Reproduce issue #206 to detect faulty IConv
3035static MacOSIconvIssue isFaultyIconv ()
@@ -437,6 +442,47 @@ void test_utf_for()
437442
438443 const std::basic_string<Char> onlyInvalidUtf (2 , utfutf<Char>::bad_char ());
439444 std::cout << " -- Error decoding string of only invalid chars to UTF-8" << std::endl;
445+ #if defined(BOOST_LOCALE_WITH_ICONV)
446+ {
447+ # ifdef _LIBICONV_VERSION
448+ std::cout << _LIBICONV_VERSION << ' \n ' ;
449+ # else
450+ std::cout << " iconv version unknown\n " ;
451+ # endif
452+ std::wstring input = utfutf<wchar_t >::bad ();
453+ iconv_t cd = iconv_open (" UTF-8" , boost::locale::util::utf_name<wchar_t >());
454+ if (cd == (iconv_t )-1 ) {
455+ throw std::runtime_error (" iconv_open failed for encoding: " );
456+ }
457+
458+ std::vector<char > outbuf (50 );
459+ for (size_t offset=0 ; offset < input.size (); ++offset)
460+ std::cout << std::hex << unsigned (input[offset]) << ' ' ;
461+ std::cout << std::endl;
462+ for (size_t offset=0 ; offset < input.size (); ++offset)
463+ {
464+ std::cout << " Offset: " << offset << ' :' << std::hex << unsigned (input[offset]) << std::dec << std::endl;
465+ char * inbuf = const_cast <char *>(reinterpret_cast <const char *>(input.data () + offset));
466+ char * inbuf_start = inbuf;
467+ size_t inbytesleft = (input.size () - offset) * sizeof (wchar_t );
468+ size_t inbytesleft_start = inbytesleft;
469+ char * outptr = outbuf.data ();
470+ size_t outbytesleft = outbuf.size ();
471+ errno = 0 ;
472+ size_t result = iconv (cd, &inbuf, &inbytesleft, &outptr, &outbytesleft);
473+ std::cout << " Errno after: " << errno << std::endl;
474+ std::cout << " Result: " << result << std::endl;
475+ std::cout << " Read bytes: " << (inbuf - inbuf_start) << ' ' << (inbytesleft_start - inbytesleft) " of " << inbytesleft_start << std::endl;
476+ std::cout << " Written bytes: " << (outptr - outbuf.data ()) << ' ' << (outbuf.size () - outbytesleft) << std::endl;
477+ for (int i=0 ; i<(outptr - outbuf.data ()); i++)
478+ {
479+ std::cout << i << ' :' << std::hex << unsigned (static_cast <unsigned char >(outbuf[i])) << std::dec << std::endl;
480+ }
481+ }
482+ iconv_close (cd);
483+ }
484+ #endif
485+
440486 test_error_from_utf<Char>(onlyInvalidUtf, " " , " UTF-8" );
441487 std::cout << " -- Error decoding string of only invalid chars to Latin1" << std::endl;
442488 test_error_from_utf<Char>(onlyInvalidUtf, " " , " Latin1" );
0 commit comments