- if (buf)
- {
- // have destination buffer, convert there
-#ifdef WX_ICONV_TAKES_CHAR
- cres = iconv( w2m, (char**)&psz, &inbuf, &buf, &outbuf );
-#else
- cres = iconv( w2m, (const char**)&psz, &inbuf, &buf, &outbuf );
-#endif
- res = n-outbuf;
- }
- else
- {
- // no destination buffer... convert using temp buffer
- // to calculate destination buffer requirement
- char tbuf[16];
- res = 0;
- do {
- buf = tbuf; outbuf = 16;
-#ifdef WX_ICONV_TAKES_CHAR
- cres = iconv( w2m, (char**)&psz, &inbuf, &buf, &outbuf );
-#else
- cres = iconv( w2m, (const char**)&psz, &inbuf, &buf, &outbuf );
-#endif
- res += 16 - outbuf;
- } while ((cres==(size_t)-1) && (errno==E2BIG));
- }
+ if (ms_wcNeedsSwap)
+ {
+ // need to copy to temp buffer to switch endianness
+ // this absolutely doesn't rock!
+ // (no, doing WC_BSWAP twice on the original buffer won't help, as it
+ // could be in read-only memory, or be accessed in some other thread)
+ tmpbuf=(wchar_t*)malloc((inbuf+1)*SIZEOF_WCHAR_T);
+ memcpy(tmpbuf,psz,(inbuf+1)*SIZEOF_WCHAR_T);
+ WC_BSWAP(tmpbuf, inbuf)
+ psz=tmpbuf;
+ }