#if wxUSE_WCHAR_T
// ----------------------------------------------------------------------------
-// wxMBConv (base class for conversions, using libc conversion itself)
+// wxMBConv (abstract base class for conversions)
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxMBConv
{
public:
// the actual conversion takes place here
- virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
- virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+ //
+ // note that n is the size of the output buffer, not the length of input
+ // (which is always supposed to be NUL-terminated)
+ virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const = 0;
+ virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const = 0;
- // No longer inline since BC++ complains.
+ // MB <-> WC
const wxWCharBuffer cMB2WC(const char *psz) const;
const wxCharBuffer cWC2MB(const wchar_t *psz) const;
+ // convenience functions for converting MB or WC to/from wxWin default
#if wxUSE_UNICODE
const wxWCharBuffer cMB2WX(const char *psz) const { return cMB2WC(psz); }
const wxCharBuffer cWX2MB(const wchar_t *psz) const { return cWC2MB(psz); }
virtual ~wxMBConv();
};
-WXDLLIMPEXP_DATA_BASE(extern wxMBConv) wxConvLibc;
+// ----------------------------------------------------------------------------
+// wxMBConvLibc uses standard mbstowcs() and wcstombs() functions for
+// conversion (hence it depends on the current locale)
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxMBConvLibc : public wxMBConv
+{
+public:
+ virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+ virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+};
+
+// not very accurately named because it is not necessarily of type wxMBConvLibc
+// (but the name can't eb changed because of backwards compatibility) default
+// conversion
+WXDLLIMPEXP_DATA_BASE(extern wxMBConv&) wxConvLibc;
// ----------------------------------------------------------------------------
// wxMBConvUTF7 (for conversion using UTF7 encoding)
virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
};
-WXDLLIMPEXP_DATA_BASE(extern wxMBConvUTF7) wxConvUTF7;
+WXDLLIMPEXP_DATA_BASE(extern wxMBConvUTF7&) wxConvUTF7;
// ----------------------------------------------------------------------------
// wxMBConvUTF8 (for conversion using UTF8 encoding)
virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
};
-WXDLLIMPEXP_DATA_BASE(extern wxMBConvUTF8) wxConvUTF8;
+WXDLLIMPEXP_DATA_BASE(extern wxMBConvUTF8&) wxConvUTF8;
// ----------------------------------------------------------------------------
// wxMBConvUTF16LE (for conversion using UTF16 Little Endian encoding)
};
#define wxConvFile wxConvLocal
-WXDLLIMPEXP_DATA_BASE(extern wxCSConv) wxConvLocal;
-WXDLLIMPEXP_DATA_BASE(extern wxCSConv) wxConvISO8859_1;
+WXDLLIMPEXP_DATA_BASE(extern wxCSConv&) wxConvLocal;
+WXDLLIMPEXP_DATA_BASE(extern wxCSConv&) wxConvISO8859_1;
WXDLLIMPEXP_DATA_BASE(extern wxMBConv *) wxConvCurrent;
// ----------------------------------------------------------------------------
const char* cWX2MB(const char *psz) const { return psz; }
};
+#define wxConvFile wxConvLocal
+
WXDLLIMPEXP_DATA_BASE(extern wxMBConv) wxConvLibc,
- wxConvFile,
wxConvLocal,
wxConvISO8859_1,
wxConvUTF8;
#include "wx/log.h"
#endif // WX_PRECOMP
+#include "wx/strconv.h"
+
+#if wxUSE_WCHAR_T
+
#ifdef __WXMSW__
#include "wx/msw/private.h"
#endif
#include <string.h>
#include <stdlib.h>
-#include "wx/module.h"
-#include "wx/strconv.h"
-
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
#define wxHAVE_WIN32_MB2WC
#endif // __WIN32__ but !__WXMICROWIN__
-// ----------------------------------------------------------------------------
-// globals
-// ----------------------------------------------------------------------------
-
-#if wxUSE_WCHAR_T
- 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
- WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc,
- wxConvFile,
- wxConvISO8859_1,
- wxConvLocal,
- wxConvUTF8;
-#endif // wxUSE_WCHAR_T
-
-WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = &wxConvLibc;
-
-class wxStrConvModule: public wxModule
-{
-public:
- wxStrConvModule() : wxModule() { }
- virtual bool OnInit() { return true; }
- virtual void OnExit()
- {
-#if wxUSE_WCHAR_T
- wxConvLocal.Clear();
- wxConvISO8859_1.Clear();
-#endif
- }
-
- DECLARE_DYNAMIC_CLASS(wxStrConvModule)
-};
-
-IMPLEMENT_DYNAMIC_CLASS(wxStrConvModule, wxModule)
-
-
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
-#if wxUSE_WCHAR_T
-
#ifdef __SALFORDC__
#include <clib.h>
#endif
#define BSWAP_UCS4(str, len) { unsigned _c; for (_c=0; _c<len; _c++) str[_c]=wxUINT32_SWAP_ALWAYS(str[_c]); }
#define BSWAP_UTF16(str, len) { unsigned _c; for (_c=0; _c<len; _c++) str[_c]=wxUINT16_SWAP_ALWAYS(str[_c]); }
-// under Unix SIZEOF_WCHAR_T is defined by configure, but under other platforms
-// it might be not defined - assume the most common value
-#ifndef SIZEOF_WCHAR_T
- #define SIZEOF_WCHAR_T 2
-#endif // !defined(SIZEOF_WCHAR_T)
-
#if SIZEOF_WCHAR_T == 4
#define WC_NAME "UCS4"
#define WC_BSWAP BSWAP_UCS4
#define WC_NAME_BEST "UTF-16LE"
#endif
#else // sizeof(wchar_t) != 2 nor 4
- // I don't know what to do about this
- #error "Weird sizeof(wchar_t): please report your platform details to wx-users mailing list"
+ // does this ever happen?
+ #error "Unknown sizeof(wchar_t): please report this to wx-dev@lists.wxwindows.org"
#endif
// ============================================================================
// wxMBConv
// ----------------------------------------------------------------------------
-#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
- 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 )
}
// ----------------------------------------------------------------------------
-// UTF-7
+// wxMBConvLibc
// ----------------------------------------------------------------------------
-WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7) wxConvUTF7;
+size_t wxMBConvLibc::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+ return wxMB2WC(buf, psz, n);
+}
+
+size_t wxMBConvLibc::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+ return wxWC2MB(buf, psz, n);
+}
+
+// ----------------------------------------------------------------------------
+// UTF-7
+// ----------------------------------------------------------------------------
#if 0
static char utf7_setD[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// UTF-8
// ----------------------------------------------------------------------------
-WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8) wxConvUTF8;
-
static wxUint32 utf8_max[]=
{ 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff, 0xffffffff };
// ----------------------------------------------------------------------------
#ifdef WORDS_BIGENDIAN
-#define wxMBConvUTF16straight wxMBConvUTF16BE
-#define wxMBConvUTF16swap wxMBConvUTF16LE
+ #define wxMBConvUTF16straight wxMBConvUTF16BE
+ #define wxMBConvUTF16swap wxMBConvUTF16LE
#else
-#define wxMBConvUTF16swap wxMBConvUTF16BE
-#define wxMBConvUTF16straight wxMBConvUTF16LE
+ #define wxMBConvUTF16swap wxMBConvUTF16BE
+ #define wxMBConvUTF16straight wxMBConvUTF16LE
#endif
-WXDLLIMPEXP_DATA_BASE(wxMBConvUTF16LE) wxConvUTF16LE;
-WXDLLIMPEXP_DATA_BASE(wxMBConvUTF16BE) wxConvUTF16BE;
-
-
-
-
-
#ifdef WC_UTF16
-
// copy 16bit MB to 16bit String
size_t wxMBConvUTF16straight::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
wxMBConv_iconv(const wxChar *name);
virtual ~wxMBConv_iconv();
- virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n);
- virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n);
+ virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+ virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
bool IsOk() const
{ return (m2w != (iconv_t)-1) && (w2m != (iconv_t)-1); }
iconv_close(w2m);
}
-size_t wxMBConv_iconv::MB2WC(wchar_t *buf, const char *psz, size_t n)
+size_t wxMBConv_iconv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
size_t inbuf = strlen(psz);
size_t outbuf = n * SIZEOF_WCHAR_T;
return res;
}
-size_t wxMBConv_iconv::WC2MB(char *buf, const wchar_t *psz, size_t n)
+size_t wxMBConv_iconv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
{
size_t inbuf = wxWcslen(psz) * SIZEOF_WCHAR_T;
size_t outbuf = n;
class wxMBConv_win32 : public wxMBConv
{
public:
+ wxMBConv_win32()
+ {
+ m_CodePage = CP_ACP;
+ }
+
wxMBConv_win32(const wxChar* name)
- {
- m_CodePage = wxCharsetToCodepage(name);
- }
+ {
+ m_CodePage = wxCharsetToCodepage(name);
+ }
wxMBConv_win32(wxFontEncoding encoding)
- {
- m_CodePage = wxEncodingToCodepage(encoding);
- }
+ {
+ m_CodePage = wxEncodingToCodepage(encoding);
+ }
- size_t MB2WC(wchar_t *buf, const char *psz, size_t n)
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
const size_t len = ::MultiByteToWideChar
(
return len ? (buf ? len : len - 1) : (size_t)-1;
}
- size_t WC2MB(char *buf, const wchar_t *psz, size_t n)
+ size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const
{
const size_t len = ::WideCharToMultiByte
(
Init();
}
- size_t MB2WC(wchar_t *buf, const char *psz, size_t WXUNUSED(n))
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t WXUNUSED(n)) const
{
size_t inbuf = strlen(psz);
if (buf)
return inbuf;
}
- size_t WC2MB(char *buf, const wchar_t *psz, size_t WXUNUSED(n))
+ size_t WC2MB(char *buf, const wchar_t *psz, size_t WXUNUSED(n)) const
{
const size_t inbuf = wxWcslen(psz);
if (buf)
return len;
}
-#endif // wxUSE_WCHAR_T
+// ----------------------------------------------------------------------------
+// globals
+// ----------------------------------------------------------------------------
+
+#ifdef __WINDOWS__
+ static wxMBConv_win32 wxConvLibcObj;
+#else
+ static wxMBConvSystem wxConvLibcObj;
+#endif
+
+static wxCSConv wxConvLocalObj(wxFONTENCODING_SYSTEM);
+static wxCSConv wxConvISO8859_1Obj(wxFONTENCODING_ISO8859_1);
+static wxMBConvUTF7 wxConvUTF7Obj;
+static wxMBConvUTF8 wxConvUTF8Obj;
+
+
+WXDLLIMPEXP_DATA_BASE(wxMBConv&) wxConvLibc = wxConvLibcObj;
+WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvLocal = wxConvLocalObj;
+WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvISO8859_1 = wxConvISO8859_1Obj;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7&) wxConvUTF7 = wxConvUTF7Obj;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8&) wxConvUTF8 = wxConvUTF8Obj;
+WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = &wxConvLibcObj;
+
+#else // !wxUSE_WCHAR_T
+
+// stand-ins in absence of wchar_t
+WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc,
+ wxConvISO8859_1,
+ wxConvLocal,
+ wxConvUTF8;
+
+#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T