]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
added wxCHECK_GCC_VERSION() macro
[wxWidgets.git] / include / wx / wxchar.h
index 21afa7f864348adaba983c8930dace21ae019c54..ee7f0b225fdecf705ce0546331eba0d8b599e873 100644 (file)
@@ -52,6 +52,9 @@
 #   define wxUSE_WCHAR_T 1
 #endif // Unicode
 
+// Required for wxPrintf() etc
+#include <stdarg.h>
+
 // ----------------------------------------------------------------------------
 // define wxHAVE_TCHAR_FUNCTIONS for the compilers which support the
 // wide-character functions
     // 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 <wchar.h>
@@ -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
 
@@ -377,23 +398,18 @@ typedef unsigned __WCHAR_TYPE__ wxUChar;
 #      define  wxFgets     fgetws
 #      define  wxFputc     fputwc
 #      define  wxFputchar  fputwchar
-#      define  wxFprintf   fwprintf
-#      define  wxFscanf    fwscanf
 #      define  wxGetc      getwc
 #      define  wxGetchar   getwchar
 #      define  wxGets      getws
-#      define  wxPrintf    wprintf
 #      define  wxPutc      wputc
 #      define  wxPutchar   wputchar
 #      define  wxPuts      putws
-#      define  wxScanf     wscanf
-#      define  wxSnprintf  swprintf
-#      define  wxSscanf    swscanf
 #      define  wxUngetc    ungetwc
-#      define  wxVfprint   vfwprintf
-#      define  wxVprintf   vwprintf
-#      define  wxVsscanf   vswscanf
-#      define  wxVsnprintf vswprintf
+
+// 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
@@ -591,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 <stdio.h>  // 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);