X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c09f28798bb9e9e8f8cd563b7b9dd24f0acc6ebd..aa8e9a36c47673613f080d7578e771fe62261ef1:/include/wx/wxchar.h?ds=sidebyside diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index 2d56328d0a..68d1a6a1ba 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -12,15 +12,20 @@ #ifndef _WX_WXCHAR_H_ #define _WX_WXCHAR_H_ -//#ifdef __GNUG__ -//#pragma interface "wxchar.h" -//#endif +#ifdef __GNUG__ + #pragma interface "wxchar.h" +#endif // only do SBCS or _UNICODE #if defined (_MBCS ) -# error "MBCS is not supported by wxChar" +// It may be OK anyway. +// # error "MBCS is not supported by wxChar" #endif +// ---------------------------------------------------------------------------- +// first deal with Unicode setting +// ---------------------------------------------------------------------------- + // set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined #if defined(_UNICODE) || defined(UNICODE) # undef wxUSE_UNICODE @@ -29,7 +34,7 @@ # ifndef wxUSE_UNICODE # define wxUSE_UNICODE 0 # endif -#endif +#endif // Unicode // and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1... #if wxUSE_UNICODE @@ -39,16 +44,100 @@ # ifndef UNICODE # define UNICODE # endif -#endif +#endif // Unicode -// Windows (VC++) has broad TCHAR support -#if defined(__VISUALC__) && defined(__WIN32__) +// Unicode support requires wchar_t +#if wxUSE_UNICODE +# undef wxUSE_WCHAR_T +# define wxUSE_WCHAR_T 1 +#endif // Unicode + +// ---------------------------------------------------------------------------- +// 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 + #include + #include + #elif defined(__CYGWIN__) + #ifndef HAVE_WCSLEN + #define HAVE_WCSLEN + #endif // !HAVE_WCSLEN + #include + #include + #endif +#elif defined(__VISAGECPP__) && (__IBMCPP__ >= 400) + // VisualAge 4.0+ supports TCHAR + #define wxHAVE_TCHAR_FUNCTIONS + + // but not stdio.h nor time nor conversion functions + #define wxNO_TCHAR_STDIO + #define wxNO_TCHAR_STDLIB + #define wxNO_TCHAR_TIME + #define wxNO_TCHAR_LOCALE + // + // supplemental VA V4 defs so at least we know what these are + // just define to standard defs + // + + // for wcslen + #include + + // locale.h functons -- not defined in tchar.h + #define wxSetlocale setlocale + // some stdio functions are defined others are not + // these are not + #define wxFgetchar fgetchar + #define wxFopen fopen + #define wxFputchar fputchar + #define wxFreopen freopen + #define wxGets gets + #define wxPerror perror + #define wxPuts puts + #define wxRemove remove + #define wxRename rename + #define wxTmpnam tmpnam + #define wxUngetc ungetc + #define wxVsscanf vsscanf + // stdlib not defined in VA V4 + #if !wxUSE_UNICODE + # define wxAtof atof + #endif + #define wxAtoi atoi + #define wxAtol atol + #define wxGetenv getenv + #define wxSystem system + // time.h functions -- none defined in tchar.h + #define wxAsctime asctime + #define wxCtime ctime +#elif defined(__MWERKS__) + // for wcslen + #if wxUSE_WCHAR_T + #include + #endif +#endif // compilers with (good) TCHAR support +#ifdef wxHAVE_TCHAR_FUNCTIONS # define HAVE_WCSLEN 1 # include # if wxUSE_UNICODE // temporary - preserve binary compatibility +#if defined(__GNUWIN32__) + #define _TCHAR TCHAR + #define _TSCHAR TCHAR + #define _TUCHAR TCHAR +#endif + typedef _TCHAR wxChar; typedef _TSCHAR wxSChar; typedef _TUCHAR wxUChar; @@ -57,11 +146,17 @@ typedef _TUCHAR wxUChar; # define wxSChar signed char # define wxUChar unsigned char # endif - // wchar_t is available -# undef wxUSE_WCHAR_T -# define wxUSE_WCHAR_T 1 + + // wchar_t is available + #ifndef wxUSE_WCHAR_T + #define wxUSE_WCHAR_T 1 + #endif // !defined(wxUSE_WCHAR_T) // ctype.h functions +#ifndef wxNO_TCHAR_CTYPE +#ifdef __BORLANDC__ +# include +#endif # define wxIsalnum _istalnum # define wxIsalpha _istalpha # define wxIsctrl _istctrl @@ -75,11 +170,15 @@ typedef _TUCHAR wxUChar; # define wxIsxdigit _istxdigit # define wxTolower _totlower # define wxToupper _totupper +#endif // wxNO_TCHAR_CTYPE // locale.h functons +#ifndef wxNO_TCHAR_LOCALE # define wxSetlocale _tsetlocale +#endif // wxNO_TCHAR_LOCALE // string.h functions +#ifndef wxNO_TCHAR_STRING # define wxStrcat _tcscat # define wxStrchr _tcschr # define wxStrcmp _tcscmp @@ -88,6 +187,7 @@ typedef _TUCHAR wxUChar; # define wxStrcspn _tcscspn # define wxStrftime _tcsftime # define wxStricmp _tcsicmp +# define wxStrnicmp _tcsnicmp # define wxStrlen_ _tcslen // used in wxStrlen inline function # define wxStrncat _tcsncat # define wxStrncmp _tcsncmp @@ -97,12 +197,20 @@ typedef _TUCHAR wxUChar; # define wxStrspn _tcsspn # define wxStrstr _tcsstr # define wxStrtod _tcstod -// is there a _tcstok[_r] ? # define wxStrtol _tcstol # define wxStrtoul _tcstoul # define wxStrxfrm _tcsxfrm +#endif // wxNO_TCHAR_STRING // stdio.h functions +#ifndef wxNO_TCHAR_STDIO +# if wxUSE_UNICODE_MSLU +# define wxRemove wxMSLU__tremove +# define wxRename wxMSLU__trename +# else +# define wxRemove _tremove +# define wxRename _trename +# endif # define wxFgetc _fgettc # define wxFgetchar _fgettchar # define wxFgets _fgetts @@ -120,8 +228,6 @@ typedef _TUCHAR wxUChar; # define wxPutc _puttc # define wxPutchar _puttchar # define wxPuts _putts -# define wxRemove _tremove -# define wxRename _trename # define wxScanf _tscanf # define wxSprintf _stprintf # define wxSscanf _stscanf @@ -131,69 +237,51 @@ typedef _TUCHAR wxUChar; # define wxVprintf _vtprintf # define wxVsscanf _vstscanf # define wxVsprintf _vstprintf +#elif defined(__VISAGECPP__) && (__IBMCPP__ >= 400) + // it has some stdio.h functions, apparently +# define wxFgetc _fgettc +# define wxFgets _fgetts +# define wxFputc _fputtc +# define wxFprintf _ftprintf +# define wxFscanf _ftscanf +# define wxGetc _gettc +# define wxGetchar _gettchar +# define wxPrintf _tprintf +# define wxPutc _puttc +# define wxPutchar _puttchar +# define wxScanf _tscanf +# define wxSprintf _stprintf +# define wxSscanf _stscanf +# define wxVfprint _vftprintf +# define wxVprintf _vtprintf +# define wxVsprintf _vstprintf +#endif // wxNO_TCHAR_STDIO // stdlib.h functions +#ifndef wxNO_TCHAR_STDLIB # if !wxUSE_UNICODE -# define wxAtof atof +# define wxAtof atof # endif # define wxAtoi _ttoi # define wxAtol _ttol # define wxGetenv _tgetenv # define wxSystem _tsystem +#endif // wxNO_TCHAR_STDLIB // time.h functions +#ifndef wxNO_TCHAR_TIME # define wxAsctime _tasctime # define wxCtime _tctime +#endif // wxNO_TCHAR_TIME -// #elif defined(XXX) - // #include XXX-specific files here - // typeddef YYY wxChar; - - // translate wxZZZ names - -#elif defined(__BORLANDC__) && defined(__WIN32__) - -// Borland C++ 4.52 doesn't have much tchar support -// maybe Borland C++ 5.02 has, can't check right now -// but I'll use the Win32 API instead here - -# include -# if wxUSE_UNICODE // temporary - preserve binary compatibility -typedef _TCHAR wxChar; -typedef _TSCHAR wxSChar; -typedef _TUCHAR wxUChar; -# else -# define wxChar char -# define wxSChar signed char -# define wxUChar unsigned char -# endif - // wchar_t is available -# undef wxUSE_WCHAR_T -// This test is for C++Builder -#if __BORLANDC__ >= 0x530 -# define wxUSE_WCHAR_T 0 -#else -# define wxUSE_WCHAR_T 1 -# define wxNEED_WCSLEN -#endif -# define wxNEED_WX_CTYPE_H -// #define wxStrtok strtok_r // Borland C++ 4.52 doesn't have strtok_r -# define wxNEED_WX_STRING_H -# define wxNEED_WX_STDIO_H -# define wxNEED_WX_STDLIB_H -# define wxNEED_WX_TIME_H - -#else//!TCHAR-aware compilers +#else // !TCHAR-aware compilers // check whether we should include wchar.h or equivalent -# if wxUSE_UNICODE -# undef wxUSE_WCHAR_T -# define wxUSE_WCHAR_T 1 // wchar_t *must* be available in Unicode mode -# elif !defined(wxUSE_WCHAR_T) +# if !defined(wxUSE_WCHAR_T) # if defined(__VISUALC__) && (__VISUALC__ < 900) # define wxUSE_WCHAR_T 0 // wchar_t is not available for MSVC++ 1.5 # elif defined(__UNIX__) -# if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) +# if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__) # define wxUSE_WCHAR_T 1 # else # define wxUSE_WCHAR_T 0 @@ -204,24 +292,29 @@ typedef _TUCHAR wxUChar; # define wxUSE_WCHAR_T 0 # elif defined(__WATCOMC__) # define wxUSE_WCHAR_T 0 +# elif defined(__VISAGECPP__) && (__IBMCPP__ < 400) +# define wxUSE_WCHAR_T 0 # else - // add additional compiler checks if this fails + // add additional compiler checks if this fails # define wxUSE_WCHAR_T 1 # endif -# endif//wxUSE_UNICODE - -# if wxUSE_WCHAR_T -# ifdef HAVE_WCSTR_H -# include -# else -# ifndef __FreeBSD__ -# include -# else -# include -# define wxNEED_WCSLEN -# endif -# endif -# endif +# endif // !defined(wxUSE_WCHAR_T) + +# 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 +# include +# elif defined(HAVE_WCSTR_H) + // old compilers have wcslen() here +# include +# elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__) + // include stdlib.h for wchar_t, wcslen is provided in wxchar.cpp +# include + size_t WXDLLEXPORT wcslen(const wchar_t *s); +# endif // HAVE_WCHAR_H +# endif // wxUSE_WCHAR_T // check whether we are doing Unicode # if wxUSE_UNICODE @@ -294,17 +387,11 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # include # include -# if 0 // temporary - preserve binary compatibilty - typedef char wxChar; - typedef signed char wxSChar; - typedef unsigned char wxUChar; -# else -# define wxChar char -# define wxSChar signed char -# define wxUChar unsigned char -# endif + typedef char wxChar; + typedef signed char wxSChar; + typedef unsigned char wxUChar; -# ifdef __FreeBSD__ +# if defined(__FreeBSD__) || defined(__DARWIN__) # undef _T # endif @@ -351,7 +438,7 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; // define wxStricmp for various compilers without Unicode possibilities #if !defined(wxStricmp) && !wxUSE_UNICODE -# if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__SALFORDC__) || defined(__VISAGECPP__) || defined(__EMX__) +# if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__SALFORDC__) || defined(__VISAGECPP__) || defined(__EMX__) || defined(__DJGPP__) # define wxStricmp stricmp # define wxStrnicmp strnicmp # elif defined(__SC__) || defined(__VISUALC__) || (defined(__MWERKS__) && defined(__INTEL__)) @@ -378,7 +465,9 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # define wxStrcoll strcoll # define wxStrcpy strcpy # define wxStrcspn strcspn +#if !defined(__MWERKS__) || !defined(__WXMAC__) # define wxStrdup strdup +#endif # define wxStrlen_ strlen // used in wxStrlen inline function # define wxStrncat strncat # define wxStrncmp strncmp @@ -443,17 +532,12 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # endif #endif //!Unicode -#if defined(wxNEED_WCSLEN) && wxUSE_UNICODE -# define wcslen wxStrlen -# undef wxNEED_WCSLEN -#endif - -/// checks whether the passed in pointer is NULL and if the string is empty -WXDLLEXPORT inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; } +// checks whether the passed in pointer is NULL and if the string is empty +inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; } #ifndef wxNEED_WX_STRING_H -/// safe version of strlen() (returns 0 if passed NULL pointer) -WXDLLEXPORT inline size_t wxStrlen(const wxChar *psz) +// safe version of strlen() (returns 0 if passed NULL pointer) +inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; } #endif @@ -493,16 +577,17 @@ WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz); WXDLLEXPORT int wxStricmp(const wxChar *psz1, const wxChar *psz2); #endif +#ifndef wxStrnicmp +WXDLLEXPORT int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len); +#endif + #ifndef wxStrtok WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr); #endif #ifndef wxSetlocale -WXDLLEXPORT wxChar * wxSetlocale(int category, const wxChar *locale); -#endif - -#ifdef wxNEED_WCSLEN // for use in buffer.h -WXDLLEXPORT size_t wcslen(const wchar_t *s); +class wxWCharBuffer; +WXDLLEXPORT wxWCharBuffer wxSetlocale(int category, const wxChar *locale); #endif #ifdef wxNEED_WX_CTYPE_H @@ -523,7 +608,9 @@ WXDLLEXPORT int wxToupper(wxChar ch); #ifdef wxNEED_WX_STRING_H WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src); -WXDLLEXPORT wxChar * wxStrchr(const wxChar *s, wxChar c); +WXDLLEXPORT const wxChar * wxStrchr(const wxChar *s, wxChar c); +WXDLLEXPORT wxChar * wxStrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrchr((const wxChar *)s, c); } WXDLLEXPORT int wxStrcmp(const wxChar *s1, const wxChar *s2); WXDLLEXPORT int wxStrcoll(const wxChar *s1, const wxChar *s2); WXDLLEXPORT wxChar * wxStrcpy(wxChar *dest, const wxChar *src); @@ -532,10 +619,16 @@ WXDLLEXPORT size_t wxStrlen(const wxChar *s); WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n); WXDLLEXPORT int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n); WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n); -WXDLLEXPORT wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept); -WXDLLEXPORT wxChar * wxStrrchr(const wxChar *s, wxChar c); +WXDLLEXPORT const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept); +WXDLLEXPORT wxChar * wxStrpbrk(wxChar *s, const wxChar *accept) + { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); } +WXDLLEXPORT const wxChar * wxStrrchr(const wxChar *s, wxChar c); +WXDLLEXPORT wxChar * wxStrrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrrchr((const wxChar *)s, c); } WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept); -WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); +WXDLLEXPORT const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); +WXDLLEXPORT wxChar *wxStrstr(wxChar *haystack, const wxChar *needle) + { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); } WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr); WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base); WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base); @@ -547,13 +640,15 @@ WXDLLEXPORT size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n); # include WXDLLEXPORT FILE * wxFopen(const wxChar *path, const wxChar *mode); WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream); -WXDLLEXPORT int wxPrintf(const wxChar *fmt, ...); +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, ...); +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, ...); +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, ...); +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 @@ -572,17 +667,38 @@ WXDLLEXPORT int wxSystem(const wxChar *psz); WXDLLEXPORT size_t wxStrftime(wxChar *s, size_t max, const wxChar *fmt, const struct tm *tm); #endif +// under VC++ 6.0 isspace() returns 1 for 8 bit chars which completely breaks +// the file parsing - this may be true for 5.0 as well, update #ifdef then +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) && !wxUSE_UNICODE + #undef wxIsspace + #define wxIsspace(c) ((((unsigned)c) < 128) && isspace(c)) +#endif // VC++ + +// ---------------------------------------------------------------------------- +// common macros which are always defined +// ---------------------------------------------------------------------------- + // although global macros with such names are really bad, we want to have // another name for _T() which should be used to avoid confusion between _T() // and _() in wxWindows sources #define wxT(x) _T(x) -// a Unicode-friendly __FILE__ analog +// Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs #ifndef __TFILE__ #define __XFILE__(x) wxT(x) #define __TFILE__ __XFILE__(__FILE__) #endif +#ifndef __TDATE__ + #define __XDATE__(x) wxT(x) + #define __TDATE__ __XDATE__(__DATE__) +#endif + +#ifndef __TTIME__ + #define __XTIME__(x) wxT(x) + #define __TTIME__ __XTIME__(__TIME__) +#endif + #endif //_WX_WXCHAR_H_