+
+ void LoadM2W()
+ {
+ if (m2w==(iconv_t)-1)
+ m2w=iconv_open(WC_NAME,wxConvLibc.cWX2MB(cname));
+ }
+
+ void LoadW2M()
+ {
+ if (w2m==(iconv_t)-1)
+ w2m=iconv_open(wxConvLibc.cWX2MB(cname),WC_NAME);
+ }
+
+ size_t MB2WC(wchar_t*buf, const char*psz, size_t n)
+ {
+ LoadM2W();
+ size_t inbuf = strlen(psz);
+ size_t outbuf = n*SIZEOF_WCHAR_T;
+ size_t res, cres;
+ fprintf(stderr,"IC Convert to WC using %s\n",(const char*)wxConvLibc.cWX2MB(cname));
+ if (buf)
+ {
+ // have destination buffer, convert there
+#ifdef WX_ICONV_TAKES_CHAR
+ cres = iconv( m2w, (char**)&psz, &inbuf, (char**)&buf, &outbuf );
+#else
+ cres = iconv( m2w, &psz, &inbuf, (char**)&buf, &outbuf );
+#endif
+ res = n-(outbuf/SIZEOF_WCHAR_T);
+ // convert to native endianness
+ WC_BSWAP(buf, res)
+ }
+ else
+ {
+ // no destination buffer... convert using temp buffer
+ // to calculate destination buffer requirement
+ wchar_t tbuf[8];
+ res = 0;
+ do {
+ buf = tbuf; outbuf = 8*SIZEOF_WCHAR_T;
+#ifdef WX_ICONV_TAKES_CHAR
+ cres = iconv( m2w, (char**)&psz, &inbuf, (char**)&buf, &outbuf );
+#else
+ cres = iconv( m2w, &psz, &inbuf, (char**)&buf, &outbuf );
+#endif
+ res += 8-(outbuf/SIZEOF_WCHAR_T);
+ } while ((cres==(size_t)-1) && (errno==E2BIG));
+ }
+
+ if (cres==(size_t)-1)
+ return (size_t)-1;
+
+ return res;
+ }
+
+ size_t WC2MB(char*buf, const wchar_t*psz, size_t n)
+ {
+ LoadW2M();