]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
Applied patch [ 1381895 ] remove circular include dependendcy in wxchar.h
[wxWidgets.git] / include / wx / wxchar.h
index 604bc2879c86a8df5f3dfe97e97ceae0b4b35e5d..ad650d57e8b68229b145a8fa5a461f50b8fcbb60 100644 (file)
 #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 */
+/* defs.h indirectly includes this file, so don't include it here */
+#include "wx/platform.h"
+#include "wx/dlimpexp.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 **);
@@ -52,7 +50,7 @@
 /*
     Standard headers we need here.
 
-    NB: don't include any wxWidgets headers here because almost of them include
+    NB: don't include any wxWidgets headers here because almost all of them include
         this one!
  */
 
@@ -61,7 +59,9 @@
 
 /* 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__)
+#if defined(__VISUALC__) && __VISUALC__ >= 1400
+    #define wxStrdupA _strdup
+#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
     /* use #define, not inline wrapper, as it is tested with #ifndef below */
     #define wxStrdupA strdup
 #endif
     #define wxHAVE_TCHAR_SUPPORT
 #endif /* compilers with (good) TCHAR support */
 
-#ifdef __MWERKS__
-    #define HAVE_WPRINTF
-#endif
+#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
+    #endif
+#endif /* __MWERKS__ */
 
 #ifdef wxHAVE_TCHAR_SUPPORT
     /* get TCHAR definition if we've got it */
     /*     char wchar_t is always unsigned) and (b) was how the previous */
     /*     definitions worked so keep it like this */
 
+    /* Sun's SunPro compiler supports the wchar_t type and wide character */
+    /* functions, but does not define __WCHAR_TYPE__. Define it here to */
+    /* allow unicode enabled builds. */
+    #if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
+    #define __WCHAR_TYPE__ wxchar_t
+    #endif
+
     /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */
     /* comment below */
     #if !defined(__WCHAR_TYPE__) || \
     #define wxMbstowcs mbstowcs
     #define wxWcstombs wcstombs
 #else /* !TCHAR-aware compilers */
+    /*
+        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
 
-    #if !defined(__MWERKS__) && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 )
+    #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);
         #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 )
-
+    /* 
+       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 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
@@ -781,7 +826,7 @@ 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)
@@ -793,6 +838,25 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
     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()
@@ -804,14 +868,14 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
  */
 #ifndef wxVsnprintf_
     #if wxUSE_UNICODE
-        #if defined(__MWERKS__)
+        #ifdef wxHAVE_MWERKS_UNICODE
             #define HAVE_WCSRTOMBS 1
             #define HAVE_VSWPRINTF 1
-        #endif
+        #endif /* Metrowerks with Unicode support */
         #if defined(__WATCOMC__)
             #define wxVsnprintf_    _vsnwprintf
             #define wxSnprintf_     _snwprintf
-        #endif
+        #endif /* Watcom */
         #if defined(HAVE__VSNWPRINTF)
             #define wxVsnprintf_    _vsnwprintf
         /* MinGW?MSVCRT has the wrong vswprintf */
@@ -820,11 +884,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 */
@@ -1184,13 +1255,13 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
             return szRet;
         }
 
-    #else //!wxUSE_UNICODE
+    #else /* !wxUSE_UNICODE */
     #   define wxTmemchr memchr
     #   define wxTmemcmp memcmp
     #   define wxTmemcpy memcpy
     #   define wxTmemmove memmove
     #   define wxTmemset memset
-    #endif
+    #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */
 
 #endif /*__cplusplus*/