X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4055ed8281971e3d35bf04177193c27043d42ed1..ac6178d747f7b3c50a61627c65d6a73ea6dcee5b:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index fdfb0da05f..ad650d57e8 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -5,7 +5,7 @@ * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 * RCS-ID: $Id$ - * Copyright: (c) 1998-2002 wxWidgets dev team + * Copyright: (c) 1998-2002 Joel Farley, Ove Kåven, Robert Roebling, Ron Lee * Licence: wxWindows licence */ @@ -14,11 +14,13 @@ #ifndef _WX_WXCHAR_H_ #define _WX_WXCHAR_H_ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma interface "wxchar.h" -#endif +/* defs.h indirectly includes this file, so don't include it here */ +#include "wx/platform.h" +#include "wx/dlimpexp.h" -#include "wx/defs.h" /* for wxUSE_UNICODE */ +#if defined(HAVE_STRTOK_R) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + char *strtok_r(char *, const char *, char **); +#endif /* check whether we have wchar_t and which size it is if we do */ #if !defined(wxUSE_WCHAR_T) @@ -48,7 +50,7 @@ /* Standard headers we need here. - NB: don't include any wxWidgets headers here because almost of them include + NB: don't include any wxWidgets headers here because almost all of them include this one! */ @@ -57,7 +59,9 @@ /* 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__) +#if defined(__VISUALC__) && __VISUALC__ >= 1400 + #define wxStrdupA _strdup +#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) /* use #define, not inline wrapper, as it is tested with #ifndef below */ #define wxStrdupA strdup #endif @@ -87,12 +91,17 @@ /* Cygwin versions, wchar.h requires sys/types.h */ #ifdef __CYGWIN__ #include - extern "C" { + #ifdef __cplusplus + extern "C" { + #endif #endif /* Cygwin */ - #include - #ifdef __CYGWIN__ + + #include + + #if defined(__CYGWIN__) && defined(__cplusplus) } - #endif /* Cygwin */ + #endif /* Cygwin and C++ */ + #elif defined(HAVE_WCSTR_H) /* old compilers have relevant declarations here */ #include @@ -118,7 +127,9 @@ #define wxHAVE_TCHAR_SUPPORT #elif defined(__DMC__) #define wxHAVE_TCHAR_SUPPORT -#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) && !defined(__WXPALMOS__) +#elif defined(__WXPALMOS__) + #include +#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) #define wxHAVE_TCHAR_SUPPORT #include #include @@ -134,9 +145,17 @@ #define wxHAVE_TCHAR_SUPPORT #endif /* compilers with (good) TCHAR support */ -#ifdef __MWERKS__ - #define HAVE_WPRINTF -#endif +#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 + #endif +#endif /* __MWERKS__ */ #ifdef wxHAVE_TCHAR_SUPPORT /* get TCHAR definition if we've got it */ @@ -169,6 +188,13 @@ /* char wchar_t is always unsigned) and (b) was how the previous */ /* definitions worked so keep it like this */ + /* Sun's SunPro compiler supports the wchar_t type and wide character */ + /* functions, but does not define __WCHAR_TYPE__. Define it here to */ + /* allow unicode enabled builds. */ + #if defined(__SUNPRO_CC) || defined(__SUNPRO_C) + #define __WCHAR_TYPE__ wxchar_t + #endif + /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */ /* comment below */ #if !defined(__WCHAR_TYPE__) || \ @@ -299,7 +325,11 @@ #define wxFgetc _fgettc #define wxFgetchar _fgettchar #define wxFgets _fgetts - #define wxFopen _tfopen + #if wxUSE_UNICODE_MSLU + #define wxFopen wxMSLU__tfopen + #else + #define wxFopen _tfopen + #endif #define wxFputc _fputtc #define wxFputchar _fputtchar #define wxFprintf _ftprintf @@ -349,7 +379,9 @@ #define wxRename wxMSLU__trename #else #ifdef __WXWINCE__ - #define wxRemove DeleteFile + /* 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 @@ -360,27 +392,66 @@ #define wxAtoi _ttoi #define wxAtol _ttol /* #define wxAtof _tttof -- notice that there is no such thing (why?) */ - #define wxGetenv _tgetenv + /* 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 - #if !defined(__MWERKS__) && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) + #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!! */ - #define mbstowcs wxInternalMbstowcs - #define wcstombs wxInternalWcstombs - - WXDLLIMPEXP_BASE size_t wxInternalMbstowcs (wchar_t *, const char *, size_t); - WXDLLIMPEXP_BASE size_t wxInternalWcstombs (char *, const wchar_t *, size_t); + 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 - /* No UNICODE in the c library except wchar_t typedef on mac OSX 10.2 and less - roll our own */ - #if !defined(__MWERKS__) && wxUSE_UNICODE && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) - + /* + 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 @@ -755,14 +826,37 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ /* printf() family saga */ /* - For some systems vsnprintf() exists in the system libraries but not in the + For some systems [v]snprintf() 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) +#ifdef __cplusplus extern "C" +#else + extern +#endif int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif /* !HAVE_VSNPRINTF_DECL */ +#if defined(HAVE_SNPRINTF) && !defined(HAVE_SNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int snprintf(char *str, size_t size, const char *format, ...); +#endif /* !HAVE_SNPRINTF_DECL */ + +/* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the + * same isn't done for snprintf below, the builtin wxSnprintf_ is used + * instead since it's already a simple wrapper */ +#if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + inline int wx_fixed_vsnprintf(char *str, size_t size, const char *format, va_list ap) + { + return vsnprintf(str, size, (char*)format, ap); + } +#endif + /* 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() @@ -774,14 +868,14 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ */ #ifndef wxVsnprintf_ #if wxUSE_UNICODE - #if defined(__MWERKS__) + #ifdef wxHAVE_MWERKS_UNICODE #define HAVE_WCSRTOMBS 1 #define HAVE_VSWPRINTF 1 - #endif + #endif /* Metrowerks with Unicode support */ #if defined(__WATCOMC__) #define wxVsnprintf_ _vsnwprintf #define wxSnprintf_ _snwprintf - #endif + #endif /* Watcom */ #if defined(HAVE__VSNWPRINTF) #define wxVsnprintf_ _vsnwprintf /* MinGW?MSVCRT has the wrong vswprintf */ @@ -790,11 +884,18 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ #endif #else /* ASCII */ /* all versions of CodeWarrior supported by wxWidgets apparently have */ - /* vsnprintf() */ + /* both snprintf() and vsnprintf() */ + #if defined(HAVE_SNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) + #ifndef HAVE_BROKEN_SNPRINTF_DECL + #define wxSnprintf_ snprintf + #endif + #endif #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) - /* assume we have snprintf() too if we have vsnprintf() */ - #define wxVsnprintf_ vsnprintf - #define wxSnprintf_ snprintf + #if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + #define wxVsnprintf_ wx_fixed_vsnprintf + #else + #define wxVsnprintf_ vsnprintf + #endif #endif #endif #endif /* wxVsnprintf_ not defined yet */ @@ -1095,11 +1196,11 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxWX2WC wxMB2WC #endif -// -// RN: The following are not normal versions of memcpy et al., rather -// these are either char or widechar versions depending on -// if unicode is used or not. -// +/* + RN: The following are not normal versions of memcpy et al., rather + these are either char or widechar versions depending on + if unicode is used or not. +*/ #ifdef __cplusplus @@ -1154,13 +1255,13 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); return szRet; } - #else //!wxUSE_UNICODE + #else /* !wxUSE_UNICODE */ # define wxTmemchr memchr # define wxTmemcmp memcmp # define wxTmemcpy memcpy # define wxTmemmove memmove # define wxTmemset memset - #endif + #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */ #endif /*__cplusplus*/