X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f4a0c5be34be837210768501c13dbcff81e533c..69157f8b8b6ce7543279d1a026492d35a3906b59:/include/wx/wxchar.h diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index b2e27e2796..fda15454f2 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -21,13 +21,19 @@ #error "MBCS is not supported by wxChar" #endif -// only do Unicode for Windows (VC++), for now +// Windows (VC++) has broad TCHAR support #if defined(__VISUALC__) && defined(__WIN32__) #include +#if wxUSE_UNICODE // temporary - preserve binary compatibility typedef _TCHAR wxChar; typedef _TSCHAR wxSChar; typedef _TUCHAR wxUChar; +#else +#define wxChar char +#define wxSChar signed char +#define wxUChar unsigned char +#endif // ctype.h functions #define wxIsalnum _istalnum @@ -113,16 +119,75 @@ typedef _TUCHAR wxUChar; // translate wxZZZ names -#else//!Unicode +#else//!Windows (VC++) + +// check whether we are doing Unicode +#if wxUSE_UNICODE + +#include +#include + +// this is probably glibc-specific +#if defined(__WCHAR_TYPE__) -// make sure we aren't doing Unicode -#if defined ( __WXUNICODE__ ) || defined ( _UNICODE ) +typedef __WCHAR_TYPE__ wxChar; +typedef signed __WCHAR_TYPE__ wxSChar; +typedef unsigned __WCHAR_TYPE__ wxUChar; + +#define _T(x) L##x + + // 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 wxStrncat wcsncat +#define wxStrncmp wcsncmp +#define wxStrncpy wcsncpy +#define wxStrpbrk wcspbrk +#define wxStrrchr wcsrchr +#define wxStrspn wcsspn +#define wxStrstr wcsstr +#define wxStrtod wcstod +#define wxStrtok wcstok +#define wxStrtol wcstol +#define wxStrtoul wcstoul +#define wxStrxfrm wcsxfrm + +// glibc doesn't have wc equivalents of the other stuff +// do we need to write wrappers for them? + +#else #error "Please define your compiler's Unicode conventions in wxChar.h" #endif +#else//!Unicode +#if 0 // temporary - preserve binary compatibilty typedef char wxChar; typedef signed char wxSChar; typedef unsigned char wxUChar; +#else +#define wxChar char +#define wxSChar signed char +#define wxUChar unsigned char +#endif #define _T(x) x @@ -151,7 +216,6 @@ typedef unsigned char wxUChar; #define wxStrcoll strcoll #define wxStrcpy strcpy #define wxStrcspn strcspn -#define wxStrftime strftime #define wxStrncat strncat #define wxStrncmp strncmp #define wxStrncpy strncpy @@ -203,38 +267,54 @@ typedef unsigned char wxUChar; // time.h functions #define wxAsctime asctime #define wxCtime ctime +#define wxStrftime strftime #endif//Unicode +#endif /// checks whether the passed in pointer is NULL and if the string is empty inline bool WXDLLEXPORT wxIsEmpty(const wxChar *p) { return !p || !*p; } /// safe version of strlen() (returns 0 if passed NULL pointer) -inline size_t WXDLLEXPORT wxStrlen(const wxChar *psz) +inline size_t WXDLLEXPORT wxStrlen(const wxChar *psz) #if defined(__VISUALC__) { return psz ? _tcslen(psz) : 0; } +#elif wxUSE_UNICODE + { return psz ? wcslen(psz) : 0; } #else { return psz ? strlen(psz) : 0; } #endif /// portable strcasecmp/_stricmp -inline int WXDLLEXPORT wxStricmp(const wxChar *, const wxChar *) +inline int WXDLLEXPORT wxStricmp(const wxChar *psz1, const wxChar *psz2) #if defined(__VISUALC__) { return _tcsicmp(psz1, psz2); } -#elif defined(__BORLANDC__) +#elif defined(__BORLANDC__) && !wxUSE_UNICODE { return stricmp(psz1, psz2); } -#elif defined(__UNIX__) || defined(__GNUWIN32__) +#elif defined(__UNIX__) || defined(__GNUWIN32__) +#if !wxUSE_UNICODE { return strcasecmp(psz1, psz2); } +#else // glibc doesn't seem to have wide char equivalent + { + register wxChar c1, c2; + do { + c1 = wxTolower(*psz1++); + c2 = wxTolower(*psz2++); + } while ( c1 && (c1 == c2) ); + + return c1 - c2; + } +#endif #else // almost all compilers/libraries provide this function (unfortunately under // different names), that's why we don't implement our own which will surely // be more efficient than this code (uncomment to use): /* - register char c1, c2; + register wxChar c1, c2; do { - c1 = tolower(*psz1++); - c2 = tolower(*psz2++); + c1 = wxTolower(*psz1++); + c2 = wxTolower(*psz2++); } while ( c1 && (c1 == c2) ); return c1 - c2; @@ -243,5 +323,18 @@ inline int WXDLLEXPORT wxStricmp(const wxChar *, const wxChar *) #error "Please define string case-insensitive compare for your OS/compiler" #endif // OS/compiler +/// portable strdup +inline wxChar * WXDLLEXPORT wxStrdup(const wxChar *psz) +#if !wxUSE_UNICODE + { return strdup(psz); } +#else + { + size_t size = (wxStrlen(psz) + 1) * sizeof(wxChar); + wxChar *ret = (wxChar *) malloc(size); + memcpy(ret, psz, size); + return ret; + } +#endif + #endif //_WX_WXCHAR_H_