#ifdef HAVE_ICONV_H
#include <iconv.h>
#endif
-#ifdef HAVE_LANGINFO_H
- #include <langinfo.h>
-#endif
#ifdef __WXMSW__
#include <windows.h>
#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
// ----------------------------------------------------------------------------
#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)
{
}
}
-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))
{
{
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;
// - 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)
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.
};
#endif
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
class CP_CharSet : public wxCharacterSet
{
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()
public:
long CodePage;
};
-#endif
+#endif // __WIN32__
+
+#if wxUSE_FONTMAP
class EC_CharSet : public wxCharacterSet
{
wxEncodingConverter m2w, w2m;
};
+#endif // wxUSE_FONTMAP
+
static wxCharacterSet *wxGetCharacterSet(const wxChar *name)
{
wxCharacterSet *cset = NULL;
}
}
- 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;
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);
SetName(name);
}
- m_cset = wxGetCharacterSet(m_name);
+ // wxGetCharacterSet() complains about NULL name
+ m_cset = m_name ? wxGetCharacterSet(m_name) : NULL;
m_deferred = FALSE;
}
}
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);