X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/951f792f7dbf786f9606db193017a1e58c675b5c..33f3e2b31ed781ba1446b49ec6d3e226c0a5c652:/include/wx/wxcrtbase.h diff --git a/include/wx/wxcrtbase.h b/include/wx/wxcrtbase.h index 0d124f6f35..406190292c 100644 --- a/include/wx/wxcrtbase.h +++ b/include/wx/wxcrtbase.h @@ -26,23 +26,17 @@ NB: don't include any wxWidgets headers here because almost all of them include this one! - + NB2: User code should include wx/crt.h instead of including this header directly. */ -#if !defined(__WXPALMOS5__) #include #include #include -#if defined(__WXPALMOS__) - #include -#else - #include -#endif +#include #include -#endif #if defined(__WINDOWS__) && !defined(__WXWINCE__) #include @@ -52,12 +46,24 @@ char *strtok_r(char *, const char *, char **); #endif +/* + Using -std=c++{98,0x} option with mingw32 disables most of standard + library extensions, so we can't rely on the presence of common non-ANSI + functions, define a special symbol to test for this. Notice that this + doesn't need to be done for g++ under Linux where _GNU_SOURCE (which is + defined by default) still makes all common extensions available even in + ANSI mode. + */ +#if defined(__MINGW32__) && defined(__STRICT_ANSI__) + #define __WX_STRICT_ANSI_GCC__ +#endif + /* a few compilers don't have the (non standard but common) isascii function, define it ourselves for them */ #ifndef isascii - #if defined(__MWERKS__) + #if defined(__WX_STRICT_ANSI_GCC__) #define wxNEED_ISASCII #elif defined(_WIN32_WCE) #if _WIN32_WCE <= 211 @@ -72,15 +78,13 @@ #ifdef _WIN32_WCE #if _WIN32_WCE <= 211 - #define isspace(c) ((c) == _T(' ') || (c) == _T('\t')) + #define isspace(c) ((c) == wxT(' ') || (c) == wxT('\t')) #endif #endif /* _WIN32_WCE */ /* string.h functions */ #ifndef strdup - #if defined(__MWERKS__) && !defined(__MACH__) && (__MSL__ < 0x00008000) - #define wxNEED_STRDUP - #elif defined(__WXWINCE__) + #if defined(__WXWINCE__) #if _WIN32_WCE <= 211 #define wxNEED_STRDUP #endif @@ -99,21 +103,6 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #endif /* _WIN32_WCE */ -#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__ */ - - /* ------------------------------------------------------------------------- UTF-8 locale handling ------------------------------------------------------------------------- */ @@ -167,7 +156,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxCRT_StrstrW wcsstr /* these functions are not defined under CE, at least in VC8 CRT */ -#if !defined(__WXWINCE__) && !defined(__WXPALMOS__) +#if !defined(__WXWINCE__) #define wxCRT_StrcollA strcoll #define wxCRT_StrxfrmA strxfrm @@ -175,17 +164,20 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxCRT_StrxfrmW wcsxfrm #endif /* __WXWINCE__ */ -/* Almost all compiler have strdup(), but not quite all: CodeWarrior under - Mac and VC++ for Windows CE don't provide it; additionally, gcc under - Mac and OpenVMS do not have wcsdup: */ -#if defined(__VISUALC__) && __VISUALC__ >= 1400 +/* Almost all compiler have strdup(), but VC++ for CE doesn't provide it. + Another special case is gcc in strict ANSI mode: normally it doesn't provide + strdup() but MinGW does provide it under MSVC-compatible name so test for it + before checking __WX_STRICT_ANSI_GCC__. */ +#if (defined(__VISUALC__) && __VISUALC__ >= 1400) || \ + defined(__MINGW32__) #define wxCRT_StrdupA _strdup -#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) +#elif !(defined(__WXWINCE__) || defined(__WX_STRICT_ANSI_GCC__)) #define wxCRT_StrdupA strdup #endif -// all compilers except Cygwin provide _wcsdup() under Windows -#if defined(__WINDOWS__) && !defined(__CYGWIN__) +/* most Windows compilers provide _wcsdup() */ +#if defined(__WINDOWS__) && \ + !(defined(__CYGWIN__) || defined(__WX_STRICT_ANSI_GCC__)) #define wxCRT_StrdupW _wcsdup #elif defined(HAVE_WCSDUP) #define wxCRT_StrdupW wcsdup @@ -232,7 +224,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); Only VC8 and later provide strnlen() and wcsnlen() functions under Windows and it's also only available starting from Windows CE 6.0 only in CE build. */ -#if wxCHECK_VISUALC_VERSION(8) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 600)) +#if wxCHECK_VISUALC_VERSION(8) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 0x600)) #ifndef HAVE_STRNLEN #define HAVE_STRNLEN #endif @@ -256,17 +248,10 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); defined(__EMX__) || defined(__DJGPP__) #define wxCRT_StricmpA stricmp #define wxCRT_StrnicmpA 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 wxCRT_StricmpA StrCaselessCompare - #define wxCRT_StrnicmpA StrNCaselessCompare -#elif defined(__SYMANTEC__) || defined(__VISUALC__) || \ - (defined(__MWERKS__) && defined(__INTEL__)) +#elif defined(__SYMANTEC__) || defined(__VISUALC__) #define wxCRT_StricmpA _stricmp #define wxCRT_StrnicmpA _strnicmp -#elif defined(__UNIX__) || defined(__GNUWIN32__) +#elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__WX_STRICT_ANSI_GCC__)) #define wxCRT_StricmpA strcasecmp #define wxCRT_StrnicmpA strncasecmp /* #else -- use wxWidgets implementation */ @@ -434,14 +419,14 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha wchar_t** endptr, int base); #endif -#endif // wxLongLong_t +#endif /* wxLongLong_t */ /* ------------------------------------------------------------------------- stdio.h ------------------------------------------------------------------------- */ -#if defined(__UNIX__) || defined(__WXMAC__) || defined(__WXPALMOS__) +#if defined(__UNIX__) || defined(__WXMAC__) #define wxMBFILES 1 #else #define wxMBFILES 0 @@ -460,7 +445,7 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha #else /* Unicode filenames */ /* special case: these functions are missing under Win9x with Unicows so we have to implement them ourselves */ - #if wxUSE_UNICODE_MSLU + #if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__) WXDLLIMPEXP_BASE FILE* wxMSLU__wfopen(const wchar_t *name, const wchar_t *mode); WXDLLIMPEXP_BASE FILE* wxMSLU__wfreopen(const wchar_t *name, const wchar_t *mode, FILE *stream); WXDLLIMPEXP_BASE int wxMSLU__wrename(const wchar_t *oldname, const wchar_t *newname); @@ -568,14 +553,7 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); #define wxCRT_AtoiA atoi #define wxCRT_AtolA atol -#if defined(__MWERKS__) - #if defined(__MSL__) - #define wxCRT_AtofW watof - #define wxCRT_AtoiW watoi - #define wxCRT_AtolW watol - /* else: use ANSI versions */ - #endif -#elif defined(wxHAVE_TCHAR_SUPPORT) +#if defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__) #define wxCRT_AtoiW _wtoi #define wxCRT_AtolW _wtol /* _wtof doesn't exist */ @@ -587,26 +565,8 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); /* wcstoi doesn't exist */ #endif -/* - 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(__WXPALMOS__) - #define wxNEED_WX_MBSTOWCS -#endif - #ifdef __DARWIN__ - #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 + #if !defined(__WXOSX_IPHONE__) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 #define wxNEED_WX_MBSTOWCS #endif #endif @@ -628,10 +588,36 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); ------------------------------------------------------------------------- */ #define wxCRT_StrftimeA strftime -#ifndef __WXPALMOS__ -/* FIXME-UTF8: when is this available? */ -#define wxCRT_StrftimeW wcsftime -#endif /* ! __WXPALMOS__ */ +#ifdef __SGI__ + /* + IRIX provides not one but two versions of wcsftime(): XPG4 one which + uses "const char*" for the third parameter and so can't be used and the + correct, XPG5, one. Unfortunately we can't just define _XOPEN_SOURCE + high enough to get XPG5 version as this undefines other symbols which + make other functions we use unavailable (see for gory + details). So just declare the XPG5 version ourselves, we're extremely + unlikely to ever be compiled on a system without it. But if we ever do, + a configure test would need to be added for it (and _MIPS_SYMBOL_PRESENT + should be used to check for its presence during run-time, i.e. it would + probably be simpler to just always use our own wxCRT_StrftimeW() below + if it does ever become a problem). + */ +#ifdef __cplusplus + extern "C" +#endif + size_t + _xpg5_wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm * ); + #define wxCRT_StrftimeW _xpg5_wcsftime +#else + /* + Assume it's always available under non-Unix systems as this does seem + to be the case for now. And under Unix we trust configure to detect it + (except for SGI special case above). + */ + #if defined(HAVE_WCSFTIME) || !defined(__UNIX__) + #define wxCRT_StrftimeW wcsftime + #endif +#endif #ifndef wxCRT_StrftimeW WXDLLIMPEXP_BASE size_t wxCRT_StrftimeW(wchar_t *s, size_t max,