fixed for compilation without wxUSE_WCHAR_T and minor cleanups associated with this

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14005 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-02-04 22:33:52 +00:00
parent a9bf8315f6
commit 373658eb49
5 changed files with 159 additions and 383 deletions

View File

@@ -28,8 +28,13 @@
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/log.h"
#endif // WX_PRECOMP
#ifdef __WXMSW__
#include "wx/msw/private.h"
#include "wx/msw/private.h"
#endif
#include <errno.h>
@@ -37,36 +42,42 @@
#include <string.h>
#include <stdlib.h>
#include "wx/debug.h"
#include "wx/strconv.h"
#include "wx/intl.h"
#include "wx/log.h"
// ----------------------------------------------------------------------------
// globals
// ----------------------------------------------------------------------------
#if wxUSE_WCHAR_T
WXDLLEXPORT_DATA(wxMBConv) wxConvLibc;
WXDLLEXPORT_DATA(wxCSConv) wxConvLocal((const wxChar *)NULL);
#else
// stand-ins in absence of wchar_t
WXDLLEXPORT_DATA(wxMBConv) wxConvLibc, wxConvFile;
#endif // wxUSE_WCHAR_T
WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc;
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#if wxUSE_WCHAR_T
#ifdef __SALFORDC__
#include <clib.h>
#include <clib.h>
#endif
#ifdef HAVE_ICONV
#include <iconv.h>
#include <iconv.h>
#endif
#ifdef __WXMSW__
#include <windows.h>
#endif
#include "wx/encconv.h"
#include "wx/fontmap.h"
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
#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]); }
@@ -99,6 +110,13 @@ WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc;
#error "Weird sizeof(wchar_t): please report your platform details to wx-users mailing list"
#endif
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// UTF-16 en/decoding
// ----------------------------------------------------------------------------
#ifdef WC_UTF16
@@ -149,8 +167,6 @@ static size_t decode_utf16(const wchar_t* input, wxUint32& output)
// wxMBConv
// ----------------------------------------------------------------------------
WXDLLEXPORT_DATA(wxMBConv) wxConvLibc;
size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
return wxMB2WC(buf, psz, n);
@@ -341,11 +357,11 @@ size_t wxMBConvUTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const
if (buf)
buf += pa;
len += pa;
#else
#else // !WC_UTF16
if (buf)
*buf++ = res;
len++;
#endif
#endif // WC_UTF16/!WC_UTF16
}
}
}
@@ -393,110 +409,6 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const
return len;
}
// ----------------------------------------------------------------------------
// specified character set
// ----------------------------------------------------------------------------
WXDLLEXPORT_DATA(wxCSConv) wxConvLocal((const wxChar *)NULL);
#include "wx/encconv.h"
#include "wx/fontmap.h"
// TODO: add some tables here
// - perhaps common encodings to common codepages (for Win32)
// - perhaps common encodings to objects ("UTF8" -> wxConvUTF8)
// - move wxEncodingConverter meat in here
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
#if wxUSE_GUI
// VZ: the new version of wxCharsetToCodepage() is more politically correct
// and should work on other Windows versions as well but the old version is
// still needed for !wxUSE_FONTMAP || !wxUSE_GUI case
extern long wxEncodingToCodepage(wxFontEncoding encoding)
{
// translate encoding into the Windows CHARSET
wxNativeEncodingInfo natveEncInfo;
if ( !wxGetNativeFontEncoding(encoding, &natveEncInfo) )
return -1;
// translate CHARSET to code page
CHARSETINFO csetInfo;
if ( !::TranslateCharsetInfo((DWORD *)(DWORD)natveEncInfo.charset,
&csetInfo,
TCI_SRCCHARSET) )
{
wxLogLastError(_T("TranslateCharsetInfo(TCI_SRCCHARSET)"));
return -1;
}
return csetInfo.ciACP;
}
#if wxUSE_FONTMAP
extern long wxCharsetToCodepage(const wxChar *name)
{
// first get the font encoding for this charset
if ( !name )
return -1;
wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(name, FALSE);
if ( enc == wxFONTENCODING_SYSTEM )
return -1;
// the use the helper function
return wxEncodingToCodepage(enc);
}
#endif // wxUSE_FONTMAP
#endif // wxUSE_GUI
// include old wxCharsetToCodepage() by OK if needed
#if !wxUSE_GUI || !wxUSE_FONTMAP
#include "wx/msw/registry.h"
// this should work if Internet Exploiter is installed
extern long wxCharsetToCodepage(const wxChar *name)
{
if (!name)
return GetACP();
long CP=-1;
wxString cn(name);
do {
wxString path(wxT("MIME\\Database\\Charset\\"));
path += cn;
wxRegKey key(wxRegKey::HKCR, path);
if (!key.Exists()) break;
// two cases: either there's an AliasForCharset string,
// or there are Codepage and InternetEncoding dwords.
// The InternetEncoding gives us the actual encoding,
// the Codepage just says which Windows character set to
// use when displaying the data.
if (key.HasValue(wxT("InternetEncoding")) &&
key.QueryValue(wxT("InternetEncoding"), &CP)) break;
// no encoding, see if it's an alias
if (!key.HasValue(wxT("AliasForCharset")) ||
!key.QueryValue(wxT("AliasForCharset"), cn)) break;
} while (1);
return CP;
}
#endif // !wxUSE_GUI || !wxUSE_FONTMAP
#endif // Win32
// ============================================================================
// wxCharacterSet and derived classes
// ============================================================================
@@ -655,7 +567,7 @@ IC_CharSet::IC_CharSet(const wxChar *name)
else
{
ms_wcCharsetName = NULL;
// VS: we must not output an error here, since wxWindows will safely
// fall back to using wxEncodingConverter.
wxLogTrace(wxT("strconv"), wxT("Impossible to convert to/from charset '%s' with iconv, falling back to wxEncodingConverter."), name);
@@ -807,6 +719,9 @@ size_t IC_CharSet::WC2MB(char *buf, const wchar_t *psz, size_t n)
// ============================================================================
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
extern long wxCharsetToCodepage(const wxChar *charset); // from utils.cpp
class CP_CharSet : public wxCharacterSet
{
public:
@@ -1055,14 +970,6 @@ size_t wxCSConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
return len;
}
#else // !wxUSE_WCHAR_T
// ----------------------------------------------------------------------------
// stand-ins in absence of wchar_t
// ----------------------------------------------------------------------------
WXDLLEXPORT_DATA(wxMBConv) wxConvLibc, wxConvFile;
#endif // wxUSE_WCHAR_T