#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>
#include <string.h>
#include <stdlib.h>
-
-#include "wx/debug.h"
#include "wx/strconv.h"
-#include "wx/intl.h"
-#include "wx/log.h"
// ----------------------------------------------------------------------------
// globals
// ----------------------------------------------------------------------------
-WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc;
+#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]); }
#error "Weird sizeof(wchar_t): please report your platform details to wx-users mailing list"
#endif
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// UTF-16 en/decoding
+// ----------------------------------------------------------------------------
#ifdef WC_UTF16
// wxMBConv
// ----------------------------------------------------------------------------
-WXDLLEXPORT_DATA(wxMBConv) wxConvLibc;
-
size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
return wxMB2WC(buf, psz, n);
if (buf)
buf += pa;
len += pa;
-#else
+#else // !WC_UTF16
if (buf)
*buf++ = res;
len++;
-#endif
+#endif // WC_UTF16/!WC_UTF16
}
}
}
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
// ============================================================================
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);
// ============================================================================
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+
+extern long wxCharsetToCodepage(const wxChar *charset); // from utils.cpp
+
class CP_CharSet : public wxCharacterSet
{
public:
return len;
}
-#else // !wxUSE_WCHAR_T
-
-// ----------------------------------------------------------------------------
-// stand-ins in absence of wchar_t
-// ----------------------------------------------------------------------------
-
-WXDLLEXPORT_DATA(wxMBConv) wxConvLibc, wxConvFile;
-
#endif // wxUSE_WCHAR_T
}
#endif // wxUSE_GUI/!wxUSE_GUI
-#endif
- // __WXMICROWIN__
+#endif // __WXMICROWIN__
// ----------------------------------------------------------------------------
// deprecated (in favour of wxLog) log functions
// TRUE if we're between the above two calls
bool wxIsBusy()
{
- return (gs_wxBusyCursorCount > 0);
+ return gs_wxBusyCursorCount > 0;
}
// Check whether this window wants to process messages, e.g. Stop button
return s;
}
-#endif
+#endif // __WXMICROWIN__
// ----------------------------------------------------------------------------
// get display info
HWND hWnd = GetDesktopWindow();
::GetWindowRect(hWnd, & rect);
- *width = rect.right - rect.left;
- *height = rect.bottom - rect.top;
-#else
+ if ( width )
+ *width = rect.right - rect.left;
+ if ( height )
+ *height = rect.bottom - rect.top;
+#else // !__WXMICROWIN__
ScreenHDC dc;
- if ( width ) *width = GetDeviceCaps(dc, HORZRES);
- if ( height ) *height = GetDeviceCaps(dc, VERTRES);
-#endif
+ if ( width )
+ *width = ::GetDeviceCaps(dc, HORZRES);
+ if ( height )
+ *height = ::GetDeviceCaps(dc, VERTRES);
+#endif // __WXMICROWIN__/!__WXMICROWIN__
}
void wxDisplaySizeMM(int *width, int *height)
{
#ifdef __WXMICROWIN__
// MICROWIN_TODO
- *width = 0; * height = 0;
+ if ( width )
+ *width = 0;
+ if ( height )
+ *height = 0;
#else
ScreenHDC dc;
- if ( width ) *width = GetDeviceCaps(dc, HORZSIZE);
- if ( height ) *height = GetDeviceCaps(dc, VERTSIZE);
+ if ( width )
+ *width = ::GetDeviceCaps(dc, HORZSIZE);
+ if ( height )
+ *height = ::GetDeviceCaps(dc, VERTSIZE);
#endif
}
#endif
}
-
// ---------------------------------------------------------------------------
// window information functions
// ---------------------------------------------------------------------------
#endif // wxUSE_GUI
-#if 0
-//------------------------------------------------------------------------
-// wild character routines
-//------------------------------------------------------------------------
-
-bool wxIsWild( const wxString& pattern )
+#ifdef __WXMICROWIN__
+int wxGetOsVersion(int *majorVsn, int *minorVsn)
{
- wxString tmp = pattern;
- char *pat = WXSTRINGCAST(tmp);
- while (*pat) {
- switch (*pat++) {
- case '?': case '*': case '[': case '{':
- return TRUE;
- case '\\':
- if (!*pat++)
- return FALSE;
- }
- }
- return FALSE;
-};
-
+ // MICROWIN_TODO
+ if (majorVsn) *majorVsn = 0;
+ if (minorVsn) *minorVsn = 0;
+ return wxUNIX;
+}
+#endif // __WXMICROWIN__
-bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
-{
- wxString tmp1 = pat;
- char *pattern = WXSTRINGCAST(tmp1);
- wxString tmp2 = text;
- char *str = WXSTRINGCAST(tmp2);
- char c;
- char *cp;
- bool done = FALSE, ret_code, ok;
- // Below is for vi fans
- const char OB = '{', CB = '}';
-
- // dot_special means '.' only matches '.'
- if (dot_special && *str == '.' && *pattern != *str)
- return FALSE;
-
- while ((*pattern != '\0') && (!done)
- && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) {
- switch (*pattern) {
- case '\\':
- pattern++;
- if (*pattern != '\0')
- pattern++;
- break;
- case '*':
- pattern++;
- ret_code = FALSE;
- while ((*str!='\0')
- && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
- /*loop*/;
- if (ret_code) {
- while (*str != '\0')
- str++;
- while (*pattern != '\0')
- pattern++;
- }
- break;
- case '[':
- pattern++;
- repeat:
- if ((*pattern == '\0') || (*pattern == ']')) {
- done = TRUE;
- break;
- }
- if (*pattern == '\\') {
- pattern++;
- if (*pattern == '\0') {
- done = TRUE;
- break;
- }
- }
- if (*(pattern + 1) == '-') {
- c = *pattern;
- pattern += 2;
- if (*pattern == ']') {
- done = TRUE;
- break;
- }
- if (*pattern == '\\') {
- pattern++;
- if (*pattern == '\0') {
- done = TRUE;
- break;
- }
- }
- if ((*str < c) || (*str > *pattern)) {
- pattern++;
- goto repeat;
- }
- } else if (*pattern != *str) {
- pattern++;
- goto repeat;
- }
- pattern++;
- while ((*pattern != ']') && (*pattern != '\0')) {
- if ((*pattern == '\\') && (*(pattern + 1) != '\0'))
- pattern++;
- pattern++;
- }
- if (*pattern != '\0') {
- pattern++, str++;
- }
- break;
- case '?':
- pattern++;
- str++;
- break;
- case OB:
- pattern++;
- while ((*pattern != CB) && (*pattern != '\0')) {
- cp = str;
- ok = TRUE;
- while (ok && (*cp != '\0') && (*pattern != '\0')
- && (*pattern != ',') && (*pattern != CB)) {
- if (*pattern == '\\')
- pattern++;
- ok = (*pattern++ == *cp++);
- }
- if (*pattern == '\0') {
- ok = FALSE;
- done = TRUE;
- break;
- } else if (ok) {
- str = cp;
- while ((*pattern != CB) && (*pattern != '\0')) {
- if (*++pattern == '\\') {
- if (*++pattern == CB)
- pattern++;
- }
- }
- } else {
- while (*pattern!=CB && *pattern!=',' && *pattern!='\0') {
- if (*++pattern == '\\') {
- if (*++pattern == CB || *pattern == ',')
- pattern++;
- }
- }
- }
- if (*pattern != '\0')
- pattern++;
- }
- break;
- default:
- if (*str == *pattern) {
- str++, pattern++;
- } else {
- done = TRUE;
- }
- }
- }
- while (*pattern == '*')
- pattern++;
- return ((*str == '\0') && (*pattern == '\0'));
-};
+// ----------------------------------------------------------------------------
+// Win32 codepage conversion functions
+// ----------------------------------------------------------------------------
-#endif // 0
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
-#if 0
+#if wxUSE_GUI
-// maximum mumber of lines the output console should have
-static const WORD MAX_CONSOLE_LINES = 500;
+#include "wx/fontmap.h"
-BOOL WINAPI MyConsoleHandler( DWORD dwCtrlType ) { // control signal type
- FreeConsole();
- return TRUE;
-}
+// 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
-void wxRedirectIOToConsole()
+extern long wxEncodingToCodepage(wxFontEncoding encoding)
{
- int hConHandle;
- long lStdHandle;
- CONSOLE_SCREEN_BUFFER_INFO coninfo;
- FILE *fp;
-
- // allocate a console for this app
- AllocConsole();
-
- // set the screen buffer to be big enough to let us scroll text
- GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),
- &coninfo);
- coninfo.dwSize.Y = MAX_CONSOLE_LINES;
- SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
- coninfo.dwSize);
-
- // redirect unbuffered STDOUT to the console
- lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
- hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
- if(hConHandle <= 0) return;
- fp = _fdopen( hConHandle, "w" );
- *stdout = *fp;
- setvbuf( stdout, NULL, _IONBF, 0 );
-
- // redirect unbuffered STDIN to the console
- lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
- hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
- if(hConHandle <= 0) return;
- fp = _fdopen( hConHandle, "r" );
- *stdin = *fp;
- setvbuf( stdin, NULL, _IONBF, 0 );
-
- // redirect unbuffered STDERR to the console
- lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
- hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
- if(hConHandle <= 0) return;
- fp = _fdopen( hConHandle, "w" );
- *stderr = *fp;
- setvbuf( stderr, NULL, _IONBF, 0 );
-
- // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
- // point to console as well
- ios::sync_with_stdio();
-
- SetConsoleCtrlHandler(MyConsoleHandler, TRUE);
+ // 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;
}
-#else
-// Not supported
-void wxRedirectIOToConsole()
+
+#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
-#ifdef __WXMICROWIN__
-int wxGetOsVersion(int *majorVsn, int *minorVsn)
+#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)
{
- // MICROWIN_TODO
- if (majorVsn) *majorVsn = 0;
- if (minorVsn) *minorVsn = 0;
- return wxUNIX;
+ 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
+
+#endif // !wxUSE_GUI || !wxUSE_FONTMAP
+
+#endif // Win32