* 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 Kaaven
* Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
* Created: 1998/06/12
* RCS-ID: $Id$
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 <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(__MWERKS__)
+ #if defined(__WX_STRICT_ANSI_GCC__)
#define wxNEED_ISASCII
#elif defined(_WIN32_WCE)
#if _WIN32_WCE <= 211
#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
#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
------------------------------------------------------------------------- */
#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 */
/* -------------------------------------------------------------------------
#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
#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 */
+#if !defined(__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
-
- /* 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
+#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
- #elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
- #define wxCRT_StrdupA strdup
#endif
- #if defined(__WINDOWS__)
- #define wxCRT_StrdupW _wcsdup
- #elif !defined(__DARWIN__) && !defined( __VMS )
- #define wxCRT_StrdupW wcsdup
- #endif
-#else
- #define wxCRT_StrdupA strdup
- /* the rest is implemented in our code */
+#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
#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 */
-/* note that we definitely are going to need our own version for widechar
- * versions */
-#if !defined(wxCRT_StricmpA)
- #if defined(__BORLANDC__) || defined(__WATCOMC__) || \
- defined(__SALFORDC__) || defined(__VISAGECPP__) || \
- 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 strnicmp
- #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
- (defined(__MWERKS__) && defined(__INTEL__))
- #define wxCRT_StricmpA _stricmp
- #define wxCRT_StrnicmpA _strnicmp
- #elif defined(__UNIX__) || defined(__GNUWIN32__)
- #define wxCRT_StricmpA strcasecmp
- #define wxCRT_StrnicmpA strncasecmp
- /* #else -- use wxWidgets implementation */
+#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
-#endif /* !defined(wxCRT_StricmpA) */
-/* FIXME-UTF8: use wcs(n)casecmp if available for *W versions */
+/* #else -- use wxWidgets implementation */
+#endif
#ifdef HAVE_STRTOK_R
#define wxCRT_StrtokA(str, sep, last) strtok_r(str, sep, last)
#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 */
/* -------------------------------------------------------------------------
/* 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
+ #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);
#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
#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);
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
------------------------------------------------------------------------- */
/* 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
#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 */
#else
#ifndef __VMS
- #define wxCRT_AtofW(s) wcstof(s, NULL)
+ #define wxCRT_AtofW(s) wcstod(s, NULL)
#endif
#define wxCRT_AtolW(s) wcstol(s, NULL, 10)
/* 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
-
#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
------------------------------------------------------------------------- */
#define wxCRT_StrftimeA strftime
-/* FIXME-UTF8: when is this available? */
-#define wxCRT_StrftimeW wcsftime
+#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,
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__ */
/* 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 */