-#if defined(__MWERKS__)
- /* Metrowerks only has wide char support for OS X >= 10.3 */
- #if !defined(__DARWIN__) || \
- (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3)
- #define wxHAVE_MWERKS_UNICODE
- #endif
-
- #ifdef wxHAVE_MWERKS_UNICODE
- #define HAVE_WPRINTF 1
- #define HAVE_WCSRTOMBS 1
- #define HAVE_VSWPRINTF 1
- #endif
-#endif /* __MWERKS__ */
-
-#ifdef wxHAVE_TCHAR_SUPPORT
- /* we surely have wchar_t if we have TCHAR have wcslen() */
- #ifndef HAVE_WCSLEN
- #define HAVE_WCSLEN
- #endif
-#endif /* wxHAVE_TCHAR_SUPPORT */
-
-/*
- define wxFoo() function for each standard foo() function whose signature
- (exceptionally including the return type) includes any mention of char:
- wxFoo() is going to be a Unicode-friendly version of foo(), i.e. will have
- the same signature but with char replaced by wxChar which allows us to
- use it in Unicode build as well
- */
-
-#ifdef wxHAVE_TCHAR_SUPPORT
- #include <ctype.h>
-
- #if defined(__WATCOMC__) && defined(UNICODE)
- #define WXWCHAR_T_CAST(c) (wint_t)(c)
- #else
- #define WXWCHAR_T_CAST(c) c
- #endif
-
- /* ctype.h functions */
- #define wxIsalnum(c) _istalnum(WXWCHAR_T_CAST(c))
- #define wxIsalpha(c) _istalpha(WXWCHAR_T_CAST(c))
- #define wxIscntrl(c) _istcntrl(WXWCHAR_T_CAST(c))
- #define wxIsdigit(c) _istdigit(WXWCHAR_T_CAST(c))
- #define wxIsgraph(c) _istgraph(WXWCHAR_T_CAST(c))
- #define wxIslower(c) _istlower(WXWCHAR_T_CAST(c))
- #define wxIsprint(c) _istprint(WXWCHAR_T_CAST(c))
- #define wxIspunct(c) _istpunct(WXWCHAR_T_CAST(c))
- #define wxIsspace(c) _istspace(WXWCHAR_T_CAST(c))
- #define wxIsupper(c) _istupper(WXWCHAR_T_CAST(c))
- #define wxIsxdigit(c) _istxdigit(WXWCHAR_T_CAST(c))
-
- /*
- There is a bug in VC6 C RTL: toxxx() functions dosn't do anything with
- signed chars < 0, so "fix" it here.
- */
- #define wxTolower(c) _totlower((wxUChar)(wxChar)(c))
- #define wxToupper(c) _totupper((wxUChar)(wxChar)(c))
-
- /* locale.h functons */
- #define wxSetlocale _tsetlocale
-
- /* string.h functions */
- #define wxStrcat _tcscat
- #define wxStrchr _tcschr
- #define wxStrcmp _tcscmp
- #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 wxStrlen_ _tcslen /* used in wxStrlen inline function */
- #define wxStrncat _tcsncat
- #define wxStrncmp _tcsncmp
- #define wxStrncpy _tcsncpy
- #define wxStrpbrk _tcspbrk
- #define wxStrrchr _tcsrchr
- #define wxStrspn _tcsspn
- #define wxStrstr _tcsstr
- #define wxStrtod _tcstod
- #define wxStrtol _tcstol
- #define wxStrtoul _tcstoul
- #ifdef __VISUALC__
- #if __VISUALC__ >= 1300 && !defined(__WXWINCE__)
- #define wxStrtoll _tcstoi64
- #define wxStrtoull _tcstoui64
- #endif /* VC++ 7+ */
- #endif
- #define wxStrxfrm _tcsxfrm
-
- /* stdio.h functions */
- #define wxFgetc _fgettc
- #define wxFgetchar _fgettchar
- #define wxFgets _fgetts
- #if wxUSE_UNICODE_MSLU
- WXDLLIMPEXP_BASE FILE * wxMSLU__tfopen(const wxChar *name, const wxChar *mode);
-
- #define wxFopen wxMSLU__tfopen
- #else
- #define wxFopen _tfopen
- #endif
- #define wxFputc _fputtc
- #define wxFputchar _fputtchar
- WX_DEFINE_VARARG_FUNC(int, wxFprintf, _ftprintf)
- #define wxFputs _fputts
- #define wxFreopen _tfreopen
- #define wxFscanf _ftscanf
- #define wxGetc _gettc
- #define wxGetchar _gettchar
- #define wxGets _getts
- #define wxPerror _tperror
- WX_DEFINE_VARARG_FUNC(int, wxPrintf, _tprintf)
- #define wxPutc(c,f) _puttc(WXWCHAR_T_CAST(c),f)
- #define wxPutchar _puttchar
- #define wxPuts _putts
- #define wxScanf _tscanf
- #if defined(__DMC__)
- #if wxUSE_UNICODE
- /* Digital Mars adds count to _stprintf (C99) so prototype conversion see wxchar.cpp */
- int wxDoSprintf (wchar_t * __RESTRICT s, const wchar_t * __RESTRICT format, ... ) ;
- WX_DEFINE_VARARG_FUNC(int, wxSprintf, wxDoSprintf)
- #else
- /* and there is a bug in D Mars tchar.h prior to 8.39.4n, so define as sprintf */
- WX_DEFINE_VARARG_FUNC(int, wxSprintf, sprintf)
- #endif
- #else
- WX_DEFINE_VARARG_FUNC(int, wxSprintf, _stprintf)
- #endif
-
- #define wxSscanf _stscanf
- #define wxTmpnam _ttmpnam
- #define wxUngetc _tungetc
- #define wxVfprintf _vftprintf
- #define wxVprintf _vtprintf
- #define wxVsscanf _vstscanf
- #define wxVsprintf _vstprintf
-
- /* special case: these functions are missing under Win9x with Unicows so we */
- /* have to implement them ourselves */
- #if wxUSE_UNICODE_MSLU
- WXDLLIMPEXP_BASE int wxMSLU__trename(const wxChar *oldname, const wxChar *newname);
- WXDLLIMPEXP_BASE int wxMSLU__tremove(const wxChar *name);
-
- #define wxRemove wxMSLU__tremove
- #define wxRename wxMSLU__trename
- #else
- #ifdef __WXWINCE__
- /* carefully: wxRemove() must return 0 on success while DeleteFile()
- returns 0 on error, so don't just define one as the other */
- int wxRemove(const wxChar *path);
- #else
- #define wxRemove _tremove
- #define wxRename _trename
- #endif
- #endif
-
- /* stdlib.h functions */
- #define wxAtoi _ttoi
- #define wxAtol _ttol
- /* #define wxAtof _tttof -- notice that there is no such thing (why?) */
- /* there are no env vars at all under CE, so no _tgetenv neither */
- #ifdef __WXWINCE__
- /* can't define as inline function as this is a C file... */
- #define wxGetenv(name) ((wxChar *)NULL)
- #else
- #define wxGetenv _tgetenv
- #endif
- #define wxSystem _tsystem
-
- /* time.h functions */
- #define wxAsctime _tasctime
- #define wxCtime _tctime
-
- #define wxMbstowcs mbstowcs
- #define wxWcstombs wcstombs
-#else /* !TCHAR-aware compilers */
- /*
- There are 2 unrelated problems with these functions under Mac:
- a) Metrowerks MSL CRT implements them strictly in C99 sense and
- doesn't support (very common) extension of allowing to call
- mbstowcs(NULL, ...) which makes it pretty useless as you can't
- know the size of the needed buffer
- b) OS X <= 10.2 declares and even defined these functions but
- doesn't really implement them -- they always return an error
-
- So use our own replacements in both cases.
- */
- #if defined(__MWERKS__) && defined(__MSL__)
- #define wxNEED_WX_MBSTOWCS
- #endif
-
- #ifdef __DARWIN__
- #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2
- #define wxNEED_WX_MBSTOWCS
- #endif
- #endif
-
- #ifdef wxNEED_WX_MBSTOWCS
- /* even though they are defined and "implemented", they are bad and just
- stubs so we need our own - we need these even in ANSI builds!! */
- WXDLLIMPEXP_BASE size_t wxMbstowcs (wchar_t *, const char *, size_t);
- WXDLLIMPEXP_BASE size_t wxWcstombs (char *, const wchar_t *, size_t);
- #else
- #define wxMbstowcs mbstowcs
- #define wxWcstombs wcstombs
- #endif
-
- /*
- The system C library on Mac OS X 10.2 and below does not support
- unicode: in other words all wide-character functions such as towupper et
- al. do simply not exist so we need to provide our own in that context,
- except for the wchar_t definition/typedef itself.
-
- We need to do this for both project builder and CodeWarrior as
- the latter uses the system C library in Mach builds for wide character
- support, which as mentioned does not exist on 10.2 and below.
- */
- #if wxUSE_UNICODE && \
- defined(__DARWIN__) && \
- ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 )
- /* we need everything! */
- #define wxNEED_WX_STRING_H
- #define wxNEED_WX_CTYPE_H
-
- #define wxFgetchar(c) wxFgetc(c, stdin)
- #define wxFputc wxPutc
- #define wxFputchar(c) wxPutc(c, stdout)
- #define wxGetc wxFgetc
- #define wxGetchar(c) wxFgetc(c, stdin)
-
- #include <stdio.h>
-
- #define wxNEED_FGETC
- #define wxNEED_FGETS
- #define wxNEED_GETS
- #define wxNEED_UNGETC
-
- #define wxNEED_FPUTS
- #define wxNEED_PUTS
- #define wxNEED_PUTC
-
- int wxFputs(const wxChar *ch, FILE *stream);
- int wxPuts(const wxChar *ws);
- int wxPutc(wxChar ch, FILE *stream);
-
- #ifdef __cplusplus
- extern "C" {
- #endif
- WXDLLIMPEXP_BASE size_t wxStrlen_(const wxChar *s);
- #ifdef __cplusplus
- }
- #endif
-
- #define wxPutchar(wch) wxPutc(wch, stdout)
-
- #define wxNEED_PRINTF_CONVERSION
- #define wxNEED_WX_STDIO_H
- #define wxNEED_WX_STDLIB_H
- #define wxNEED_WX_TIME_H
-
- #elif wxUSE_UNICODE
- #include <wctype.h>
-
- /* this is probably glibc-specific */
- #if defined(__WCHAR_TYPE__) && !defined(__MWERKS__)
- /* ctype.h functions (wctype.h) */
- #define wxIsalnum iswalnum
- #define wxIsalpha iswalpha
- #define wxIscntrl 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
-
- #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)
- /* /usr/include/wctype.h incorrectly declares translations */
- /* tables which provokes tons of compile-time warnings -- try */
- /* to correct this */
- #define wxTolower(wc) towctrans((wc), (wctrans_t)__ctype_tolower)
- #define wxToupper(wc) towctrans((wc), (wctrans_t)__ctype_toupper)
- #else /* !glibc 2.0 */
- #define wxTolower towlower
- #define wxToupper towupper
- #endif /* gcc/!gcc */
-
- /* 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
- #ifdef HAVE_WCSTOULL
- /* assume that we have wcstoull(), which is also C99, too */
- #define wxStrtoll wcstoll
- #define wxStrtoull wcstoull
- #endif /* HAVE_WCSTOULL */
- #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
-
- #ifdef HAVE_FPUTWS
- #define wxFputs fputws
- #else
- #define wxNEED_FPUTS
- #include <stdio.h>
- int wxFputs(const wxChar *ch, FILE *stream);
- #endif
-
- #ifdef HAVE_WPUTC
- #define wxPutc wputc
- #else
- #define wxNEED_PUTC
- #include <stdio.h>
- int wxPutc(wxChar ch, FILE *stream);
- #endif
-
- #ifdef HAVE_WPUTCHAR
- #define wxPutchar wputchar
- #else
- #define wxPutchar(wch) wxPutc(wch, stdout)
- #endif
-
- #ifdef HAVE_PUTWS
- #define wxPuts putws
- #else
- #define wxNEED_PUTS
- int wxPuts(const wxChar *ws);
- #endif
-
- /* 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
- #elif defined(__MWERKS__) && ( defined(__MSL__) || defined(__MACH__) )
- /* ctype.h functions (wctype.h) */
- #define wxIsalnum iswalnum
- #define wxIsalpha iswalpha
- #define wxIscntrl 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 */
- #ifdef __MACH__
- #define wxNEED_WX_STDLIB_H
- #else
- #define wxAtof watof
- #define wxAtoi watoi
- #define wxAtol watol
- #define wxGetenv(a) ((wxChar*)NULL)
- #define wxSystem(a) ((int)NULL)
- #endif
- /* time.h functions */
- #define wxAsctime wasciitime
- #define wxCtime wctime
- /* #define wxStrftime wcsftime */
-
- #define wxNEED_WX_TIME_H
- #else /* !metrowerks for apple */
- #error "Please define wide character functions for your environment"
- #endif
- #else /* ASCII */
- #include <ctype.h>
- #include <string.h>
-
- /* ctype.h functions */
- #define wxIsalnum isalnum
- #define wxIsalpha isalpha
- #define wxIscntrl iscntrl
- #define wxIsdigit isdigit
- #define wxIsgraph isgraph
- #define wxIslower islower
- #define wxIsprint isprint
- #define wxIspunct ispunct
- #define wxIsspace isspace
- #define wxIsupper isupper
- #define wxIsxdigit isxdigit
- #define wxTolower tolower
- #define wxToupper toupper
-
- /* locale.h functons */
- #define wxSetlocale setlocale
-
- /* string.h functions */
- #define wxStrcat strcat
- #define wxStrchr strchr
- #define wxStrcmp strcmp
- #define wxStrcoll strcoll
- #define wxStrcpy strcpy
- #define wxStrcspn strcspn
-
- /* wxStricmp and wxStrnicmp are defined below */
- #define wxStrlen_ strlen /* used in wxStrlen inline function */
- #define wxStrncat strncat
- #define wxStrncmp strncmp
- #define wxStrncpy strncpy
- #define wxStrpbrk strpbrk
- #define wxStrrchr strrchr
- #define wxStrspn strspn
- #define wxStrstr strstr
- #define wxStrtod strtod
- #ifdef HAVE_STRTOK_R
- #define wxStrtok(str, sep, last) strtok_r(str, sep, last)
- #endif
- #define wxStrtol strtol
- #define wxStrtoul strtoul
- #ifdef HAVE_STRTOULL
- /* assume that we have wcstoull(), which is also C99, too */
- #define wxStrtoll strtoll
- #define wxStrtoull strtoull
- #endif /* HAVE_WCSTOULL */
- #define wxStrxfrm strxfrm
-
- /* stdio.h functions */
- #define wxFopen fopen
- #define wxFreopen freopen
- #define wxRemove remove
- #define wxRename rename
-
- #define wxPerror perror
- #define wxTmpnam tmpnam
-
- #define wxFgetc fgetc
- #define wxFgetchar fgetchar
- #define wxFgets fgets
- #define wxFputc fputc
- #define wxFputs fputs
- #define wxFputchar fputchar
- WX_DEFINE_VARARG_FUNC(int, wxFprintf, fprintf)
- #define wxFscanf fscanf
- #define wxGetc getc
- #define wxGetchar getchar
- #define wxGets gets
- WX_DEFINE_VARARG_FUNC(int, wxPrintf, printf)
- #define wxPutc putc
- #define wxPutchar putchar
- #define wxPuts puts
- #define wxScanf scanf
- WX_DEFINE_VARARG_FUNC(int, wxSprintf, sprintf)
- #define wxSscanf sscanf
- #define wxUngetc ungetc
- #define wxVfprintf vfprintf
- #define wxVprintf vprintf
- #define wxVsscanf vsscanf
- #define wxVsprintf vsprintf
-
- /* stdlib.h functions */
- #define wxAtof atof
- #define wxAtoi atoi
- #define wxAtol atol
- #define wxGetenv getenv
- #define wxSystem system
-
- /* time.h functions */
- #define wxAsctime asctime
- #define wxCtime ctime
- #define wxStrftime strftime
- #endif /* Unicode/ASCII */
-#endif /* TCHAR-aware compilers/the others */
-
-/*
- various special cases
- */
-
-/* define wxStricmp and wxStrnicmp for various compilers */
-
-/* note that in Unicode mode we definitely are going to need our own version */
-#if !defined(wxStricmp) && !wxUSE_UNICODE
- #if defined(__BORLANDC__) || defined(__WATCOMC__) || \
- defined(__SALFORDC__) || defined(__VISAGECPP__) || \
- defined(__EMX__) || defined(__DJGPP__)
- #define wxStricmp stricmp
- #define wxStrnicmp strnicmp
- #elif defined(__WXPALMOS__)
- /* FIXME: There is no equivalent to strnicmp in the Palm OS API. This
- * quick hack should do until one can be written.
- */
- #define wxStricmp StrCaselessCompare
- #define wxStrnicmp strnicmp
- #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
- (defined(__MWERKS__) && defined(__INTEL__))
- #define wxStricmp _stricmp
- #define wxStrnicmp _strnicmp
- #elif defined(__UNIX__) || defined(__GNUWIN32__)
- #define wxStricmp strcasecmp
- #define wxStrnicmp strncasecmp
- /* #else -- use wxWidgets implementation */
- #endif
-#endif /* !defined(wxStricmp) */
-
-/* define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as */
-/* 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
- #else
- WXDLLIMPEXP_BASE size_t wxWcslen(const wchar_t *s);
- #endif
-#endif /* wxUSE_WCHAR_T */
-
-#ifdef __cplusplus
-/* checks whether the passed in pointer is NULL and if the string is empty */
-inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }