| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690 |
- /*
- * Name: wx/wxcrtbase.h
- * Purpose: Type-safe ANSI and Unicode builds compatible wrappers for
- * CRT functions
- * Author: Joel Farley, Ove Kaaven
- * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
- * Created: 1998/06/12
- * Copyright: (c) 1998-2006 wxWidgets dev team
- * Licence: wxWindows licence
- */
- /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
- #ifndef _WX_WXCRTBASE_H_
- #define _WX_WXCRTBASE_H_
- /* -------------------------------------------------------------------------
- headers and missing declarations
- ------------------------------------------------------------------------- */
- #include "wx/chartype.h"
- /*
- Standard headers we need here.
- 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.
- */
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <wctype.h>
- #include <time.h>
- #if defined(__WINDOWS__) && !defined(__WXWINCE__)
- #include <io.h>
- #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 **);
- #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(__WX_STRICT_ANSI_GCC__)
- #define wxNEED_ISASCII
- #elif defined(_WIN32_WCE)
- #if _WIN32_WCE <= 211
- #define wxNEED_ISASCII
- #endif
- #endif
- #endif /* isascii */
- #ifdef wxNEED_ISASCII
- inline int isascii(int c) { return (unsigned)c < 0x80; }
- #endif
- #ifdef _WIN32_WCE
- #if _WIN32_WCE <= 211
- #define isspace(c) ((c) == wxT(' ') || (c) == wxT('\t'))
- #endif
- #endif /* _WIN32_WCE */
- /* string.h functions */
- #ifndef strdup
- #if defined(__WXWINCE__)
- #if _WIN32_WCE <= 211
- #define wxNEED_STRDUP
- #endif
- #endif
- #endif /* strdup */
- #ifdef wxNEED_STRDUP
- WXDLLIMPEXP_BASE char *strdup(const char* s);
- #endif
- /* missing functions in some WinCE versions */
- #ifdef _WIN32_WCE
- #if (_WIN32_WCE < 300)
- WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
- #endif
- #endif /* _WIN32_WCE */
- /* -------------------------------------------------------------------------
- UTF-8 locale handling
- ------------------------------------------------------------------------- */
- #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! */
- #if wxUSE_UTF8_LOCALE_ONLY
- #define wxLocaleIsUtf8 true
- #else
- extern WXDLLIMPEXP_BASE bool wxLocaleIsUtf8;
- #endif
- /* function used to update the flag: */
- extern WXDLLIMPEXP_BASE void wxUpdateLocaleIsUtf8();
- #else /* !wxUSE_UNICODE_UTF8 */
- inline void wxUpdateLocaleIsUtf8() {}
- #endif /* wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8 */
- #endif /* __cplusplus */
- /* -------------------------------------------------------------------------
- string.h
- ------------------------------------------------------------------------- */
- #define wxCRT_StrcatA strcat
- #define wxCRT_StrchrA strchr
- #define wxCRT_StrcmpA strcmp
- #define wxCRT_StrcpyA strcpy
- #define wxCRT_StrcspnA strcspn
- #define wxCRT_StrlenA strlen
- #define wxCRT_StrncatA strncat
- #define wxCRT_StrncmpA strncmp
- #define wxCRT_StrncpyA strncpy
- #define wxCRT_StrpbrkA strpbrk
- #define wxCRT_StrrchrA strrchr
- #define wxCRT_StrspnA strspn
- #define wxCRT_StrstrA strstr
- #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 */
- #if !defined(__WXWINCE__)
- #define wxCRT_StrcollA strcoll
- #define wxCRT_StrxfrmA strxfrm
- #define wxCRT_StrcollW wcscoll
- #define wxCRT_StrxfrmW wcsxfrm
- #endif /* __WXWINCE__ */
- /* Almost all compilers have strdup(), but VC++ and MinGW call it _strdup().
- And it's not available in MinGW strict ANSI mode nor under Windows CE. */
- #if (defined(__VISUALC__) && __VISUALC__ >= 1400)
- #define wxCRT_StrdupA _strdup
- #elif defined(__MINGW32__)
- #ifndef __WX_STRICT_ANSI_GCC__
- #define wxCRT_StrdupA _strdup
- #endif
- #elif !defined(__WXWINCE__)
- #define wxCRT_StrdupA strdup
- #endif
- /* 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
- #endif
- #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 */
- #ifdef HAVE_WCSLEN
- #define wxCRT_StrlenW wcslen
- #endif
- #define wxCRT_StrtodA strtod
- #define wxCRT_StrtolA strtol
- #define wxCRT_StrtoulA strtoul
- #define wxCRT_StrtodW wcstod
- #define wxCRT_StrtolW wcstol
- #define wxCRT_StrtoulW wcstoul
- #ifdef __VISUALC__
- #if __VISUALC__ >= 1300 && !defined(__WXWINCE__)
- #define wxCRT_StrtollA _strtoi64
- #define wxCRT_StrtoullA _strtoui64
- #define wxCRT_StrtollW _wcstoi64
- #define wxCRT_StrtoullW _wcstoui64
- #endif /* VC++ 7+ */
- #else
- #ifdef HAVE_STRTOULL
- #define wxCRT_StrtollA strtoll
- #define wxCRT_StrtoullA strtoull
- #endif /* HAVE_STRTOULL */
- #ifdef HAVE_WCSTOULL
- /* assume that we have wcstoull(), which is also C99, too */
- #define wxCRT_StrtollW wcstoll
- #define wxCRT_StrtoullW wcstoull
- #endif /* HAVE_WCSTOULL */
- #endif
- /*
- 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 >= 0x600))
- #ifndef HAVE_STRNLEN
- #define HAVE_STRNLEN
- #endif
- #ifndef HAVE_WCSNLEN
- #define HAVE_WCSNLEN
- #endif
- #endif
- #ifdef HAVE_STRNLEN
- #define wxCRT_StrnlenA strnlen
- #endif
- #ifdef HAVE_WCSNLEN
- #define wxCRT_StrnlenW wcsnlen
- #endif
- /* define wxCRT_StricmpA/W and wxCRT_StrnicmpA/W for various compilers */
- #if defined(__BORLANDC__) || defined(__WATCOMC__) || \
- defined(__VISAGECPP__) || \
- defined(__EMX__) || defined(__DJGPP__)
- #define wxCRT_StricmpA stricmp
- #define wxCRT_StrnicmpA strnicmp
- #elif defined(__SYMANTEC__) || (defined(__VISUALC__) && !defined(__WXWINCE__))
- #define wxCRT_StricmpA _stricmp
- #define wxCRT_StrnicmpA _strnicmp
- #elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__WX_STRICT_ANSI_GCC__))
- #define wxCRT_StricmpA strcasecmp
- #define wxCRT_StrnicmpA strncasecmp
- /* #else -- use wxWidgets implementation */
- #endif
- #ifdef __VISUALC__
- #define wxCRT_StricmpW _wcsicmp
- #define wxCRT_StrnicmpW _wcsnicmp
- #elif defined(__UNIX__)
- #ifdef HAVE_WCSCASECMP
- #define wxCRT_StricmpW wcscasecmp
- #endif
- #ifdef HAVE_WCSNCASECMP
- #define wxCRT_StrnicmpW wcsncasecmp
- #endif
- /* #else -- use wxWidgets implementation */
- #endif
- #ifdef HAVE_STRTOK_R
- #define wxCRT_StrtokA(str, sep, last) strtok_r(str, sep, last)
- #endif
- /* FIXME-UTF8: detect and use wcstok() if available for wxCRT_StrtokW */
- /* these are extern "C" because they are used by regex lib: */
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifndef wxCRT_StrlenW
- WXDLLIMPEXP_BASE size_t wxCRT_StrlenW(const wchar_t *s);
- #endif
- #ifndef wxCRT_StrncmpW
- WXDLLIMPEXP_BASE int wxCRT_StrncmpW(const wchar_t *s1, const wchar_t *s2, size_t n);
- #endif
- #ifdef __cplusplus
- }
- #endif
- /* FIXME-UTF8: remove this once we are Unicode only */
- #if wxUSE_UNICODE
- #define wxCRT_StrlenNative wxCRT_StrlenW
- #define wxCRT_StrncmpNative wxCRT_StrncmpW
- #define wxCRT_ToupperNative wxCRT_ToupperW
- #define wxCRT_TolowerNative wxCRT_TolowerW
- #else
- #define wxCRT_StrlenNative wxCRT_StrlenA
- #define wxCRT_StrncmpNative wxCRT_StrncmpA
- #define wxCRT_ToupperNative toupper
- #define wxCRT_TolowerNative tolower
- #endif
- #ifndef wxCRT_StrcatW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrcatW(wchar_t *dest, const wchar_t *src);
- #endif
- #ifndef wxCRT_StrchrW
- WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrchrW(const wchar_t *s, wchar_t c);
- #endif
- #ifndef wxCRT_StrcmpW
- WXDLLIMPEXP_BASE int wxCRT_StrcmpW(const wchar_t *s1, const wchar_t *s2);
- #endif
- #ifndef wxCRT_StrcollW
- WXDLLIMPEXP_BASE int wxCRT_StrcollW(const wchar_t *s1, const wchar_t *s2);
- #endif
- #ifndef wxCRT_StrcpyW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrcpyW(wchar_t *dest, const wchar_t *src);
- #endif
- #ifndef wxCRT_StrcspnW
- WXDLLIMPEXP_BASE size_t wxCRT_StrcspnW(const wchar_t *s, const wchar_t *reject);
- #endif
- #ifndef wxCRT_StrncatW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrncatW(wchar_t *dest, const wchar_t *src, size_t n);
- #endif
- #ifndef wxCRT_StrncpyW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrncpyW(wchar_t *dest, const wchar_t *src, size_t n);
- #endif
- #ifndef wxCRT_StrpbrkW
- WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrpbrkW(const wchar_t *s, const wchar_t *accept);
- #endif
- #ifndef wxCRT_StrrchrW
- WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrrchrW(const wchar_t *s, wchar_t c);
- #endif
- #ifndef wxCRT_StrspnW
- WXDLLIMPEXP_BASE size_t wxCRT_StrspnW(const wchar_t *s, const wchar_t *accept);
- #endif
- #ifndef wxCRT_StrstrW
- WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrstrW(const wchar_t *haystack, const wchar_t *needle);
- #endif
- #ifndef wxCRT_StrtodW
- WXDLLIMPEXP_BASE double wxCRT_StrtodW(const wchar_t *nptr, wchar_t **endptr);
- #endif
- #ifndef wxCRT_StrtolW
- WXDLLIMPEXP_BASE long int wxCRT_StrtolW(const wchar_t *nptr, wchar_t **endptr, int base);
- #endif
- #ifndef wxCRT_StrtoulW
- WXDLLIMPEXP_BASE unsigned long int wxCRT_StrtoulW(const wchar_t *nptr, wchar_t **endptr, int base);
- #endif
- #ifndef wxCRT_StrxfrmW
- WXDLLIMPEXP_BASE size_t wxCRT_StrxfrmW(wchar_t *dest, const wchar_t *src, size_t n);
- #endif
- #ifndef wxCRT_StrdupA
- WXDLLIMPEXP_BASE char *wxCRT_StrdupA(const char *psz);
- #endif
- #ifndef wxCRT_StrdupW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrdupW(const wchar_t *pwz);
- #endif
- #ifndef wxCRT_StricmpA
- WXDLLIMPEXP_BASE int wxCRT_StricmpA(const char *psz1, const char *psz2);
- #endif
- #ifndef wxCRT_StricmpW
- WXDLLIMPEXP_BASE int wxCRT_StricmpW(const wchar_t *psz1, const wchar_t *psz2);
- #endif
- #ifndef wxCRT_StrnicmpA
- WXDLLIMPEXP_BASE int wxCRT_StrnicmpA(const char *psz1, const char *psz2, size_t len);
- #endif
- #ifndef wxCRT_StrnicmpW
- WXDLLIMPEXP_BASE int wxCRT_StrnicmpW(const wchar_t *psz1, const wchar_t *psz2, size_t len);
- #endif
- #ifndef wxCRT_StrtokA
- WXDLLIMPEXP_BASE char *wxCRT_StrtokA(char *psz, const char *delim, char **save_ptr);
- #endif
- #ifndef wxCRT_StrtokW
- WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wchar_t **save_ptr);
- #endif
- /* supply strtoll and strtoull, if needed */
- #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 */
- /* -------------------------------------------------------------------------
- stdio.h
- ------------------------------------------------------------------------- */
- #if defined(__UNIX__) || defined(__WXMAC__)
- #define wxMBFILES 1
- #else
- #define wxMBFILES 0
- #endif
- /* 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 */
- #define wxCRT_Fopen fopen
- #define wxCRT_Freopen freopen
- #define wxCRT_Remove remove
- #define wxCRT_Rename rename
- #else /* Unicode filenames */
- /* special case: these functions are missing under Win9x with Unicows so we
- have to implement them ourselves */
- #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);
- WXDLLIMPEXP_BASE int wxMSLU__wremove(const wchar_t *name);
- #define wxCRT_Fopen wxMSLU__wfopen
- #define wxCRT_Freopen wxMSLU__wfreopen
- #define wxCRT_Remove wxMSLU__wremove
- #define wxCRT_Rename wxMSLU__wrename
- #else
- /* WinCE CRT doesn't provide these functions so use our own */
- #ifdef __WXWINCE__
- 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 */
- #define wxCRT_PutsA puts
- #define wxCRT_FputsA fputs
- #define wxCRT_FgetsA fgets
- #define wxCRT_FputcA fputc
- #define wxCRT_FgetcA fgetc
- #define wxCRT_UngetcA ungetc
- #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);
- #endif
- #ifndef wxCRT_FputsW
- WXDLLIMPEXP_BASE int wxCRT_FputsW(const wchar_t *ch, FILE *stream);
- #endif
- #ifndef wxCRT_FputcW
- WXDLLIMPEXP_BASE int wxCRT_FputcW(wchar_t wc, FILE *stream);
- #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
- /* 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
- ------------------------------------------------------------------------- */
- /* 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) (name, NULL)
- #define wxCRT_GetenvW(name) (name, NULL)
- #else
- #define wxCRT_GetenvA getenv
- #ifdef _tgetenv
- #define wxCRT_GetenvW _wgetenv
- #endif
- #endif
- #ifndef wxCRT_GetenvW
- WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name);
- #endif
- #define wxCRT_SystemA system
- /* mingw32 doesn't provide _tsystem() or _wsystem(): */
- #if defined(_tsystem)
- #define wxCRT_SystemW _wsystem
- #endif
- #define wxCRT_AtofA atof
- #define wxCRT_AtoiA atoi
- #define wxCRT_AtolA atol
- #if defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__)
- #define wxCRT_AtoiW _wtoi
- #define wxCRT_AtolW _wtol
- /* _wtof doesn't exist */
- #else
- #ifndef __VMS
- #define wxCRT_AtofW(s) wcstod(s, NULL)
- #endif
- #define wxCRT_AtolW(s) wcstol(s, NULL, 10)
- /* wcstoi doesn't exist */
- #endif
- /* -------------------------------------------------------------------------
- time.h
- ------------------------------------------------------------------------- */
- #define wxCRT_StrftimeA strftime
- #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 <standards.h> 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,
- const wchar_t *fmt,
- const struct tm *tm);
- #endif
- /* -------------------------------------------------------------------------
- ctype.h
- ------------------------------------------------------------------------- */
- #ifdef __WATCOMC__
- #define WXWCHAR_T_CAST(c) (wint_t)(c)
- #else
- #define WXWCHAR_T_CAST(c) c
- #endif
- #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__ */
- /* -------------------------------------------------------------------------
- wx wrappers for CRT functions in both char* and wchar_t* versions
- ------------------------------------------------------------------------- */
- #ifdef __cplusplus
- /* NB: this belongs to wxcrt.h and not this header, but it makes life easier
- * for buffer.h and stringimpl.h (both of which must be included before
- * string.h, which is required by wxcrt.h) to have them here: */
- /* safe version of strlen() (returns 0 if passed NULL pointer) */
- inline size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s) : 0; }
- inline size_t wxStrlen(const wchar_t *s) { return s ? wxCRT_StrlenW(s) : 0; }
- #ifndef wxWCHAR_T_IS_WXCHAR16
- WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar16 *s );
- #endif
- #ifndef wxWCHAR_T_IS_WXCHAR32
- WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar32 *s );
- #endif
- #define wxWcslen wxCRT_StrlenW
- #define wxStrdupA wxCRT_StrdupA
- #define wxStrdupW wxCRT_StrdupW
- inline char* wxStrdup(const char *s) { return wxCRT_StrdupA(s); }
- inline wchar_t* wxStrdup(const wchar_t *s) { return wxCRT_StrdupW(s); }
- #ifndef wxWCHAR_T_IS_WXCHAR16
- WXDLLIMPEXP_BASE wxChar16* wxStrdup(const wxChar16* s);
- #endif
- #ifndef wxWCHAR_T_IS_WXCHAR32
- WXDLLIMPEXP_BASE wxChar32* wxStrdup(const wxChar32* s);
- #endif
- #endif /* __cplusplus */
- #endif /* _WX_WXCRTBASE_H_ */
|