From 373658eb493827a9a68a79eeaaab1dbfc69a206b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 4 Feb 2002 22:33:52 +0000 Subject: [PATCH] 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 --- include/wx/utils.h | 9 +- src/common/strconv.cpp | 169 +++++--------------- src/msw/app.cpp | 6 - src/msw/textctrl.cpp | 2 +- src/msw/utils.cpp | 344 ++++++++++++++--------------------------- 5 files changed, 153 insertions(+), 377 deletions(-) diff --git a/include/wx/utils.h b/include/wx/utils.h index c572db72a1..0bd6c258ed 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -401,13 +401,8 @@ void WXDLLEXPORT wxGetMousePosition( int* x, int* y ); // MSW only: get user-defined resource from the .res file. // Returns NULL or newly-allocated memory, so use delete[] to clean up. #ifdef __WXMSW__ -WXDLLEXPORT extern const wxChar* wxUserResourceStr; -WXDLLEXPORT wxChar* wxLoadUserResource(const wxString& resourceName, const wxString& resourceType = wxUserResourceStr); - -// Implemented in utils.cpp: VC++, Win95 only. Sets up a console for standard -// input/output -WXDLLEXPORT void wxRedirectIOToConsole(); - + WXDLLEXPORT extern const wxChar* wxUserResourceStr; + WXDLLEXPORT wxChar* wxLoadUserResource(const wxString& resourceName, const wxString& resourceType = wxUserResourceStr); #endif // MSW // ---------------------------------------------------------------------------- diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index d53b870f40..5f069277de 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -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 @@ -37,36 +42,42 @@ #include #include - -#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 + #include #endif #ifdef HAVE_ICONV - #include + #include #endif -#ifdef __WXMSW__ - #include -#endif +#include "wx/encconv.h" +#include "wx/fontmap.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- #define BSWAP_UCS4(str, len) { unsigned _c; for (_c=0; _c 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 diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 4bbbd7f651..e77f69dd65 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -213,12 +213,6 @@ bool wxApp::Initialize() } #endif // wxUSE_UNICODE && !wxUSE_UNICODE_MSLU - // Some people may wish to use this, but - // probably it shouldn't be here by default. -#ifdef __WXDEBUG__ - // wxRedirectIOToConsole(); -#endif - wxBuffer = new wxChar[1500]; // FIXME wxClassInfo::InitializeClasses(); diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 200b599bf4..852d725fb5 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -525,7 +525,7 @@ DWORD CALLBACK wxRichEditStreamIn(DWORD dwCookie, BYTE *buf, LONG cb, LONG *pcb) return 0; } -extern long wxEncodingToCodepage(wxFontEncoding encoding); // from strconv.cpp +extern long wxEncodingToCodepage(wxFontEncoding encoding); // from utils.cpp #if wxUSE_UNICODE_MSLU bool wxTextCtrl::StreamIn(const wxString& value, diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 34b1ee859a..c190b20543 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -1033,8 +1033,7 @@ void wxSleep(int nSecs) } #endif // wxUSE_GUI/!wxUSE_GUI -#endif - // __WXMICROWIN__ +#endif // __WXMICROWIN__ // ---------------------------------------------------------------------------- // deprecated (in favour of wxLog) log functions @@ -1227,7 +1226,7 @@ void wxEndBusyCursor() // 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 @@ -1283,7 +1282,7 @@ wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourc return s; } -#endif +#endif // __WXMICROWIN__ // ---------------------------------------------------------------------------- // get display info @@ -1340,26 +1339,35 @@ void wxDisplaySize(int *width, int *height) 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 } @@ -1381,7 +1389,6 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) #endif } - // --------------------------------------------------------------------------- // window information functions // --------------------------------------------------------------------------- @@ -1481,236 +1488,109 @@ extern void HIMETRICToPixel(LONG *x, LONG *y) #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 -- 2.45.2