diff --git a/src/kits/support/utf8_conversions.cpp b/src/kits/support/utf8_conversions.cpp index b6f8fb3954..bef8857b6c 100644 --- a/src/kits/support/utf8_conversions.cpp +++ b/src/kits/support/utf8_conversions.cpp @@ -4,10 +4,41 @@ #include #include #include +#include using namespace BPrivate; -typedef char ** input_buffer_t; +typedef const char ** input_buffer_t; + +status_t +convert_encoding(const char * from, const char * to, + const char * src, int32 * srcLen, + char * dst, int32 * dstLen, + int32 * state) +{ + iconv_t conversion = iconv_open(to,from); + if (conversion == (iconv_t)-1) { + return B_ERROR; + } + if (state == 0) { + return B_ERROR; + } + if (*state == 0) { + iconv(conversion,0,0,0,0); + *state = 1; + } + input_buffer_t inputBuffer = const_cast(&src); + size_t inputLeft = *srcLen; + size_t outputLeft = *dstLen; + size_t bytesLeft = iconv(conversion,inputBuffer,&inputLeft,&dst,&outputLeft); + *srcLen -= inputLeft; + *dstLen -= outputLeft; + if ((bytesLeft != 0) && (errno != E2BIG) && (errno != EINVAL)) { + return B_ERROR; + } + iconv_close(conversion); + return B_OK; +} status_t convert_to_utf8(uint32 srcEncoding, @@ -17,23 +48,10 @@ convert_to_utf8(uint32 srcEncoding, { const BCharacterSet * charset = BCharacterSetRoster::GetCharacterSetByConversionID(srcEncoding); if (charset == 0) { - return B_ERROR; - } - iconv_t conversion = iconv_open("UTF-8",charset->GetName()); - if (conversion == (iconv_t)-1) { + cout << "no charset for #: " << srcEncoding << endl; return B_ERROR; } - input_buffer_t inputBuffer = const_cast(&src); - size_t charsLeft = *dstLen; - size_t inputLength = *srcLen; - size_t bytesLeft = iconv(conversion,inputBuffer,&inputLength,&dst,&charsLeft); - *srcLen = inputLength; - *dstLen -= charsLeft; - if ((bytesLeft != 0) && (errno != E2BIG) && (errno != EINVAL)) { - return B_ERROR; - } - iconv_close(conversion); - return B_OK; + return convert_encoding(charset->GetName(),"UTF-8",src,srcLen,dst,dstLen,state); } status_t @@ -44,21 +62,8 @@ convert_from_utf8(uint32 dstEncoding, { const BCharacterSet * charset = BCharacterSetRoster::GetCharacterSetByConversionID(dstEncoding); if (charset == 0) { + cout << "no charset for #: " << dstEncoding << endl; return B_ERROR; } - iconv_t conversion = iconv_open(charset->GetName(),"UTF-8"); - if (conversion == (iconv_t)-1) { - return B_ERROR; - } - input_buffer_t inputBuffer = const_cast(&src); - size_t charsLeft = *dstLen; - size_t inputLength = *srcLen; - size_t bytesLeft = iconv(conversion,inputBuffer,&inputLength,&dst,&charsLeft); - *srcLen = inputLength; - *dstLen -= charsLeft; - if ((bytesLeft != 0) && (errno != E2BIG) && (errno != EINVAL)) { - return B_ERROR; - } - iconv_close(conversion); - return B_OK; + return convert_encoding("UTF-8",charset->GetName(),src,srcLen,dst,dstLen,state); }