#else
#define wxUSE_WCHAR_T 0
#endif
- #elif defined(__GNUWIN32__) && !defined(__MINGW32__) // Cygwin (not Mingw32) doesn't have wcslen.h, needed in buffer.h
+ #elif defined(__GNUWIN32__) && !defined(__MINGW32__)
#define wxUSE_WCHAR_T 0
#elif defined(__WATCOMC__)
#define wxUSE_WCHAR_T 0
// Required for wxPrintf() etc
#include <stdarg.h>
-#if defined(__CYGWIN__)
- #ifndef HAVE_WCSLEN
- #define HAVE_WCSLEN
- #endif // !HAVE_WCSLEN
- #include <stddef.h>
+// Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac
+// and VC++ for Windows CE don't provide it
+#if !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
+ // use #define, not inline wrapper, as it is tested with #ifndef below
+ #define wxStrdupA strdup
#endif
// non Unix compilers which do have wchar.h (but not tchar.h which is included
-// below and which includes wchar.h anyhow)
-#if defined(__MWERKS__) || defined(__VISAGECPP__)
+// below and which includes wchar.h anyhow).
+// Actually MinGW has tchar.h, but it does not include wchar.h
+#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__)
#ifndef HAVE_WCHAR_H
#define HAVE_WCHAR_H
#endif
#if wxUSE_WCHAR_T
#ifdef HAVE_WCHAR_H
- // include wchar.h to get wcslen() declaration used by wx/buffer.h
- #include <wchar.h>
+ // the current (as of Nov 2002) version of cygwin has a bug in its
+ // wchar.h -- there is no extern "C" around the declarations in it and
+ // this results in linking errors later; also, at least on some
+ // Cygwin versions, wchar.h requires sys/types.h
+ #ifdef __CYGWIN__
+ #include <sys/types.h>
+ extern "C" {
+ #endif // Cygwin
+ #include <wchar.h>
+ #ifdef __CYGWIN__
+ }
+ #endif // Cygwin
#elif defined(HAVE_WCSTR_H)
- // old compilers have wcslen() here
+ // old compilers have relevant declarations here
#include <wcstr.h>
#elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
- // include stdlib.h for wchar_t, wcslen is provided in wxchar.cpp
+ // include stdlib.h for wchar_t
#include <stdlib.h>
- size_t WXDLLEXPORT wcslen(const wchar_t *s);
#endif // HAVE_WCHAR_H
#endif // wxUSE_WCHAR_T
#define wxHAVE_TCHAR_SUPPORT
#endif // compilers with (good) TCHAR support
+#ifdef __MWERKS__
+ #define HAVE_WPRINTF
+#endif
+
#ifdef wxHAVE_TCHAR_SUPPORT
// get TCHAR definition if we've got it
#include <tchar.h>
#define wxStrcoll _tcscoll
#define wxStrcpy _tcscpy
#define wxStrcspn _tcscspn
+ #define wxStrdupW _wcsdup // notice the 'W'!
#define wxStrftime _tcsftime
#define wxStricmp _tcsicmp
#define wxStrnicmp _tcsnicmp
#define wxStrcoll wcscoll
#define wxStrcpy wcscpy
#define wxStrcspn wcscspn
- #define wxStrlen_ wcslen // used in wxStrlen inline function
+ #define wxStrlen_ wxWcslen // wxStrlen_() is used in wxStrlen()
#define wxStrncat wcsncat
#define wxStrncmp wcsncmp
#define wxStrncpy wcsncpy
#define wxStrspn wcsspn
#define wxStrstr wcsstr
#define wxStrtod wcstod
- #define wxStrtok wcstok
#define wxStrtol wcstol
#define wxStrtoul wcstoul
#define wxStrxfrm wcsxfrm
#define wxNEED_WX_STDIO_H
#define wxNEED_WX_STDLIB_H
#define wxNEED_WX_TIME_H
- #else // !glibc
+ #elif defined(__MWERKS__) && ( defined(macintosh) || defined(__MACH__) )
+ // ctype.h functions (wctype.h)
+ #define wxIsalnum iswalnum
+ #define wxIsalpha iswalpha
+ #define wxIsctrl iswcntrl
+ #define wxIsdigit iswdigit
+ #define wxIsgraph iswgraph
+ #define wxIslower iswlower
+ #define wxIsprint iswprint
+ #define wxIspunct iswpunct
+ #define wxIsspace iswspace
+ #define wxIsupper iswupper
+ #define wxIsxdigit iswxdigit
+ #define wxTolower towlower
+ #define wxToupper towupper
+
+ // string.h functions (wchar.h)
+ #define wxStrcat wcscat
+ #define wxStrchr wcschr
+ #define wxStrcmp wcscmp
+ #define wxStrcoll wcscoll
+ #define wxStrcpy wcscpy
+ #define wxStrcspn wcscspn
+ #define wxStrlen_ wxWcslen // wxStrlen_() is used in wxStrlen()
+ #define wxStrncat wcsncat
+ #define wxStrncmp wcsncmp
+ #define wxStrncpy wcsncpy
+ #define wxStrpbrk wcspbrk
+ #define wxStrrchr wcsrchr
+ #define wxStrspn wcsspn
+ #define wxStrstr wcsstr
+ #define wxStrtod wcstod
+ #define wxStrtol wcstol
+ #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 wxUngetc ungetwc
+
+ #define wxNEED_PRINTF_CONVERSION
+
+ #define wxPutc putwc
+ #define wxPutchar putwchar
+ #define wxFputs fputws
+
+ // stdio.h functions
+
+ #define wxNEED_WX_STDIO_H
+
+ // stdlib.h functions
+ #define wxAtof watof
+ #define wxAtoi watoi
+ #define wxAtol watol
+ #define wxGetenv(a) ((wxChar*)NULL)
+ #define wxSystem(a) ((int)NULL)
+
+ // time.h functions
+ #define wxAsctime wasciitime
+ #define wxCtime wctime
+ #define wxStrftime wcsftime
+
+ /*
+ #define wxNEED_FPUTWC
+
+ #include <stdio.h>
+
+ int wxFputs(const wxChar *ch, FILE *stream);
+ int wxPutc(wxChar ch, FILE *stream);
+
+ #define wxPuts(ws) wxFputs(ws, stdout)
+ #define wxPutchar(wch) wxPutc(wch, stdout)
+
+ // we need %s to %ls conversion for printf and scanf etc
+ #define wxNEED_PRINTF_CONVERSION
+ // glibc doesn't have wide char equivalents of the other stuff so
+ // use our own versions
+ #define wxNEED_WX_STDIO_H
+ #define wxNEED_WX_STDLIB_H
+ #define wxNEED_WX_TIME_H
+ */
+ #else // !metrowerks for apple
#error "Please define wide character functions for your environment"
#endif
#else // ASCII
#define wxStrcoll strcoll
#define wxStrcpy strcpy
#define wxStrcspn strcspn
- #if !defined(__MWERKS__) || !defined(__WXMAC__)
- #define wxStrdup strdup
- #endif
+
// wxStricmp and wxStrnicmp are defined below
#define wxStrlen_ strlen // used in wxStrlen inline function
#define wxStrncat strncat
#define wxStrtod strtod
#ifdef HAVE_STRTOK_R
#define wxStrtok(str, sep, last) strtok_r(str, sep, last)
- #else
- #define wxStrtok(str, sep, last) strtok(str, sep)
#endif
#define wxStrtol strtol
#define wxStrtoul strtoul
#endif
#endif // !defined(wxStricmp)
-// checks whether the passed in pointer is NULL and if the string is empty
-inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }
-
-// safe version of strlen() (returns 0 if passed NULL pointer)
-inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; }
-
// define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as
-// it's used in wx/buffer.h)
+// it's used in wx/buffer.h -- and also might be used just below by wxStrlen()
+// when wxStrlen_() is #define'd as wxWcslen so do it before defining wxStrlen)
#if wxUSE_WCHAR_T
#ifdef HAVE_WCSLEN
#define wxWcslen wcslen
#endif
#endif // wxUSE_WCHAR_T
+// checks whether the passed in pointer is NULL and if the string is empty
+inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }
+
+// safe version of strlen() (returns 0 if passed NULL pointer)
+inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; }
+
+// each of strdup() and wcsdup() may or may not be available but we need both
+// of them anyhow for wx/buffer.h so we define the missing one(s) in
+// wxchar.cpp and so we should always have both wxStrdupA and wxStrdupW
+// defined -- if this is somehow not the case in some situations, please
+// correct that and not the lines here
+#if wxUSE_UNICODE
+ #define wxStrdup wxStrdupW
+#else
+ #define wxStrdup wxStrdupA
+#endif
+
WXDLLEXPORT bool wxOKlibc(); // for internal use
// ----------------------------------------------------------------------------
// printf() family saga
// ----------------------------------------------------------------------------
+/*
+ For some systems vsnprintf() exists in the system libraries but not in the
+ headers, so we need to declare it ourselves to be able to use it.
+ */
+#if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL)
+ extern "C"
+ int vsnprintf(char *str, size_t size, const char *format, va_list ap);
+#endif // !HAVE_VSNPRINTF_DECL
+
/*
First of all, we always want to define safe snprintf() function to be used
instead of sprintf(). Some compilers already have it (or rather vsnprintf()
*/
#ifndef wxVsnprintf_
#if wxUSE_UNICODE
- #if defined(HAVE_VSWPRINTF)
+ #if defined(__MWERKS__)
+ #define HAVE_WCSRTOMBS 1
+ #define HAVE_VSWPRINTF 1
+ #endif
+ #if defined(HAVE__VSNWPRINTF)
+ #define wxVsnprintf_ _vsnwprintf
+ /* MinGW?MSVCRT has the wrong vswprintf */
+ #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__)
#define wxVsnprintf_ vswprintf
#endif
#else // ASCII
#endif
#endif // wxVsnprintf_ not defined yet
-#ifndef wxVsnprintf_
+#ifndef wxSnprintf_
// no [v]snprintf(), cook our own
WXDLLEXPORT int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
...) ATTRIBUTE_PRINTF_3;
+#endif
+#ifndef wxVsnprintf_
WXDLLEXPORT int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
va_list argptr);
#endif
#include <stdio.h> // for 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 wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
+ int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
+ int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap );
- int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
- int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3;
- int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3;
+ int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
+ int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
+ int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
int wxVfprintf( FILE *stream, const wxChar *format, va_list ap );
int wxVprintf( const wxChar *format, va_list ap );
int wxVsprintf( wxChar *str, const wxChar *format, va_list ap );
// these 2 can be simply mapped to the versions with underscore at the end
// if we don't have to do the conversion
#ifdef wxNEED_PRINTF_CONVERSION
- int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_4;
+ int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3;
int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap );
#else
#define wxSnprintf wxSnprintf_
WXDLLEXPORT size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
#endif // wxNEED_WX_STRING_H
-#ifndef wxStrdup
-WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz);
+#ifndef wxStrdupA
+WXDLLEXPORT char *wxStrdupA(const char *psz);
+#endif
+
+#ifndef wxStrdupW
+WXDLLEXPORT wchar_t *wxStrdupW(const wchar_t *pwz);
#endif
#ifndef wxStricmp
// time.h functions
#ifdef wxNEED_WX_TIME_H
+#if defined(__MWERKS__) && defined(macintosh)
+ #include <time.h>
+#endif
WXDLLEXPORT size_t wxStrftime(wxChar *s, size_t max,
const wxChar *fmt, const struct tm *tm);
#endif // wxNEED_WX_TIME_H