X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/109c7768eb46ccbb45adc1c409fe8f6b7d799e2f..44893b87abdc8df271363b08a5d1b57cf7e4e04c:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index b2ded4870d..ee7f0b225f 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -52,29 +52,30 @@ # define wxUSE_WCHAR_T 1 #endif // Unicode +// Required for wxPrintf() etc +#include + // ---------------------------------------------------------------------------- // define wxHAVE_TCHAR_FUNCTIONS for the compilers which support the // wide-character functions // ---------------------------------------------------------------------------- -#ifdef __WIN32__ - // VC++ and BC++ starting with 5.2 have TCHAR support - #ifdef __VISUALC__ - #define wxHAVE_TCHAR_FUNCTIONS - #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520) - #define wxHAVE_TCHAR_FUNCTIONS - #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) - #define wxHAVE_TCHAR_FUNCTIONS - #include - #include - #include - #elif defined(__CYGWIN__) - #ifndef HAVE_WCSLEN - #define HAVE_WCSLEN - #endif // !HAVE_WCSLEN - #include - #include - #endif +// VC++ and BC++ starting with 5.2 have TCHAR support +#ifdef __VISUALC__ + #define wxHAVE_TCHAR_FUNCTIONS +#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520) + #define wxHAVE_TCHAR_FUNCTIONS +#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) + #define wxHAVE_TCHAR_FUNCTIONS + #include + #include + #include +#elif defined(__CYGWIN__) + #ifndef HAVE_WCSLEN + #define HAVE_WCSLEN + #endif // !HAVE_WCSLEN + #include + #include #elif defined(__VISAGECPP__) && (__IBMCPP__ >= 400) // VisualAge 4.0+ supports TCHAR #define wxHAVE_TCHAR_FUNCTIONS @@ -119,7 +120,7 @@ // time.h functions -- none defined in tchar.h #define wxAsctime asctime #define wxCtime ctime -#elif defined(__MWERKS__) +#elif defined(__MWERKS__) || defined(__VISAGECPP__) // for wcslen #if wxUSE_WCHAR_T #include @@ -303,6 +304,8 @@ typedef _TUCHAR wxUChar; # if wxUSE_WCHAR_T # ifdef HAVE_WCHAR_H // include wchar.h to get wcslen() declaration used by wx/buffer.h + // stddef.h is needed for Cygwin +# include # include # elif defined(HAVE_WCSTR_H) // old compilers have wcslen() here @@ -322,9 +325,27 @@ typedef _TUCHAR wxUChar; // this is probably glibc-specific # if defined(__WCHAR_TYPE__) -typedef __WCHAR_TYPE__ wxChar; -typedef signed __WCHAR_TYPE__ wxSChar; -typedef unsigned __WCHAR_TYPE__ wxUChar; +// VS: wxWindows used to define wxChar as __WCHAR_TYPE__ here. However, this doesn't +// work with new GCC 3.x compilers because wchar_t is C++'s builtin type in the new +// standard. OTOH, old compilers (GCC 2.x) won't accept new definition +// of wx{S,U}Char, therefore we have to define wxChar conditionally depending on +// detected compiler & compiler version. +// The most complicated case is the infamous so-called "gcc-2.96" which does not +// accept new definition of wxSChar but doesn't work with old definition of wxChar. +#if defined(__GNUC__) && (__GNUC__ >= 3) + // modern C++ compiler + typedef wchar_t wxChar; + typedef signed wchar_t wxSChar; + typedef unsigned wchar_t wxUChar; +#else + #if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 96) + typedef wchar_t wxChar; + #else + typedef __WCHAR_TYPE__ wxChar; + #endif + typedef signed __WCHAR_TYPE__ wxSChar; + typedef unsigned __WCHAR_TYPE__ wxUChar; +#endif # define _T(x) L##x @@ -372,6 +393,24 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # define wxStrtoul wcstoul # define wxStrxfrm wcsxfrm +# define wxFgetc fgetwc +# define wxFgetchar fgetwchar +# define wxFgets fgetws +# define wxFputc fputwc +# define wxFputchar fputwchar +# define wxGetc getwc +# define wxGetchar getwchar +# define wxGets getws +# define wxPutc wputc +# define wxPutchar wputchar +# define wxPuts putws +# define wxUngetc ungetwc + +// we need %s to %ls conversion for printf and scanf etc +# define wxNEED_PRINTF_CONVERSION +# define wxHAS_VSNPRINTF +# define wxHAS_SNPRINTF + // glibc doesn't have wc equivalents of the other stuff # define wxNEED_WX_STDIO_H # define wxNEED_WX_STDLIB_H @@ -482,29 +521,30 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # endif # ifdef wxNEED_WX_STDIO_H +# define wxFopen fopen +# define wxFreopen freopen +# define wxPerror perror +# define wxRemove remove +# define wxRename rename +# define wxTmpnam tmpnam + # define wxFgetc fgetc # define wxFgetchar fgetchar # define wxFgets fgets -# define wxFopen fopen # define wxFputc fputc # define wxFputchar fputchar # define wxFprintf fprintf -# define wxFreopen freopen # define wxFscanf fscanf # define wxGetc getc # define wxGetchar getchar # define wxGets gets -# define wxPerror perror # define wxPrintf printf # define wxPutc putc # define wxPutchar putchar # define wxPuts puts -# define wxRemove remove -# define wxRename rename # define wxScanf scanf # define wxSprintf sprintf # define wxSscanf sscanf -# define wxTmpnam tmpnam # define wxUngetc ungetc # define wxVfprint vfprintf # define wxVprintf vprintf @@ -513,6 +553,7 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # undef wxNEED_WX_STDIO_H # endif + # ifdef wxNEED_WX_STDLIB_H # define wxAtof atof # define wxAtoi atoi @@ -566,6 +607,41 @@ WXDLLEXPORT size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n); WXDLLEXPORT bool wxOKlibc(); // for internal use +// We need conversion from %s to %ls in Unicode mode under Unix +#ifdef wxNEED_PRINTF_CONVERSION + +#include // need FILE + +int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; +int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; +int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; +int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap ); +int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; +int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_4; +int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; +int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; +int wxVfprint( const wxChar *format, va_list ap ); +int wxVprintf( const wxChar *format, va_list ap ); +int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap ); +int wxVsprintf( wxChar *str, const wxChar *format, va_list ap ); + +#endif // wxNEED_PRINTF_CONVERSION + +#if !defined(wxSnprintf) && !defined(wxHAS_SNPRINTF) +// wxSnprintf() is like snprintf() if it's available and sprintf() (always +// available, but dangerous!) if not. +WXDLLEXPORT int wxSnprintf(wxChar *buf, size_t len, + const wxChar *format, + ...) ATTRIBUTE_PRINTF_3; +#endif + +#if !defined(wxVsnprintf) && !defined(wxHAS_VSNPRINTF) +// and wxVsnprintf() is like vsnprintf() or vsprintf() +WXDLLEXPORT int wxVsnprintf(wxChar *buf, size_t len, + const wxChar *format, + va_list argptr); +#endif + // if libc versions are not available, use replacements defined in wxchar.cpp #ifndef wxStrdup WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz); @@ -640,14 +716,6 @@ WXDLLEXPORT FILE * wxFopen(const wxChar *path, const wxChar *mode); WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream); WXDLLEXPORT int wxRemove(const wxChar *path); WXDLLEXPORT int wxRename(const wxChar *oldpath, const wxChar *newpath); -WXDLLEXPORT int wxPrintf(const wxChar *fmt, ...) ATTRIBUTE_PRINTF_1; -WXDLLEXPORT int wxVprintf(const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxFprintf(FILE *stream, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVfprintf(FILE *stream, const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxSprintf(wxChar *buf, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxSscanf(const wxChar *buf, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVsscanf(const wxChar *buf, const wxChar *fmt, va_list argptr); #endif #ifndef wxAtof