+ cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf );
+
+ res += 16 - outbuf;
+ } while ((cres==(size_t)-1) && (errno==E2BIG));
+ }
+
+ if (ms_wcNeedsSwap)
+ {
+ free(tmpbuf);
+ }
+
+ if (ICONV_FAILED(cres, inbuf))
+ {
+ //VS: it is ok if iconv fails, hence trace only
+ wxLogTrace(wxT("strconv"), wxT("iconv failed: %s"), wxSysErrorMsg(wxSysErrorCode()));
+ return (size_t)-1;
+ }
+
+ return res;
+}
+
+#endif // HAVE_ICONV
+
+
+// ============================================================================
+// Win32 conversion classes
+// ============================================================================
+
+#ifdef wxHAVE_WIN32_MB2WC
+
+// from utils.cpp
+extern WXDLLIMPEXP_BASE long wxCharsetToCodepage(const wxChar *charset);
+extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding);
+
+class wxMBConv_win32 : public wxMBConv
+{
+public:
+ wxMBConv_win32()
+ {
+ m_CodePage = CP_ACP;
+ }
+
+ wxMBConv_win32(const wxChar* name)
+ {
+ m_CodePage = wxCharsetToCodepage(name);
+ }
+
+ wxMBConv_win32(wxFontEncoding encoding)
+ {
+ m_CodePage = wxEncodingToCodepage(encoding);
+ }
+
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const
+ {
+ const size_t len = ::MultiByteToWideChar
+ (
+ m_CodePage, // code page
+ 0, // flags (none)
+ psz, // input string
+ -1, // its length (NUL-terminated)
+ buf, // output string
+ buf ? n : 0 // size of output buffer
+ );
+
+ // note that it returns count of written chars for buf != NULL and size
+ // of the needed buffer for buf == NULL so in either case the length of
+ // the string (which never includes the terminating NUL) is one less
+ return len ? len - 1 : (size_t)-1;
+ }
+
+ size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const
+ {
+ const size_t len = ::WideCharToMultiByte
+ (
+ m_CodePage, // code page
+ 0, // flags (none)
+ psz, // input string
+ -1, // it is (wide) NUL-terminated
+ buf, // output buffer
+ buf ? n : 0, // and its size
+ NULL, // default "replacement" char
+ NULL // [out] was it used?
+ );
+
+ // see the comment above for the reason of "len - 1"
+ return len ? len - 1 : (size_t)-1;
+ }
+
+ bool IsOk() const
+ { return m_CodePage != -1; }
+
+public:
+ long m_CodePage;
+};
+
+#endif // wxHAVE_WIN32_MB2WC
+
+
+// ============================================================================
+// wxEncodingConverter based conversion classes
+// ============================================================================