X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/69429a166f8b168228bbb89eb8c52903670f4fd2..ef094fa075bc56bcbc33b12159c395ea28afda3b:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index b9ddab0988..c6665ef5e5 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -80,9 +80,17 @@ // Required for wxPrintf() etc #include +// Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac +// and VC++ for Windows CE don't provide it +#if !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) + // use #define, not inline wrapper, as it is tested with #ifndef below + #define wxStrdupA strdup +#endif + // non Unix compilers which do have wchar.h (but not tchar.h which is included -// below and which includes wchar.h anyhow) -#if defined(__MWERKS__) || defined(__VISAGECPP__) +// below and which includes wchar.h anyhow). +// Actually MinGW has tchar.h, but it does not include wchar.h +#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) #ifndef HAVE_WCHAR_H #define HAVE_WCHAR_H #endif @@ -90,7 +98,18 @@ #if wxUSE_WCHAR_T #ifdef HAVE_WCHAR_H - #include + // the current (as of Nov 2002) version of cygwin has a bug in its + // wchar.h -- there is no extern "C" around the declarations in it and + // this results in linking errors later; also, at least on some + // Cygwin versions, wchar.h requires sys/types.h + #ifdef __CYGWIN__ + #include + extern "C" { + #endif // Cygwin + #include + #ifdef __CYGWIN__ + } + #endif // Cygwin #elif defined(HAVE_WCSTR_H) // old compilers have relevant declarations here #include @@ -128,6 +147,10 @@ #define wxHAVE_TCHAR_SUPPORT #endif // compilers with (good) TCHAR support +#ifdef __MWERKS__ + #define HAVE_WPRINTF +#endif + #ifdef wxHAVE_TCHAR_SUPPORT // get TCHAR definition if we've got it #include @@ -257,6 +280,7 @@ #define wxStrcoll _tcscoll #define wxStrcpy _tcscpy #define wxStrcspn _tcscspn + #define wxStrdupW _wcsdup // notice the 'W'! #define wxStrftime _tcsftime #define wxStricmp _tcsicmp #define wxStrnicmp _tcsnicmp @@ -414,7 +438,94 @@ #define wxNEED_WX_STDIO_H #define wxNEED_WX_STDLIB_H #define wxNEED_WX_TIME_H - #else // !glibc + #elif defined(__MWERKS__) && ( defined(macintosh) || defined(__MACH__) ) + // ctype.h functions (wctype.h) + #define wxIsalnum iswalnum + #define wxIsalpha iswalpha + #define wxIsctrl iswcntrl + #define wxIsdigit iswdigit + #define wxIsgraph iswgraph + #define wxIslower iswlower + #define wxIsprint iswprint + #define wxIspunct iswpunct + #define wxIsspace iswspace + #define wxIsupper iswupper + #define wxIsxdigit iswxdigit + #define wxTolower towlower + #define wxToupper towupper + + // string.h functions (wchar.h) + #define wxStrcat wcscat + #define wxStrchr wcschr + #define wxStrcmp wcscmp + #define wxStrcoll wcscoll + #define wxStrcpy wcscpy + #define wxStrcspn wcscspn + #define wxStrlen_ wxWcslen // wxStrlen_() is used in wxStrlen() + #define wxStrncat wcsncat + #define wxStrncmp wcsncmp + #define wxStrncpy wcsncpy + #define wxStrpbrk wcspbrk + #define wxStrrchr wcsrchr + #define wxStrspn wcsspn + #define wxStrstr wcsstr + #define wxStrtod wcstod + #define wxStrtol wcstol + #define wxStrtoul wcstoul + #define wxStrxfrm wcsxfrm + + #define wxFgetc fgetwc + #define wxFgetchar fgetwchar + #define wxFgets fgetws + #define wxFputc fputwc + #define wxFputchar fputwchar + #define wxGetc getwc + #define wxGetchar getwchar + #define wxGets getws + #define wxUngetc ungetwc + + #define wxNEED_PRINTF_CONVERSION + + #define wxPutc putwc + #define wxPutchar putwchar + #define wxFputs fputws + + // stdio.h functions + + #define wxNEED_WX_STDIO_H + + // stdlib.h functions + #define wxAtof watof + #define wxAtoi watoi + #define wxAtol watol + #define wxGetenv(a) ((wxChar*)NULL) + #define wxSystem(a) ((int)NULL) + + // time.h functions + #define wxAsctime wasciitime + #define wxCtime wctime + #define wxStrftime wcsftime + + /* + #define wxNEED_FPUTWC + + #include + + int wxFputs(const wxChar *ch, FILE *stream); + int wxPutc(wxChar ch, FILE *stream); + + #define wxPuts(ws) wxFputs(ws, stdout) + #define wxPutchar(wch) wxPutc(wch, stdout) + + // we need %s to %ls conversion for printf and scanf etc + #define wxNEED_PRINTF_CONVERSION + // glibc doesn't have wide char equivalents of the other stuff so + // use our own versions + #define wxNEED_WX_STDIO_H + #define wxNEED_WX_STDLIB_H + #define wxNEED_WX_TIME_H + */ + #else // !metrowerks for apple #error "Please define wide character functions for your environment" #endif #else // ASCII @@ -446,9 +557,7 @@ #define wxStrcoll strcoll #define wxStrcpy strcpy #define wxStrcspn strcspn - #if !defined(__MWERKS__) || !defined(__WXMAC__) - #define wxStrdup strdup - #endif + // wxStricmp and wxStrnicmp are defined below #define wxStrlen_ strlen // used in wxStrlen inline function #define wxStrncat strncat @@ -524,7 +633,7 @@ defined(__EMX__) || defined(__DJGPP__) #define wxStricmp stricmp #define wxStrnicmp strnicmp - #elif defined(__SC__) || defined(__VISUALC__) || \ + #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \ (defined(__MWERKS__) && defined(__INTEL__)) #define wxStricmp _stricmp #define wxStrnicmp _strnicmp @@ -535,14 +644,9 @@ #endif #endif // !defined(wxStricmp) -// checks whether the passed in pointer is NULL and if the string is empty -inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; } - -// safe version of strlen() (returns 0 if passed NULL pointer) -inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; } - // define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as -// it's used in wx/buffer.h) +// it's used in wx/buffer.h -- and also might be used just below by wxStrlen() +// when wxStrlen_() is #define'd as wxWcslen so do it before defining wxStrlen) #if wxUSE_WCHAR_T #ifdef HAVE_WCSLEN #define wxWcslen wcslen @@ -558,12 +662,38 @@ inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; } #endif #endif // wxUSE_WCHAR_T +// checks whether the passed in pointer is NULL and if the string is empty +inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; } + +// safe version of strlen() (returns 0 if passed NULL pointer) +inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; } + +// each of strdup() and wcsdup() may or may not be available but we need both +// of them anyhow for wx/buffer.h so we define the missing one(s) in +// wxchar.cpp and so we should always have both wxStrdupA and wxStrdupW +// defined -- if this is somehow not the case in some situations, please +// correct that and not the lines here +#if wxUSE_UNICODE + #define wxStrdup wxStrdupW +#else + #define wxStrdup wxStrdupA +#endif + WXDLLEXPORT bool wxOKlibc(); // for internal use // ---------------------------------------------------------------------------- // printf() family saga // ---------------------------------------------------------------------------- +/* + For some systems vsnprintf() 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) + extern "C" + int vsnprintf(char *str, size_t size, const char *format, va_list ap); +#endif // !HAVE_VSNPRINTF_DECL + /* 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() @@ -575,7 +705,14 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use */ #ifndef wxVsnprintf_ #if wxUSE_UNICODE - #if defined(HAVE_VSWPRINTF) + #if defined(__MWERKS__) + #define HAVE_WCSRTOMBS 1 + #define HAVE_VSWPRINTF 1 + #endif + #if defined(HAVE__VSNWPRINTF) + #define wxVsnprintf_ _vsnwprintf + /* MinGW?MSVCRT has the wrong vswprintf */ + #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__) #define wxVsnprintf_ vswprintf #endif #else // ASCII @@ -589,10 +726,12 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use #endif #endif // wxVsnprintf_ not defined yet -#ifndef wxVsnprintf_ +#ifndef wxSnprintf_ // no [v]snprintf(), cook our own WXDLLEXPORT int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3; +#endif +#ifndef wxVsnprintf_ WXDLLEXPORT int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr); #endif @@ -631,13 +770,13 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use #include // for FILE - int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; - int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; - int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; + int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1; + int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap ); - int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; - int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; - int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; + int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1; + int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; int wxVfprintf( FILE *stream, const wxChar *format, va_list ap ); int wxVprintf( const wxChar *format, va_list ap ); int wxVsprintf( wxChar *str, const wxChar *format, va_list ap ); @@ -646,7 +785,7 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use // these 2 can be simply mapped to the versions with underscore at the end // if we don't have to do the conversion #ifdef wxNEED_PRINTF_CONVERSION - int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_4; + int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap ); #else #define wxSnprintf wxSnprintf_ @@ -717,8 +856,12 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use WXDLLEXPORT size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n); #endif // wxNEED_WX_STRING_H -#ifndef wxStrdup -WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz); +#ifndef wxStrdupA +WXDLLEXPORT char *wxStrdupA(const char *psz); +#endif + +#ifndef wxStrdupW +WXDLLEXPORT wchar_t *wxStrdupW(const wchar_t *pwz); #endif #ifndef wxStricmp @@ -765,6 +908,9 @@ WXDLLEXPORT int wxSystem(const wxChar *psz); // time.h functions #ifdef wxNEED_WX_TIME_H +#if defined(__MWERKS__) && defined(macintosh) + #include +#endif WXDLLEXPORT size_t wxStrftime(wxChar *s, size_t max, const wxChar *fmt, const struct tm *tm); #endif // wxNEED_WX_TIME_H