2. split wxcrt.h into wxcrtbase.h with lowlevel compiler-specific definitions and wxcrt.h with ANSI- and Unicode-compatible wx wrappers git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46392 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			688 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			688 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Name:        wx/wxcrtbase.h
 | 
						|
 * Purpose:     Type-safe ANSI and Unicode builds compatible wrappers for
 | 
						|
 *              CRT functions
 | 
						|
 * Author:      Joel Farley, Ove Kåven
 | 
						|
 * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
 | 
						|
 * Created:     1998/06/12
 | 
						|
 * RCS-ID:      $Id$
 | 
						|
 * 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!
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <ctype.h>
 | 
						|
#include <wctype.h>
 | 
						|
#include <time.h>
 | 
						|
 | 
						|
 | 
						|
#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
 | 
						|
 | 
						|
/*
 | 
						|
   a few compilers don't have the (non standard but common) isascii function,
 | 
						|
   define it ourselves for them
 | 
						|
 */
 | 
						|
#ifndef isascii
 | 
						|
    #if defined(__MWERKS__)
 | 
						|
        #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) == _T(' ') || (c) == _T('\t'))
 | 
						|
    #endif
 | 
						|
#endif /* _WIN32_WCE */
 | 
						|
 | 
						|
/* string.h functions */
 | 
						|
#ifndef strdup
 | 
						|
    #if defined(__MWERKS__) && !defined(__MACH__) && (__MSL__ < 0x00008000)
 | 
						|
        #define wxNEED_STRDUP
 | 
						|
    #elif 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 */
 | 
						|
 | 
						|
 | 
						|
#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!
 | 
						|
        #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_StrcollA   strcoll
 | 
						|
#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_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
 | 
						|
 | 
						|
#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 */
 | 
						|
    #if defined(__VISUALC__) && __VISUALC__ >= 1400
 | 
						|
        #define wxCRT_StrdupA _strdup
 | 
						|
    #elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
 | 
						|
        #define wxCRT_StrdupA strdup
 | 
						|
    #endif
 | 
						|
    #ifdef __WINDOWS__
 | 
						|
        #define wxCRT_StrdupW _wcsdup
 | 
						|
    #else
 | 
						|
        #define wxCRT_StrdupW wcsdup
 | 
						|
    #endif
 | 
						|
#else
 | 
						|
    #define wxCRT_StrdupA    strdup
 | 
						|
    /* the rest is implemented in our code */
 | 
						|
#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
 | 
						|
 | 
						|
 | 
						|
/* 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 */
 | 
						|
    #endif
 | 
						|
#endif /* !defined(wxCRT_StricmpA) */
 | 
						|
/* FIXME-UTF8: use wcs(n)casecmp if available for *W versions */
 | 
						|
 | 
						|
#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 */
 | 
						|
#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
 | 
						|
 | 
						|
 | 
						|
/* -------------------------------------------------------------------------
 | 
						|
                                  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
 | 
						|
            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_Remove    wxMSLU__wremove
 | 
						|
            #define wxCRT_Rename    wxMSLU__wrename
 | 
						|
    #else
 | 
						|
        #define wxCRT_Rename   _wrename
 | 
						|
        #define wxCRT_Fopen    _wfopen
 | 
						|
        #define wxCRT_Freopen  _wfreopen
 | 
						|
        #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);
 | 
						|
        #else
 | 
						|
            #define wxCRT_Remove _wremove
 | 
						|
        #endif
 | 
						|
    #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
 | 
						|
 | 
						|
#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
 | 
						|
 | 
						|
#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
 | 
						|
 | 
						|
#define wxCRT_TmpnamA     tmpnam
 | 
						|
#ifdef _ttmpnam
 | 
						|
    #define wxCRT_TmpnamW _wtmpnam
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef wxCRT_TmpnamW
 | 
						|
WXDLLIMPEXP_BASE wchar_t *wxCRT_TmpnamW(wchar_t *s);
 | 
						|
#endif
 | 
						|
 | 
						|
#define wxCRT_PerrorA   perror
 | 
						|
#ifdef wxHAVE_TCHAR_SUPPORT
 | 
						|
    #define wxCRT_PerrorW _wperror
 | 
						|
#endif
 | 
						|
 | 
						|
/* -------------------------------------------------------------------------
 | 
						|
                                  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)
 | 
						|
#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(__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)
 | 
						|
    #define  wxCRT_AtoiW           _wtoi
 | 
						|
    #define  wxCRT_AtolW           _wtol
 | 
						|
    /* _wtof doesn't exist */
 | 
						|
#else
 | 
						|
    #define wxCRT_AtofW(s)         wcstof(s, NULL)
 | 
						|
    #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
 | 
						|
        #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!! */
 | 
						|
    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
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/* -------------------------------------------------------------------------
 | 
						|
                                time.h
 | 
						|
   ------------------------------------------------------------------------- */
 | 
						|
 | 
						|
#define wxCRT_StrftimeA  strftime
 | 
						|
/* FIXME-UTF8: when is this available? */
 | 
						|
#define wxCRT_StrftimeW  wcsftime
 | 
						|
 | 
						|
#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 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)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/* -------------------------------------------------------------------------
 | 
						|
       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; }
 | 
						|
#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); }
 | 
						|
 | 
						|
#endif /* __cplusplus */
 | 
						|
 | 
						|
#endif /* _WX_WXCRTBASE_H_ */
 |