#include <string.h>
#include <stdlib.h>
+#include "wx/module.h"
#include "wx/strconv.h"
// ----------------------------------------------------------------------------
WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc;
+class wxStrConvModule: public wxModule
+{
+public:
+ wxStrConvModule() : wxModule() { }
+ virtual bool OnInit() { return TRUE; }
+ virtual void OnExit()
+ {
+#if wxUSE_WCHAR_T
+ wxConvLocal.Clear();
+#endif
+ }
+
+ DECLARE_DYNAMIC_CLASS(wxStrConvModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxStrConvModule, wxModule)
+
+
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
{
if (input<=0xffff)
{
- if (output) *output++ = input;
+ if (output) *output++ = (wchar_t) input;
return 1;
}
else if (input>=0x110000)
{
if (output)
{
- *output++ = (input >> 10)+0xd7c0;
- *output++ = (input&0x3ff)+0xdc00;
+ *output++ = (wchar_t) ((input >> 10)+0xd7c0);
+ *output++ = (wchar_t) ((input&0x3ff)+0xdc00);
}
return 2;
}
// wxMBConv
// ----------------------------------------------------------------------------
+#define IGNORE_LIBC 0
+
size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
+#if IGNORE_LIBC
+ if (buf)
+ {
+ for (size_t i = 0; i < strlen( psz )+1; i++)
+ buf[i] = (wchar_t) psz[i];
+ return strlen( psz );
+ }
+ else
+ {
+ return strlen( psz );
+ }
+#else
return wxMB2WC(buf, psz, n);
+#endif
}
size_t wxMBConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
{
+#if IGNORE_LIBC
+ if (buf)
+ {
+ for (size_t i = 0; i < wxStrlen( psz )+1; i++)
+ buf[i] = (char) psz[i];
+ return wxStrlen( psz );
+ }
+ else
+ {
+ return wxStrlen( psz );
+ }
+#else
return wxWC2MB(buf, psz, n);
+#endif
}
const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const
{
if (psz)
{
- size_t nLen = MB2WC((wchar_t *) NULL, psz, 0);
+ size_t nLen = MB2WC((wchar_t *) NULL, psz, 0); // return value excludes /0
if (nLen == (size_t)-1)
return wxWCharBuffer((wchar_t *) NULL);
- wxWCharBuffer buf(nLen);
- MB2WC((wchar_t *)(const wchar_t *) buf, psz, nLen);
+ wxWCharBuffer buf(nLen); // this allocates nLen1+
+ MB2WC((wchar_t *)(const wchar_t *) buf, psz, nLen+1);
return buf;
}
else
return wxWCharBuffer((wchar_t *) NULL);
}
-const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *psz) const
+const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
{
- if (psz)
- {
- size_t nLen = WC2MB((char *) NULL, psz, 0);
- if (nLen == (size_t)-1)
- return wxCharBuffer((char *) NULL);
- wxCharBuffer buf(nLen);
- WC2MB((char *)(const char *) buf, psz, nLen);
- return buf;
- }
- else
- return wxCharBuffer((char *) NULL);
-}
-
-// ----------------------------------------------------------------------------
-// standard file conversion
-// ----------------------------------------------------------------------------
-
-WXDLLEXPORT_DATA(wxMBConvFile) wxConvFile;
-
-// just use the libc conversion for now
-size_t wxMBConvFile::MB2WC(wchar_t *buf, const char *psz, size_t n) const
-{
- return wxMB2WC(buf, psz, n);
-}
-
-size_t wxMBConvFile::WC2MB(char *buf, const wchar_t *psz, size_t n) const
-{
- return wxWC2MB(buf, psz, n);
+ // return value excludes NUL
+ size_t nLen = pwz ? WC2MB((char *) NULL, pwz, 0) : (size_t)-1;
+ if (nLen == (size_t)-1)
+ return wxCharBuffer((const char *)NULL);
+
+ wxCharBuffer buf(nLen); // this allocates nLen+1
+ WC2MB((char *)(const char *) buf, pwz, nLen+1);
+ return buf;
}
// ----------------------------------------------------------------------------
{
// plain ASCII char
if (buf)
- *buf++ = cc;
+ *buf++ = (char) cc;
len++;
}
len += cnt + 1;
if (buf)
{
- *buf++ = (-128 >> cnt) | ((cc >> (cnt * 6)) & (0x3f >> cnt));
+ *buf++ = (char) ((-128 >> cnt) | ((cc >> (cnt * 6)) & (0x3f >> cnt)));
while (cnt--)
- *buf++ = 0x80 | ((cc >> (cnt * 6)) & 0x3f);
+ *buf++ = (char) (0x80 | ((cc >> (cnt * 6)) & 0x3f));
}
}
}
if (buf && (len<n)) *buf = 0;
+
return len;
}
IC_CharSet::IC_CharSet(const wxChar *name)
: wxCharacterSet(name)
{
+ // Do it the hard way
+ char cname[100];
+ for (size_t i = 0; i < wxStrlen(name)+1; i++)
+ cname[i] = (char) name[i];
+
// check for charset that represents wchar_t:
if (ms_wcCharsetName == NULL)
{
// try charset with explicit bytesex info (e.g. "UCS-4LE"):
ms_wcCharsetName = WC_NAME_BEST;
- m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+ m2w = iconv_open(ms_wcCharsetName, cname);
if (m2w == (iconv_t)-1)
{
// try charset w/o bytesex info (e.g. "UCS4")
// and check for bytesex ourselves:
ms_wcCharsetName = WC_NAME;
- m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+ m2w = iconv_open(ms_wcCharsetName, cname);
// last bet, try if it knows WCHAR_T pseudo-charset
if (m2w == (iconv_t)-1)
{
ms_wcCharsetName = "WCHAR_T";
- m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+ m2w = iconv_open(ms_wcCharsetName, cname);
}
if (m2w != (iconv_t)-1)
}
else // we already have ms_wcCharsetName
{
- m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+ m2w = iconv_open(ms_wcCharsetName, cname);
}
// NB: don't ever pass NULL to iconv_open(), it may crash!
if ( ms_wcCharsetName )
{
- w2m = iconv_open(wxConvLibc.cWX2MB(name), ms_wcCharsetName);
+ w2m = iconv_open( cname, ms_wcCharsetName);
}
else
{
// convert to native endianness
WC_BSWAP(buf /* _not_ bufPtr */, res)
}
+
+ // NB: iconv was given only strlen(psz) characters on input, and so
+ // it couldn't convert the trailing zero. Let's do it ourselves
+ // if there's some room left for it in the output buffer.
+ if (res < n)
+ buf[res] = 0;
}
else
{
cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf );
res = n-outbuf;
+
+ // NB: iconv was given only wcslen(psz) characters on input, and so
+ // it couldn't convert the trailing zero. Let's do it ourselves
+ // if there's some room left for it in the output buffer.
+ if (res < n)
+ buf[0] = 0;
}
else
{
size_t MB2WC(wchar_t *buf, const char *psz, size_t n)
{
size_t len =
+#ifdef __WXWINE__
+ MultiByteToWideChar(m_CodePage, 0, psz, -1, (WCHAR*) buf, buf ? n : 0);
+#else
MultiByteToWideChar(m_CodePage, 0, psz, -1, buf, buf ? n : 0);
+#endif
//VS: returns # of written chars for buf!=NULL and *size*
// needed buffer for buf==NULL
return len ? (buf ? len : len-1) : (size_t)-1;
size_t WC2MB(char *buf, const wchar_t *psz, size_t n)
{
+#ifdef __WXWINE__
+ size_t len = WideCharToMultiByte(m_CodePage, 0, (const WCHAR*) psz, -1, buf,
+ buf ? n : 0, NULL, NULL);
+#else
size_t len = WideCharToMultiByte(m_CodePage, 0, psz, -1, buf,
buf ? n : 0, NULL, NULL);
+#endif
//VS: returns # of written chars for buf!=NULL and *size*
// needed buffer for buf==NULL
return len ? (buf ? len : len-1) : (size_t)-1;
enc(wxFONTENCODING_SYSTEM)
{
if (name)
- enc = wxTheFontMapper->CharsetToEncoding(name, FALSE);
+ enc = wxFontMapper::Get()->CharsetToEncoding(name, FALSE);
m_ok = m2w.Init(enc, wxFONTENCODING_UNICODE) &&
w2m.Init(wxFONTENCODING_UNICODE, enc);
}
- size_t MB2WC(wchar_t *buf, const char *psz, size_t n)
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t WXUNUSED(n))
{
size_t inbuf = strlen(psz);
if (buf)
return inbuf;
}
- size_t WC2MB(char *buf, const wchar_t *psz, size_t n)
+ size_t WC2MB(char *buf, const wchar_t *psz, size_t WXUNUSED(n))
{
#if ( defined(__BORLANDC__) && (__BORLANDC__ > 0x530) ) \
|| ( defined(__MWERKS__) && defined(__WXMSW__) )
{
// check for the special case of ASCII charset
#if wxUSE_FONTMAP
- if ( wxTheFontMapper->CharsetToEncoding(name) == wxFONTENCODING_DEFAULT )
+ if ( wxFontMapper::Get()->CharsetToEncoding(name) == wxFONTENCODING_DEFAULT )
#else // wxUSE_FONTMAP
if ( !name )
#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
wxCSConv::~wxCSConv()
{
- free(m_name);
- delete m_cset;
+ Clear();
+}
+
+wxCSConv::wxCSConv(const wxCSConv& conv)
+ : wxMBConv()
+{
+ Clear();
+ SetName(conv.m_name);
+}
+
+wxCSConv& wxCSConv::operator=(const wxCSConv& conv)
+{
+ Clear();
+ SetName(conv.m_name);
+ return *this;
+}
+
+void wxCSConv::Clear()
+{
+ if (m_name)
+ free(m_name);
+ if (m_cset)
+ delete m_cset;
+ m_name = NULL;
+ m_cset = NULL;
}
void wxCSConv::SetName(const wxChar *charset)
{
wxString name = wxLocale::GetSystemEncodingName();
if ( !name.empty() )
+ {
SetName(name);
+ }
}
// wxGetCharacterSet() complains about NULL name