X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ffecfa5aeb540b54914739dbb8603edbbd4c00a0..07f93593809177eda6317a13f9b111759a52a3d2:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index 0d2fc9ad70..6d560af956 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -5,7 +5,7 @@ * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 * RCS-ID: $Id$ - * Copyright: (c) 1998-2002 wxWidgets dev team + * Copyright: (c) 1998-2002 Joel Farley, Ove Kåven, Robert Roebling, Ron Lee * Licence: wxWindows licence */ @@ -14,12 +14,12 @@ #ifndef _WX_WXCHAR_H_ #define _WX_WXCHAR_H_ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma interface "wxchar.h" -#endif - #include "wx/defs.h" /* for wxUSE_UNICODE */ +#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 + /* check whether we have wchar_t and which size it is if we do */ #if !defined(wxUSE_WCHAR_T) #if defined(__UNIX__) @@ -87,12 +87,17 @@ /* Cygwin versions, wchar.h requires sys/types.h */ #ifdef __CYGWIN__ #include - extern "C" { + #ifdef __cplusplus + extern "C" { + #endif #endif /* Cygwin */ - #include - #ifdef __CYGWIN__ + + #include + + #if defined(__CYGWIN__) && defined(__cplusplus) } - #endif /* Cygwin */ + #endif /* Cygwin and C++ */ + #elif defined(HAVE_WCSTR_H) /* old compilers have relevant declarations here */ #include @@ -118,7 +123,9 @@ #define wxHAVE_TCHAR_SUPPORT #elif defined(__DMC__) #define wxHAVE_TCHAR_SUPPORT -#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) && !defined(__PALMOS__) +#elif defined(__WXPALMOS__) + #include +#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) #define wxHAVE_TCHAR_SUPPORT #include #include @@ -242,18 +249,24 @@ #ifdef wxHAVE_TCHAR_SUPPORT #include + #if defined(__WATCOMC__) && defined(UNICODE) + #define WXWCHAR_T_CAST(c) (wint_t)(c) + #else + #define WXWCHAR_T_CAST(c) c + #endif + /* ctype.h functions */ - #define wxIsalnum _istalnum - #define wxIsalpha _istalpha - #define wxIscntrl _istcntrl - #define wxIsdigit _istdigit - #define wxIsgraph _istgraph - #define wxIslower _istlower - #define wxIsprint _istprint - #define wxIspunct _istpunct - #define wxIsspace _istspace - #define wxIsupper _istupper - #define wxIsxdigit _istxdigit + #define wxIsalnum(c) _istalnum(WXWCHAR_T_CAST(c)) + #define wxIsalpha(c) _istalpha(WXWCHAR_T_CAST(c)) + #define wxIscntrl(c) _istcntrl(WXWCHAR_T_CAST(c)) + #define wxIsdigit(c) _istdigit(WXWCHAR_T_CAST(c)) + #define wxIsgraph(c) _istgraph(WXWCHAR_T_CAST(c)) + #define wxIslower(c) _istlower(WXWCHAR_T_CAST(c)) + #define wxIsprint(c) _istprint(WXWCHAR_T_CAST(c)) + #define wxIspunct(c) _istpunct(WXWCHAR_T_CAST(c)) + #define wxIsspace(c) _istspace(WXWCHAR_T_CAST(c)) + #define wxIsupper(c) _istupper(WXWCHAR_T_CAST(c)) + #define wxIsxdigit(c) _istxdigit(WXWCHAR_T_CAST(c)) /* There is a bug in VC6 C RTL: toxxx() functions dosn't do anything with @@ -293,7 +306,11 @@ #define wxFgetc _fgettc #define wxFgetchar _fgettchar #define wxFgets _fgetts - #define wxFopen _tfopen + #if wxUSE_UNICODE_MSLU + #define wxFopen wxMSLU__tfopen + #else + #define wxFopen _tfopen + #endif #define wxFputc _fputtc #define wxFputchar _fputtchar #define wxFprintf _ftprintf @@ -305,7 +322,7 @@ #define wxGets _getts #define wxPerror _tperror #define wxPrintf _tprintf - #define wxPutc _puttc + #define wxPutc(c,f) _puttc(WXWCHAR_T_CAST(c),f) #define wxPutchar _puttchar #define wxPuts _putts #define wxScanf _tscanf @@ -343,7 +360,9 @@ #define wxRename wxMSLU__trename #else #ifdef __WXWINCE__ - #define wxRemove DeleteFile + /* carefully: wxRemove() must return 0 on success while DeleteFile() + returns 0 on error, so don't just define one as the other */ + int wxRemove(const wxChar *path); #else #define wxRemove _tremove #define wxRename _trename @@ -354,31 +373,40 @@ #define wxAtoi _ttoi #define wxAtol _ttol /* #define wxAtof _tttof -- notice that there is no such thing (why?) */ - #define wxGetenv _tgetenv + /* 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 wxGetenv(name) ((wxChar *)NULL) + #else + #define wxGetenv _tgetenv + #endif #define wxSystem _tsystem /* time.h functions */ #define wxAsctime _tasctime #define wxCtime _tctime + + #define wxMbstowcs mbstowcs + #define wxWcstombs wcstombs #else /* !TCHAR-aware compilers */ #if !defined(__MWERKS__) && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) - /* even though they are defined and "implemented", they are bad and just + /* 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!! */ - #define mbstowcs wxInternalMbstowcs - #define wcstombs wxInternalWcstombs - - WXDLLIMPEXP_BASE size_t wxInternalMbstowcs (wchar_t *, const char *, size_t); - WXDLLIMPEXP_BASE size_t wxInternalWcstombs (char *, const wchar_t *, size_t); + 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 - + /* No UNICODE in the c library except wchar_t typedef on mac OSX 10.2 and less - roll our own */ #if !defined(__MWERKS__) && wxUSE_UNICODE && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) - + /* we need everything! */ #define wxNEED_WX_STRING_H #define wxNEED_WX_CTYPE_H - + #define wxFgetchar(c) wxFgetc(c, stdin) #define wxFputc wxPutc #define wxFputchar(c) wxPutc(c, stdout) @@ -395,11 +423,11 @@ #define wxNEED_FPUTS #define wxNEED_PUTS #define wxNEED_PUTC - + int wxFputs(const wxChar *ch, FILE *stream); int wxPuts(const wxChar *ws); int wxPutc(wxChar ch, FILE *stream); - + #ifdef __cplusplus extern "C" { #endif @@ -409,12 +437,12 @@ #endif #define wxPutchar(wch) wxPutc(wch, stdout) - + #define wxNEED_PRINTF_CONVERSION #define wxNEED_WX_STDIO_H #define wxNEED_WX_STDLIB_H #define wxNEED_WX_TIME_H - + #elif wxUSE_UNICODE #include @@ -693,12 +721,12 @@ defined(__EMX__) || defined(__DJGPP__) #define wxStricmp stricmp #define wxStrnicmp strnicmp - #elif defined(__PALMOS__) - /* FIXME: There is no equivalent to strnicmp in the Palm OS API. This - * quick hack should do until one can be written. + #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 wxStricmp StrCaselessCompare - #define wxStrnicmp strnicmp + #define wxStrnicmp strnicmp #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \ (defined(__MWERKS__) && defined(__INTEL__)) #define wxStricmp _stricmp @@ -749,14 +777,37 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ /* printf() family saga */ /* - For some systems vsnprintf() exists in the system libraries but not in the + For some systems [v]snprintf() exists in the system libraries but not in the headers, so we need to declare it ourselves to be able to use it. */ #if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL) +#ifdef __cplusplus extern "C" +#else + extern +#endif int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif /* !HAVE_VSNPRINTF_DECL */ +#if defined(HAVE_SNPRINTF) && !defined(HAVE_SNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int snprintf(char *str, size_t size, const char *format, ...); +#endif /* !HAVE_SNPRINTF_DECL */ + +/* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the + * same isn't done for snprintf below, the builtin wxSnprintf_ is used + * instead since it's already a simple wrapper */ +#if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + inline int wx_fixed_vsnprintf(char *str, size_t size, const char *format, va_list ap) + { + return vsnprintf(str, size, (char*)format, ap); + } +#endif + /* First of all, we always want to define safe snprintf() function to be used instead of sprintf(). Some compilers already have it (or rather vsnprintf() @@ -784,11 +835,18 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ #endif #else /* ASCII */ /* all versions of CodeWarrior supported by wxWidgets apparently have */ - /* vsnprintf() */ + /* both snprintf() and vsnprintf() */ + #if defined(HAVE_SNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) + #ifndef HAVE_BROKEN_SNPRINTF_DECL + #define wxSnprintf_ snprintf + #endif + #endif #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__) - /* assume we have snprintf() too if we have vsnprintf() */ - #define wxVsnprintf_ vsnprintf - #define wxSnprintf_ snprintf + #if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + #define wxVsnprintf_ wx_fixed_vsnprintf + #else + #define wxVsnprintf_ vsnprintf + #endif #endif #endif #endif /* wxVsnprintf_ not defined yet */ @@ -938,14 +996,14 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ WXDLLIMPEXP_BASE char *strdup(const char* s); #endif -/* RN: Used only under OSX <= 10.2 currently +/* RN: Used only under OSX <= 10.2 currently The __cplusplus ifdefs are messy, but they are required to build the regex library, since c does not support function overloading */ #ifdef wxNEED_WX_STRING_H -# ifdef __cplusplus +# ifdef __cplusplus extern "C" { -# endif +# endif WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src); WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c); WXDLLIMPEXP_BASE int wxStrcmp(const wxChar *s1, const wxChar *s2); @@ -959,9 +1017,9 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c); WXDLLIMPEXP_BASE size_t wxStrspn(const wxChar *s, const wxChar *accept); WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); -# ifdef __cplusplus +# ifdef __cplusplus } -# endif +# endif /* These functions use C++, so we can't c extern them */ WXDLLIMPEXP_BASE double wxStrtod(const wxChar *nptr, wxChar **endptr); @@ -1089,27 +1147,27 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxWX2WC wxMB2WC #endif -// -// RN: The following are not normal versions of memcpy et al., rather -// these are either char or widechar versions depending on -// if unicode is used or not. -// +/* + RN: The following are not normal versions of memcpy et al., rather + these are either char or widechar versions depending on + if unicode is used or not. +*/ #ifdef __cplusplus // - // RN: We could do the usual tricky compiler detection here, + // RN: We could do the usual tricky compiler detection here, // and use their variant (such as wmemchr, etc.). The problem - // is that these functions are quite rare, even though they are + // is that these functions are quite rare, even though they are // part of the current POSIX standard. In addition, most compilers // (including even MSC) inline them just like we do right in their // headers. // #if wxUSE_UNICODE #include //for mem funcs - + //implement our own wmem variants - inline wxChar* wxMemchr(const wxChar* s, wxChar c, size_t l) + inline wxChar* wxTmemchr(const wxChar* s, wxChar c, size_t l) { for(;l && *s != c;--l, ++s) {} @@ -1118,7 +1176,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); return NULL; } - inline int wxMemcmp(const wxChar* sz1, const wxChar* sz2, size_t len) + inline int wxTmemcmp(const wxChar* sz1, const wxChar* sz2, size_t len) { for(; *sz1 == *sz2 && len; --len, ++sz1, ++sz2) {} @@ -1128,17 +1186,17 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); return 0; } - inline wxChar* wxMemcpy(wxChar* szOut, const wxChar* szIn, size_t len) + inline wxChar* wxTmemcpy(wxChar* szOut, const wxChar* szIn, size_t len) { return (wxChar*) memcpy(szOut, szIn, len * sizeof(wxChar)); } - inline wxChar* wxMemmove(wxChar* szOut, const wxChar* szIn, size_t len) + inline wxChar* wxTmemmove(wxChar* szOut, const wxChar* szIn, size_t len) { return (wxChar*) memmove(szOut, szIn, len * sizeof(wxChar)); } - inline wxChar* wxMemset(wxChar* szOut, const wxChar cIn, size_t len) + inline wxChar* wxTmemset(wxChar* szOut, const wxChar cIn, size_t len) { wxChar* szRet = szOut; @@ -1148,13 +1206,13 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); return szRet; } - #else //!wxUSE_UNICODE - # define wxMemchr memchr - # define wxMemcmp memcmp - # define wxMemcpy memcpy - # define wxMemmove memmove - # define wxMemset memset - #endif + #else /* !wxUSE_UNICODE */ + # define wxTmemchr memchr + # define wxTmemcmp memcmp + # define wxTmemcpy memcpy + # define wxTmemmove memmove + # define wxTmemset memset + #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */ #endif /*__cplusplus*/