# 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
// ----------------------------------------------------------------------------
-#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 <stddef.h>
- #include <string.h>
- #include <ctype.h>
- #elif defined(__CYGWIN__)
- #ifndef HAVE_WCSLEN
- #define HAVE_WCSLEN
- #endif // !HAVE_WCSLEN
- #include <stddef.h>
- #include <wchar.h>
- #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 <stddef.h>
+ #include <string.h>
+ #include <ctype.h>
+#elif defined(__CYGWIN__)
+ #ifndef HAVE_WCSLEN
+ #define HAVE_WCSLEN
+ #endif // !HAVE_WCSLEN
+ #include <stddef.h>
+ #include <wchar.h>
#elif defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
// VisualAge 4.0+ supports TCHAR
#define wxHAVE_TCHAR_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>
# 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 <stddef.h>
# include <wchar.h>
# elif defined(HAVE_WCSTR_H)
// old compilers have wcslen() here
// 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
# 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
# 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
# undef wxNEED_WX_STDIO_H
# endif
+
# ifdef wxNEED_WX_STDLIB_H
# define wxAtof atof
# define wxAtoi atoi
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);
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