more wxMBConv classes cleanup, define wxConvLibc to use Win32 API under Windows

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23825 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-09-22 20:29:15 +00:00
parent 57c5293e49
commit bde4baaced
2 changed files with 105 additions and 130 deletions

View File

@@ -33,20 +33,24 @@
#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); }
@@ -63,7 +67,22 @@ public:
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)
@@ -76,7 +95,7 @@ public:
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)
@@ -89,7 +108,7 @@ public:
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)
@@ -184,8 +203,8 @@ private:
};
#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;
// ----------------------------------------------------------------------------
@@ -233,8 +252,9 @@ public:
const char* cWX2MB(const char *psz) const { return psz; }
};
#define wxConvFile wxConvLocal
WXDLLIMPEXP_DATA_BASE(extern wxMBConv) wxConvLibc,
wxConvFile,
wxConvLocal,
wxConvISO8859_1,
wxConvUTF8;

View File

@@ -34,6 +34,10 @@
#include "wx/log.h"
#endif // WX_PRECOMP
#include "wx/strconv.h"
#if wxUSE_WCHAR_T
#ifdef __WXMSW__
#include "wx/msw/private.h"
#endif
@@ -46,57 +50,14 @@
#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
@@ -115,12 +76,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxStrConvModule, wxModule)
#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
@@ -139,8 +94,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxStrConvModule, wxModule)
#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
// ============================================================================
@@ -198,49 +153,11 @@ static size_t decode_utf16(const wxUint16* input, wxUint32& output)
// 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 )
@@ -282,10 +199,22 @@ const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
}
// ----------------------------------------------------------------------------
// 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"
@@ -316,8 +245,6 @@ size_t wxMBConvUTF7::WC2MB(char * WXUNUSED(buf),
// UTF-8
// ----------------------------------------------------------------------------
WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8) wxConvUTF8;
static wxUint32 utf8_max[]=
{ 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff, 0xffffffff };
@@ -433,24 +360,16 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const
// ----------------------------------------------------------------------------
#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
{
@@ -918,8 +837,8 @@ public:
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); }
@@ -1038,7 +957,7 @@ wxMBConv_iconv::~wxMBConv_iconv()
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;
@@ -1095,7 +1014,7 @@ size_t wxMBConv_iconv::MB2WC(wchar_t *buf, const char *psz, size_t n)
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;
@@ -1174,17 +1093,22 @@ 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);
}
{
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
(
@@ -1201,7 +1125,7 @@ public:
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
(
@@ -1264,7 +1188,7 @@ public:
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)
@@ -1272,7 +1196,7 @@ public:
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)
@@ -1565,6 +1489,37 @@ size_t wxCSConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
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