X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a007b626a76dfab3b5a83565bb7eae1cae57e18f..81051829457fc8fd271d16601d74218f345f9e6b:/include/wx/wxcrtbase.h diff --git a/include/wx/wxcrtbase.h b/include/wx/wxcrtbase.h index ec38214dfc..0afdc2ec5c 100644 --- a/include/wx/wxcrtbase.h +++ b/include/wx/wxcrtbase.h @@ -2,7 +2,7 @@ * Name: wx/wxcrtbase.h * Purpose: Type-safe ANSI and Unicode builds compatible wrappers for * CRT functions - * Author: Joel Farley, Ove Kåven + * Author: Joel Farley, Ove K�ven * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 * RCS-ID: $Id$ @@ -34,6 +34,9 @@ #include #include +#if defined(__WINDOWS__) && !defined(__WXWINCE__) + #include +#endif #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 **); @@ -107,19 +110,19 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #ifdef __cplusplus #if wxUSE_UNICODE_UTF8 - // flag indicating whether the current locale uses UTF-8 or not; must be - // updated every time the locale is changed! + /* flag indicating whether the current locale uses UTF-8 or not; must be + updated every time the locale is changed! */ #if wxUSE_UTF8_LOCALE_ONLY #define wxLocaleIsUtf8 true #else extern WXDLLIMPEXP_BASE bool wxLocaleIsUtf8; #endif - // function used to update the flag: + /* function used to update the flag: */ extern WXDLLIMPEXP_BASE void wxUpdateLocaleIsUtf8(); - #else // !wxUSE_UNICODE_UTF8 + #else /* !wxUSE_UNICODE_UTF8 */ inline void wxUpdateLocaleIsUtf8() {} - #endif // wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8 -#endif // __cplusplus + #endif /* wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8 */ +#endif /* __cplusplus */ /* ------------------------------------------------------------------------- @@ -129,7 +132,6 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxCRT_StrcatA strcat #define wxCRT_StrchrA strchr #define wxCRT_StrcmpA strcmp -#define wxCRT_StrcollA strcoll #define wxCRT_StrcpyA strcpy #define wxCRT_StrcspnA strcspn #define wxCRT_StrlenA strlen @@ -140,54 +142,41 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxCRT_StrrchrA strrchr #define wxCRT_StrspnA strspn #define wxCRT_StrstrA strstr -#define wxCRT_StrxfrmA strxfrm -/* - 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 defined(__DARWIN__) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_2) - #define wxHAS_NO_WCS_FUNCTIONS -#endif +#define wxCRT_StrcatW wcscat +#define wxCRT_StrchrW wcschr +#define wxCRT_StrcmpW wcscmp +#define wxCRT_StrcpyW wcscpy +#define wxCRT_StrcspnW wcscspn +#define wxCRT_StrncatW wcsncat +#define wxCRT_StrncmpW wcsncmp +#define wxCRT_StrncpyW wcsncpy +#define wxCRT_StrpbrkW wcspbrk +#define wxCRT_StrrchrW wcsrchr +#define wxCRT_StrspnW wcsspn +#define wxCRT_StrstrW wcsstr + +/* these functions are not defined under CE, at least in VC8 CRT */ +#ifndef __WXWINCE__ + #define wxCRT_StrcollA strcoll + #define wxCRT_StrxfrmA strxfrm -#ifndef wxHAS_NO_WCS_FUNCTIONS - #define wxCRT_StrcatW wcscat - #define wxCRT_StrchrW wcschr - #define wxCRT_StrcmpW wcscmp #define wxCRT_StrcollW wcscoll - #define wxCRT_StrcpyW wcscpy - #define wxCRT_StrcspnW wcscspn - #define wxCRT_StrncatW wcsncat - #define wxCRT_StrncmpW wcsncmp - #define wxCRT_StrncpyW wcsncpy - #define wxCRT_StrpbrkW wcspbrk - #define wxCRT_StrrchrW wcsrchr - #define wxCRT_StrspnW wcsspn - #define wxCRT_StrstrW wcsstr #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 doesn't have wcsdup: */ - #if defined(__VISUALC__) && __VISUALC__ >= 1400 - #define wxCRT_StrdupA _strdup - #elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) - #define wxCRT_StrdupA strdup - #endif - #if defined(__WINDOWS__) - #define wxCRT_StrdupW _wcsdup - #elif !defined(__DARWIN__) - #define wxCRT_StrdupW wcsdup - #endif -#else - #define wxCRT_StrdupA strdup - /* the rest is implemented in our code */ +/* 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 + #define wxCRT_StrdupA _strdup +#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) + #define wxCRT_StrdupA strdup +#endif +#if defined(__WINDOWS__) + #define wxCRT_StrdupW _wcsdup +#elif defined(HAVE_WCSDUP) + #define wxCRT_StrdupW wcsdup #endif #ifdef wxHAVE_TCHAR_SUPPORT @@ -388,14 +377,24 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha #endif /* supply strtoll and strtoull, if needed */ -#ifndef wxCRT_StrtollA - WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollA(const char* nptr, char** endptr, int base); - WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullA(const char* nptr, char** endptr, int base); -#endif -#ifndef wxCRT_StrtollW - WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollW(const wchar_t* nptr, wchar_t** endptr, int base); - WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullW(const wchar_t* nptr, wchar_t** endptr, int base); -#endif +#ifdef wxLongLong_t + #ifndef wxCRT_StrtollA + WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollA(const char* nptr, + char** endptr, + int base); + WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullA(const char* nptr, + char** endptr, + int base); + #endif + #ifndef wxCRT_StrtollW + WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollW(const wchar_t* nptr, + wchar_t** endptr, + int base); + WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullW(const wchar_t* nptr, + wchar_t** endptr, + int base); + #endif +#endif // wxLongLong_t /* ------------------------------------------------------------------------- @@ -411,15 +410,14 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha /* these functions are only needed in the form used for filenames (i.e. char* on Unix, wchar_t* on Windows), so we don't need to use A/W suffix: */ -#if wxMBFILES || !wxUSE_UNICODE // ANSI filenames +#if wxMBFILES || !wxUSE_UNICODE /* ANSI filenames */ #define wxCRT_Fopen fopen #define wxCRT_Freopen freopen #define wxCRT_Remove remove #define wxCRT_Rename rename -#else // Unicode filenames - +#else /* Unicode filenames */ /* special case: these functions are missing under Win9x with Unicows so we have to implement them ourselves */ #if wxUSE_UNICODE_MSLU @@ -432,20 +430,20 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha #define wxCRT_Remove wxMSLU__wremove #define wxCRT_Rename wxMSLU__wrename #else - #define wxCRT_Rename _wrename - #define wxCRT_Fopen _wfopen - #define wxCRT_Freopen _wfreopen + /* WinCE CRT doesn't provide these functions so use our own */ #ifdef __WXWINCE__ - /* carefully: wxCRT_Remove() must return 0 on success while - DeleteFile() returns 0 on error, so don't just define one as - the other */ - int wxCRT_Remove(const wchar_t *path); + WXDLLIMPEXP_BASE int wxCRT_Rename(const wchar_t *src, + const wchar_t *dst); + WXDLLIMPEXP_BASE int wxCRT_Remove(const wchar_t *path); #else + #define wxCRT_Rename _wrename #define wxCRT_Remove _wremove #endif + #define wxCRT_Fopen _wfopen + #define wxCRT_Freopen _wfreopen #endif -#endif // wxMBFILES/!wxMBFILES +#endif /* wxMBFILES/!wxMBFILES */ #define wxCRT_PutsA puts #define wxCRT_FputsA fputs @@ -454,23 +452,21 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha #define wxCRT_FgetcA fgetc #define wxCRT_UngetcA ungetc -#ifndef wxHAS_NO_WCS_FUNCTIONS - #ifdef wxHAVE_TCHAR_SUPPORT - #define wxCRT_PutsW _putws - #define wxCRT_FputsW fputws - #define wxCRT_FputcW fputwc - #endif - #ifdef HAVE_FPUTWS - #define wxCRT_FputsW fputws - #endif - #ifdef HAVE_PUTWS - #define wxCRT_PutsW putws - #endif - #ifdef HAVE_FPUTWC - #define wxCRT_FputcW fputwc - #endif - #define wxCRT_FgetsW fgetws -#endif // !wxHAS_NO_WCS_FUNCTIONS +#ifdef wxHAVE_TCHAR_SUPPORT + #define wxCRT_PutsW _putws + #define wxCRT_FputsW fputws + #define wxCRT_FputcW fputwc +#endif +#ifdef HAVE_FPUTWS + #define wxCRT_FputsW fputws +#endif +#ifdef HAVE_PUTWS + #define wxCRT_PutsW putws +#endif +#ifdef HAVE_FPUTWC + #define wxCRT_FputcW fputwc +#endif +#define wxCRT_FgetsW fgetws #ifndef wxCRT_PutsW WXDLLIMPEXP_BASE int wxCRT_PutsW(const wchar_t *ws); @@ -484,20 +480,23 @@ WXDLLIMPEXP_BASE int wxCRT_FputsW(const wchar_t *ch, FILE *stream); WXDLLIMPEXP_BASE int wxCRT_FputcW(wchar_t wc, FILE *stream); #endif -#define wxCRT_TmpnamA tmpnam -#ifdef _ttmpnam - #define wxCRT_TmpnamW _wtmpnam -#endif +/* + NB: tmpnam() is unsafe and thus is not wrapped! + Use other wxWidgets facilities instead: + wxFileName::CreateTempFileName, wxTempFile, or wxTempFileOutputStream +*/ +#define wxTmpnam(x) wxTmpnam_is_insecure_use_wxTempFile_instead -#ifndef wxCRT_TmpnamW -WXDLLIMPEXP_BASE wchar_t *wxCRT_TmpnamW(wchar_t *s); -#endif +/* FIXME-CE: provide our own perror() using ::GetLastError() */ +#ifndef __WXWINCE__ #define wxCRT_PerrorA perror #ifdef wxHAVE_TCHAR_SUPPORT #define wxCRT_PerrorW _wperror #endif +#endif /* !__WXWINCE__ */ + /* ------------------------------------------------------------------------- stdlib.h ------------------------------------------------------------------------- */ @@ -505,8 +504,8 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_TmpnamW(wchar_t *s); /* 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 wxCRT_GetenvA(name) ((char*)NULL) - #define wxCRT_GetenvW(name) ((wchar_t*)NULL) + #define wxCRT_GetenvA(name) (name, NULL) + #define wxCRT_GetenvW(name) (name, NULL) #else #define wxCRT_GetenvA getenv #ifdef _tgetenv @@ -541,7 +540,9 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); #define wxCRT_AtolW _wtol /* _wtof doesn't exist */ #else +#ifndef __VMS #define wxCRT_AtofW(s) wcstof(s, NULL) +#endif #define wxCRT_AtolW(s) wcstol(s, NULL, 10) /* wcstoi doesn't exist */ #endif @@ -599,66 +600,41 @@ WXDLLIMPEXP_BASE size_t wxCRT_StrftimeW(wchar_t *s, size_t max, ctype.h ------------------------------------------------------------------------- */ -#ifdef wxHAS_NO_WCS_FUNCTIONS - #define wxNEED_WX_CTYPE_H -#endif - #ifdef __WATCOMC__ #define WXWCHAR_T_CAST(c) (wint_t)(c) #else #define WXWCHAR_T_CAST(c) c #endif -#ifdef wxNEED_WX_CTYPE_H - - /* RN: Used only under OSX <= 10.2 currently */ - WXDLLIMPEXP_BASE int wxCRT_IsalnumW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsalphaW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IscntrlW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsdigitW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsgraphW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IslowerW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsprintW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IspunctW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsspaceW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsupperW(wchar_t ch); - WXDLLIMPEXP_BASE int wxCRT_IsxdigitW(wchar_t ch); - /* extern "C" because needed by regex code */ - WXDLLIMPEXP_BASE extern "C" int wxCRT_TolowerW(wchar_t ch); - WXDLLIMPEXP_BASE extern "C" int wxCRT_ToupperW(wchar_t ch); - -#else // !defined(wxNEED_WX_CTYPE_H) - - #define wxCRT_IsalnumW(c) iswalnum(WXWCHAR_T_CAST(c)) - #define wxCRT_IsalphaW(c) iswalpha(WXWCHAR_T_CAST(c)) - #define wxCRT_IscntrlW(c) iswcntrl(WXWCHAR_T_CAST(c)) - #define wxCRT_IsdigitW(c) iswdigit(WXWCHAR_T_CAST(c)) - #define wxCRT_IsgraphW(c) iswgraph(WXWCHAR_T_CAST(c)) - #define wxCRT_IslowerW(c) iswlower(WXWCHAR_T_CAST(c)) - #define wxCRT_IsprintW(c) iswprint(WXWCHAR_T_CAST(c)) - #define wxCRT_IspunctW(c) iswpunct(WXWCHAR_T_CAST(c)) - #define wxCRT_IsspaceW(c) iswspace(WXWCHAR_T_CAST(c)) - #define wxCRT_IsupperW(c) iswupper(WXWCHAR_T_CAST(c)) - #define wxCRT_IsxdigitW(c) iswxdigit(WXWCHAR_T_CAST(c)) - - #ifdef __GLIBC__ - #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 wxCRT_TolowerW(wc) towctrans((wc), (wctrans_t)__ctype_tolower) - #define wxCRT_ToupperW(wc) towctrans((wc), (wctrans_t)__ctype_toupper) - #else /* !glibc 2.0 */ - #define wxCRT_TolowerW towlower - #define wxCRT_ToupperW towupper - #endif - #else // !__GLIBC__ - /* There is a bug in VC6 C RTL: toxxx() functions dosn't do anything - with signed chars < 0, so "fix" it here. */ - #define wxCRT_TolowerW(c) towlower((wxUChar)(wxChar)(c)) - #define wxCRT_ToupperW(c) towupper((wxUChar)(wxChar)(c)) - #endif // __GLIBC__/!__GLIBC__ -#endif // !defined(wxNEED_WX_CTYPE_H) +#define wxCRT_IsalnumW(c) iswalnum(WXWCHAR_T_CAST(c)) +#define wxCRT_IsalphaW(c) iswalpha(WXWCHAR_T_CAST(c)) +#define wxCRT_IscntrlW(c) iswcntrl(WXWCHAR_T_CAST(c)) +#define wxCRT_IsdigitW(c) iswdigit(WXWCHAR_T_CAST(c)) +#define wxCRT_IsgraphW(c) iswgraph(WXWCHAR_T_CAST(c)) +#define wxCRT_IslowerW(c) iswlower(WXWCHAR_T_CAST(c)) +#define wxCRT_IsprintW(c) iswprint(WXWCHAR_T_CAST(c)) +#define wxCRT_IspunctW(c) iswpunct(WXWCHAR_T_CAST(c)) +#define wxCRT_IsspaceW(c) iswspace(WXWCHAR_T_CAST(c)) +#define wxCRT_IsupperW(c) iswupper(WXWCHAR_T_CAST(c)) +#define wxCRT_IsxdigitW(c) iswxdigit(WXWCHAR_T_CAST(c)) + +#ifdef __GLIBC__ + #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 wxCRT_TolowerW(wc) towctrans((wc), (wctrans_t)__ctype_tolower) + #define wxCRT_ToupperW(wc) towctrans((wc), (wctrans_t)__ctype_toupper) + #else /* !glibc 2.0 */ + #define wxCRT_TolowerW towlower + #define wxCRT_ToupperW towupper + #endif +#else /* !__GLIBC__ */ + /* There is a bug in VC6 C RTL: toxxx() functions dosn't do anything + with signed chars < 0, so "fix" it here. */ + #define wxCRT_TolowerW(c) towlower((wxUChar)(wxChar)(c)) + #define wxCRT_ToupperW(c) towupper((wxUChar)(wxChar)(c)) +#endif /* __GLIBC__/!__GLIBC__ */