X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dccce9eae10e099d791cc055dd02d3dda731778e..24b9f055150de329d1fb61df5ce8d14e6d657cd0:/src/common/strconv.cpp diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index 33b934ef9f..92699a8c3a 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -44,9 +44,6 @@ #ifdef HAVE_ICONV_H #include #endif -#ifdef HAVE_LANGINFO_H - #include -#endif #ifdef __WXMSW__ #include @@ -68,13 +65,22 @@ #define BSWAP_UTF32(str, len) BSWAP_UCS4(str, len) #define BSWAP_UTF16(str, len) BSWAP_UCS2(str, len) +// 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 "UCS4" + #define WC_BSWAP BSWAP_UCS4 #elif SIZEOF_WCHAR_T == 2 -#define WC_NAME "UTF16" -#define WC_BSWAP BSWAP_UTF16 -#define WC_UTF16 + #define WC_NAME "UTF16" + #define WC_BSWAP BSWAP_UTF16 + #define WC_UTF16 +#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" #endif // ---------------------------------------------------------------------------- @@ -91,7 +97,7 @@ WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc; #ifdef WC_UTF16 -static size_t encode_utf16(wxUint32 input,wxUint16*output) +static size_t encode_utf16(wxUint32 input, wchar_t *output) { if (input<=0xffff) { @@ -113,7 +119,7 @@ static size_t encode_utf16(wxUint32 input,wxUint16*output) } } -static size_t decode_utf16(wxUint16*input,wxUint32&output) +static size_t decode_utf16(const wchar_t* input, wxUint32& output) { if ((*input<0xd800) || (*input>0xdfff)) { @@ -351,7 +357,7 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const { wxUint32 cc; #ifdef WC_UTF16 - size_t pa = decode_utf16(psz,cc); + size_t pa = decode_utf16(psz, cc); psz += (pa == (size_t)-1) ? 1 : pa; #else cc=(*psz++) & 0x7fffffff; @@ -396,7 +402,7 @@ WXDLLEXPORT_DATA(wxCSConv) wxConvLocal((const wxChar *)NULL); // - perhaps common encodings to objects ("UTF8" -> wxConvUTF8) // - move wxEncodingConverter meat in here -#ifdef __WIN32__ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) #include "wx/msw/registry.h" // this should work if M$ Internet Exploiter is installed static long CharsetToCodepage(const wxChar *name) @@ -412,7 +418,7 @@ static long CharsetToCodepage(const wxChar *name) path += cn; wxRegKey key(wxRegKey::HKCR, path); - if (!key.Exists()) continue; + if (!key.Exists()) break; // two cases: either there's an AliasForCharset string, // or there are Codepage and InternetEncoding dwords. @@ -610,7 +616,7 @@ public: }; #endif -#ifdef __WIN32__ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) class CP_CharSet : public wxCharacterSet { public: @@ -621,14 +627,18 @@ public: { size_t len = MultiByteToWideChar(CodePage, 0, psz, -1, buf, buf ? n : 0); - return len ? len : (size_t)-1; + //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) { size_t len = WideCharToMultiByte(CodePage, 0, psz, -1, buf, buf ? n : 0, NULL, NULL); - return len ? len : (size_t)-1; + //VS: returns # of written chars for buf!=NULL and *size* + // needed buffer for buf==NULL + return len ? (buf ? len : len-1) : (size_t)-1; } bool usable() @@ -637,7 +647,9 @@ public: public: long CodePage; }; -#endif +#endif // __WIN32__ + +#if wxUSE_FONTMAP class EC_CharSet : public wxCharacterSet { @@ -682,6 +694,8 @@ public: wxEncodingConverter m2w, w2m; }; +#endif // wxUSE_FONTMAP + static wxCharacterSet *wxGetCharacterSet(const wxChar *name) { wxCharacterSet *cset = NULL; @@ -699,14 +713,16 @@ static wxCharacterSet *wxGetCharacterSet(const wxChar *name) } } - if (cset && cset->usable()) return cset; + if (cset && cset->usable()) + return cset; + if (cset) { delete cset; cset = NULL; } -#ifdef __WIN32__ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) cset = new CP_CharSet(name); // may take NULL if (cset->usable()) return cset; @@ -714,9 +730,11 @@ static wxCharacterSet *wxGetCharacterSet(const wxChar *name) delete cset; #endif // __WIN32__ +#if wxUSE_FONTMAP cset = new EC_CharSet(name); if (cset->usable()) return cset; +#endif // wxUSE_FONTMAP delete cset; wxLogError(_("Unknown encoding '%s'!"), name); @@ -727,6 +745,8 @@ wxCSConv::wxCSConv(const wxChar *charset) { m_name = (wxChar *)NULL; m_cset = (wxCharacterSet *) NULL; + m_deferred = TRUE; + SetName(charset); } @@ -756,7 +776,8 @@ void wxCSConv::LoadNow() SetName(name); } - m_cset = wxGetCharacterSet(m_name); + // wxGetCharacterSet() complains about NULL name + m_cset = m_name ? wxGetCharacterSet(m_name) : NULL; m_deferred = FALSE; } } @@ -842,10 +863,10 @@ public: class EC_CharSetConverter { public: - EC_CharSetConverter(EC_CharSet*from,EC_CharSet*to) + EC_CharSetConverter(EC_CharSet* from,EC_CharSet* to) { cnv.Init(from->enc,to->enc); } - size_t Convert(char*buf, const char*psz, size_t n) + size_t Convert(char* buf, const char* psz, size_t n) { size_t inbuf = strlen(psz); if (buf) cnv.Convert(psz,buf);