// Required for wxPrintf() etc
#include <stdarg.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>
+ // 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 relevant declarations here
#include <wcstr.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 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
// 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
// ----------------------------------------------------------------------------
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