// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1999 Ove Kaaven, Robert Roebling, Vadim Zeitlin, Vaclav Slavik
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// ----------------------------------------------------------------------------
#if wxUSE_WCHAR_T
- WXDLLEXPORT_DATA(wxMBConv) wxConvLibc;
- WXDLLEXPORT_DATA(wxCSConv) wxConvLocal((const wxChar *)NULL);
+ WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc;
+ WXDLLIMPEXP_DATA_BASE(wxCSConv) wxConvLocal((const wxChar *)NULL);
+ WXDLLIMPEXP_DATA_BASE(wxCSConv) wxConvISO8859_1(_T("iso-8859-1"));
#else
// stand-ins in absence of wchar_t
- WXDLLEXPORT_DATA(wxMBConv) wxConvLibc, wxConvFile;
+ WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc,
+ wxConvFile,
+ wxConvISO8859_1,
+ wxConvLocal,
+ wxConvUTF8;
#endif // wxUSE_WCHAR_T
-WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc;
+WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = &wxConvLibc;
class wxStrConvModule: public wxModule
{
virtual void OnExit()
{
#if wxUSE_WCHAR_T
- wxConvLocal.Clear();
+ wxConvLocal.Clear();
+ wxConvISO8859_1.Clear();
#endif
}
#define IGNORE_LIBC 0
+wxMBConv::~wxMBConv()
+{
+ // nothing to do here
+}
+
size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
#if IGNORE_LIBC
{
for (size_t i = 0; i < strlen( psz )+1; i++)
buf[i] = (wchar_t) psz[i];
- // printf( "libc %s\n", buf );
return strlen( psz );
}
else
{
for (size_t i = 0; i < wxStrlen( psz )+1; i++)
buf[i] = (char) psz[i];
- // printf( "libc %s\n", buf );
return wxStrlen( psz );
}
else
const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const
{
- if (psz)
+ if ( psz )
{
- 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); // this allocates nLen1+
- MB2WC((wchar_t *)(const wchar_t *) buf, psz, nLen+1);
- return buf;
+ // calculate the length of the buffer needed first
+ size_t nLen = MB2WC(NULL, psz, 0);
+ if ( nLen != (size_t)-1 )
+ {
+ // now do the actual conversion
+ wxWCharBuffer buf(nLen);
+ MB2WC(buf.data(), psz, nLen + 1); // with the trailing NUL
+
+ return buf;
+ }
}
- else
- return wxWCharBuffer((wchar_t *) NULL);
+
+ wxWCharBuffer buf((wchar_t *)NULL);
+
+ return buf;
}
-const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *psz) const
+const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
{
- if (psz)
+ if ( pwz )
{
- size_t nLen = WC2MB((char *) NULL, psz, 0); // return value excludes /0
- if (nLen == (size_t)-1)
- return wxCharBuffer((char *) NULL);
- wxCharBuffer buf(nLen); // this allocates nLen+1
- WC2MB((char *)(const char *) buf, psz, nLen+1);
- // printf( "str %s\n", (const char*) buf );
- return buf;
+ size_t nLen = WC2MB(NULL, pwz, 0);
+ if ( nLen != (size_t)-1 )
+ {
+ wxCharBuffer buf(nLen);
+ WC2MB(buf.data(), pwz, nLen + 1);
+
+ return buf;
+ }
}
- else
- return wxCharBuffer((char *) NULL);
+
+ wxCharBuffer buf((char *)NULL);
+
+ return buf;
}
// ----------------------------------------------------------------------------
#ifdef __WXGTK12__
-WXDLLEXPORT_DATA(wxMBConvGdk) wxConvGdk;
+WXDLLIMPEXP_DATA_BASE(wxMBConvGdk) wxConvGdk;
#include <gdk/gdk.h>
// UTF-7
// ----------------------------------------------------------------------------
-WXDLLEXPORT_DATA(wxMBConvUTF7) wxConvUTF7;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7) wxConvUTF7;
#if 0
static char utf7_setD[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// UTF-8
// ----------------------------------------------------------------------------
-WXDLLEXPORT_DATA(wxMBConvUTF8) wxConvUTF8;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8) wxConvUTF8;
static wxUint32 utf8_max[]=
{ 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff, 0xffffffff };
}
if (buf && (len<n)) *buf = 0;
-
+
return len;
}
#define ICONV_FAILED(cres, bufLeft) (cres == (size_t)-1)
#endif
-#if ICONV_CONST
-#define ICONV_CHAR_CAST(x) ((char **)(x))
-#else
-#define ICONV_CHAR_CAST(x) ((const char **)(x))
-#endif
+#define ICONV_CHAR_CAST(x) ((ICONV_CONST char **)(x))
// ----------------------------------------------------------------------------
// IC_CharSet: encapsulates an iconv character set
{
ms_wcCharsetName = NULL;
wxLogLastError(wxT("iconv"));
- wxLogError(_("Convertion to charset '%s' doesn't work."), name);
+ wxLogError(_("Conversion to charset '%s' doesn't work."), name);
}
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
{
size_t IC_CharSet::WC2MB(char *buf, const wchar_t *psz, size_t n)
{
-#if defined(__BORLANDC__) && (__BORLANDC__ > 0x530)
- size_t inbuf = std::wcslen(psz) * SIZEOF_WCHAR_T;
-#else
- size_t inbuf = ::wcslen(psz) * SIZEOF_WCHAR_T;
-#endif
+ size_t inbuf = wxWcslen(psz) * SIZEOF_WCHAR_T;
size_t outbuf = n;
size_t res, cres;
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
{
// Win32 conversion classes
// ============================================================================
-#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXUNIVERSAL__)
extern long wxCharsetToCodepage(const wxChar *charset); // from utils.cpp
size_t MB2WC(wchar_t *buf, const char *psz, size_t n)
{
- size_t len =
- MultiByteToWideChar(m_CodePage, 0, psz, -1, buf, buf ? n : 0);
- //VS: returns # of written chars for buf!=NULL and *size*
- // needed buffer for buf==NULL
- return len ? (buf ? len : len-1) : (size_t)-1;
+ 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 # of written chars for buf != NULL and *size*
+ // of the 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)
{
- size_t len = WideCharToMultiByte(m_CodePage, 0, psz, -1, buf,
- buf ? n : 0, NULL, NULL);
- //VS: returns # of written chars for buf!=NULL and *size*
- // needed buffer for buf==NULL
- return len ? (buf ? len : len-1) : (size_t)-1;
+ 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!
+ return len ? (buf ? len : len - 1) : (size_t)-1;
}
bool usable() const
public:
long m_CodePage;
};
-#endif // __WIN32__
+#endif // defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXUNIVERSAL__)
// ============================================================================
// wxEncodingConverter based conversion classes
size_t WC2MB(char *buf, const wchar_t *psz, size_t WXUNUSED(n))
{
-#if ( defined(__BORLANDC__) && (__BORLANDC__ > 0x530) ) \
- || ( defined(__MWERKS__) && defined(__WXMSW__) )
- size_t inbuf = std::wcslen(psz);
-#else
- size_t inbuf = ::wcslen(psz);
-#endif
+ const size_t inbuf = wxWcslen(psz);
if (buf)
w2m.Convert(psz,buf);
cset = NULL;
}
-#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXUNIVERSAL__)
cset = new CP_CharSet(name);
if ( cset->usable() )
return cset;
delete cset;
cset = NULL;
-#endif // __WIN32__
+#endif // defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXUNIVERSAL__)
#if wxUSE_FONTMAP
cset = new EC_CharSet(name);
void wxCSConv::LoadNow()
{
- if (m_deferred)
+ if ( m_deferred )
{
+ // it would probably be better to make GetSystemEncodingName() always
+ // available (i.e. even when wxUSE_INTL == 0)?
+#if wxUSE_INTL
if ( !m_name )
{
wxString name = wxLocale::GetSystemEncodingName();
SetName(name);
}
}
+#endif // wxUSE_INTL
// wxGetCharacterSet() complains about NULL name
m_cset = m_name ? wxGetCharacterSet(m_name) : NULL;
return m_cset->WC2MB(buf, psz, n);
// latin-1 (direct)
-#if ( defined(__BORLANDC__) && (__BORLANDC__ > 0x530) ) \
- || ( defined(__MWERKS__) && defined(__WXMSW__) )
- size_t len=std::wcslen(psz);
-#else
- size_t len=::wcslen(psz);
-#endif
+ const size_t len = wxWcslen(psz);
if (buf)
{
for (size_t c = 0; c <= len; c++)