X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f8d791e0a41f1021a69c3d6320ee6934c0dd7f36..0425151023593cb31da0ee0a652da173ca9abfde:/src/common/strconv.cpp?ds=sidebyside diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index dafd61269a..2279100d93 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -6,7 +6,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1999 Ove Kaaven, Robert Roebling, Vadim Zeitlin, Vaclav Slavik -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -37,7 +37,10 @@ #include "wx/msw/private.h" #endif +#ifndef __WXWINCE__ #include +#endif + #include #include #include @@ -50,14 +53,19 @@ // ---------------------------------------------------------------------------- #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, wxConvLocal; + 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 { @@ -68,6 +76,7 @@ public: { #if wxUSE_WCHAR_T wxConvLocal.Clear(); + wxConvISO8859_1.Clear(); #endif } @@ -188,6 +197,11 @@ static size_t decode_utf16(const wchar_t* input, wxUint32& output) #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 @@ -226,78 +240,49 @@ size_t wxMBConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const 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); -} -const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const -{ - // 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); + wxWCharBuffer buf((wchar_t *)NULL); - wxCharBuffer buf(nLen); // this allocates nLen+1 - WC2MB((char *)(const char *) buf, pwz, nLen+1); return buf; } -// ---------------------------------------------------------------------------- -// standard gdk conversion -// ---------------------------------------------------------------------------- - -#ifdef __WXGTK12__ - -WXDLLEXPORT_DATA(wxMBConvGdk) wxConvGdk; - -#include - -size_t wxMBConvGdk::MB2WC(wchar_t *buf, const char *psz, size_t n) const +const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const { - if (buf) + if ( pwz ) { - return gdk_mbstowcs((GdkWChar *)buf, psz, n); - } - else - { - GdkWChar *nbuf = new GdkWChar[n=strlen(psz)]; - size_t len = gdk_mbstowcs(nbuf, psz, n); - delete[] nbuf; - return len; - } -} + size_t nLen = WC2MB(NULL, pwz, 0); + if ( nLen != (size_t)-1 ) + { + wxCharBuffer buf(nLen); + WC2MB(buf.data(), pwz, nLen + 1); -size_t wxMBConvGdk::WC2MB(char *buf, const wchar_t *psz, size_t n) const -{ - char *mbstr = gdk_wcstombs((GdkWChar *)psz); - size_t len = mbstr ? strlen(mbstr) : 0; - if (buf) - { - if (len > n) - len = n; - memcpy(buf, psz, len); - if (len < n) - buf[len] = 0; + return buf; + } } - return len; -} -#endif // GTK > 1.0 + wxCharBuffer buf((char *)NULL); + + return buf; +} // ---------------------------------------------------------------------------- // UTF-7 // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConvUTF7) wxConvUTF7; +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7) wxConvUTF7; #if 0 static char utf7_setD[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -328,7 +313,7 @@ size_t wxMBConvUTF7::WC2MB(char * WXUNUSED(buf), // UTF-8 // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConvUTF8) wxConvUTF8; +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8) wxConvUTF8; static wxUint32 utf8_max[]= { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff, 0xffffffff }; @@ -433,7 +418,7 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const } if (buf && (lenusable() ) return cset; delete cset; cset = NULL; -#endif // __WIN32__ +#endif // defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXUNIVERSAL__) #if wxUSE_FONTMAP cset = new EC_CharSet(name); @@ -981,8 +976,11 @@ void wxCSConv::SetName(const wxChar *charset) 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(); @@ -991,6 +989,7 @@ void wxCSConv::LoadNow() SetName(name); } } +#endif // wxUSE_INTL // wxGetCharacterSet() complains about NULL name m_cset = m_name ? wxGetCharacterSet(m_name) : NULL;