]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
Compilation fix for old GCC versions.
[wxWidgets.git] / include / wx / wxchar.h
index f0c11fc7b24e73f8bf60472803e88f4b13868756..4f4dc9b485ed8ba68a7d96b625df13bba08847b8 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Name:        wx/wxchar.h
  * Purpose:     Declarations common to wx char/wchar_t usage (wide chars)
 /*
  * Name:        wx/wxchar.h
  * Purpose:     Declarations common to wx char/wchar_t usage (wide chars)
- * Author:      Joel Farley, Ove Ken
+ * Author:      Joel Farley, Ove Kåven
  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
  * Created:     1998/06/12
  * RCS-ID:      $Id$
  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
  * Created:     1998/06/12
  * RCS-ID:      $Id$
- * Copyright:   (c) 1998-2002 Joel Farley, Ove K�en, Robert Roebling, Ron Lee
+ * Copyright:   (c) 1998-2006 wxWidgets dev team
  * Licence:     wxWindows licence
  */
 
  * Licence:     wxWindows licence
  */
 
     #endif
 
     #ifdef wxHAVE_MWERKS_UNICODE
     #endif
 
     #ifdef wxHAVE_MWERKS_UNICODE
-        #define HAVE_WPRINTF
+        #define HAVE_WPRINTF   1
+        #define HAVE_WCSRTOMBS 1
+        #define HAVE_VSWPRINTF 1
     #endif
 #endif /* __MWERKS__ */
 
     #endif
 #endif /* __MWERKS__ */
 
     #define  wxStrtod    _tcstod
     #define  wxStrtol    _tcstol
     #define  wxStrtoul   _tcstoul
     #define  wxStrtod    _tcstod
     #define  wxStrtol    _tcstol
     #define  wxStrtoul   _tcstoul
+    #ifdef __VISUALC__
+        #if __VISUALC__ >= 1300
+            #define wxStrtoll  _tcstoi64
+            #define wxStrtoull _tcstoui64
+        #endif /* VC++ 7+ */
+    #endif
     #define  wxStrxfrm   _tcsxfrm
 
     /* stdio.h functions */
     #define  wxStrxfrm   _tcsxfrm
 
     /* stdio.h functions */
     #define  wxFgetchar  _fgettchar
     #define  wxFgets     _fgetts
     #if wxUSE_UNICODE_MSLU
     #define  wxFgetchar  _fgettchar
     #define  wxFgets     _fgetts
     #if wxUSE_UNICODE_MSLU
+        WXDLLIMPEXP_BASE FILE * wxMSLU__tfopen(const wxChar *name, const wxChar *mode);
+
         #define  wxFopen    wxMSLU__tfopen
     #else
         #define  wxFopen     _tfopen
         #define  wxFopen    wxMSLU__tfopen
     #else
         #define  wxFopen     _tfopen
     #define  wxVsscanf   _vstscanf
     #define  wxVsprintf  _vstprintf
 
     #define  wxVsscanf   _vstscanf
     #define  wxVsprintf  _vstprintf
 
-    /* special case: not all TCHAR-aware compilers have those */
-    #if defined(__VISUALC__) || \
-            (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
-        /*
-           we can only use the system _vsntprintf() if we don't require the
-           Unix98 positional parameters support as it doesn't have it
-         */
-        #if !wxUSE_PRINTF_POS_PARAMS
-            #define wxVsnprintf_    _vsntprintf
-            #define wxSnprintf_     _sntprintf
-        #endif
-    #endif
-
     /* special case: these functions are missing under Win9x with Unicows so we */
     /* have to implement them ourselves */
     #if wxUSE_UNICODE_MSLU
     /* special case: these functions are missing under Win9x with Unicows so we */
     /* have to implement them ourselves */
     #if wxUSE_UNICODE_MSLU
+        WXDLLIMPEXP_BASE int wxMSLU__trename(const wxChar *oldname, const wxChar *newname);
+        WXDLLIMPEXP_BASE int wxMSLU__tremove(const wxChar *name);
+
         #define  wxRemove    wxMSLU__tremove
         #define  wxRename    wxMSLU__trename
     #else
         #define  wxRemove    wxMSLU__tremove
         #define  wxRename    wxMSLU__trename
     #else
         #define wxWcstombs wcstombs
     #endif
 
         #define wxWcstombs wcstombs
     #endif
 
-    /* 
+    /*
        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.
        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.
        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.
             #define  wxStrtod    wcstod
             #define  wxStrtol    wcstol
             #define  wxStrtoul   wcstoul
             #define  wxStrtod    wcstod
             #define  wxStrtol    wcstol
             #define  wxStrtoul   wcstoul
+            #ifdef HAVE_WCSTOULL
+                /* assume that we have wcstoull(), which is also C99, too */
+                #define  wxStrtoll   wcstoll
+                #define  wxStrtoull  wcstoull
+            #endif /* HAVE_WCSTOULL */
             #define  wxStrxfrm   wcsxfrm
 
             #define  wxFgetc     fgetwc
             #define  wxStrxfrm   wcsxfrm
 
             #define  wxFgetc     fgetwc
         #endif
         #define  wxStrtol    strtol
         #define  wxStrtoul   strtoul
         #endif
         #define  wxStrtol    strtol
         #define  wxStrtoul   strtoul
+        #ifdef HAVE_STRTOULL
+            /* assume that we have wcstoull(), which is also C99, too */
+            #define  wxStrtoll   strtoll
+            #define  wxStrtoull  strtoull
+        #endif /* HAVE_WCSTOULL */
         #define  wxStrxfrm   strxfrm
 
         /* stdio.h functions */
         #define  wxStrxfrm   strxfrm
 
         /* stdio.h functions */
     #endif /* Unicode/ASCII */
 #endif /* TCHAR-aware compilers/the others */
 
     #endif /* Unicode/ASCII */
 #endif /* TCHAR-aware compilers/the others */
 
+#ifdef wxStrtoll
+    #define wxHAS_STRTOLL
+#endif
+
 /*
     various special cases
  */
 /*
     various special cases
  */
@@ -865,73 +879,40 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
 #endif
 
 /*
 #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()
-   which we really need...), otherwise we implement it using our own printf()
-   code.
+   MinGW MSVCRT has non-standard vswprintf() (for MSVC compatibility
+   presumably) and normally _vsnwprintf() is used instead
 
 
-   We define function with a trailing underscore here because the real one is a
-   wrapper around it as explained below
+   vswprintf() under (early versions of) OS X is buggy
  */
  */
-#if !defined( wxVsnprintf_ ) && !wxUSE_PRINTF_POS_PARAMS
-    #if wxUSE_UNICODE
-        #ifdef wxHAVE_MWERKS_UNICODE
-            #define HAVE_WCSRTOMBS 1
-            #define HAVE_VSWPRINTF 1
-        #endif /* Metrowerks with Unicode support */
-        #if defined(__WATCOMC__)
-            #define wxVsnprintf_    _vsnwprintf
-            #define wxSnprintf_     _snwprintf
-        #endif /* Watcom */
-        #if defined(HAVE__VSNWPRINTF)
-            #define wxVsnprintf_    _vsnwprintf
-        /* MinGW?MSVCRT has the wrong vswprintf */
-        /* Mac OS X has a somehow buggy vswprintf */
-        #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__) && !defined(__DARWIN__)
-            #define wxVsnprintf_    vswprintf
-        #endif
-    #else /* ASCII */
-        /* all versions of CodeWarrior supported by wxWidgets apparently have */
-        /* 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__)
-            #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 && !wxUSE_PRINTF_POS_PARAMS */
+#if defined(HAVE_VSWPRINTF) && (defined(__MINGW32__) || defined(__DARWIN__))
+    #undef HAVE_VSWPRINTF
+#endif
 
 
-#if !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
+#if wxUSE_PRINTF_POS_PARAMS
     /*
     /*
-        The systems where vsnprintf() supports positionals should define
-        the HAVE_UNIX98_PRINTF symbol.
+        The systems where vsnprintf() supports positional parameters should
+        define the HAVE_UNIX98_PRINTF symbol.
 
         On systems which don't (e.g. Windows) we are forced to use
         our wxVsnprintf() implementation.
     */
     #if defined(HAVE_UNIX98_PRINTF)
         #if wxUSE_UNICODE
 
         On systems which don't (e.g. Windows) we are forced to use
         our wxVsnprintf() implementation.
     */
     #if defined(HAVE_UNIX98_PRINTF)
         #if wxUSE_UNICODE
-            #define wxVsnprintf_        vswprintf
+            #ifdef HAVE_VSWPRINTF
+                #define wxVsnprintf_        vswprintf
+            #endif
         #else /* ASCII */
         #else /* ASCII */
-            #if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL
+            #ifdef HAVE_BROKEN_VSNPRINTF_DECL
                 #define wxVsnprintf_    wx_fixed_vsnprintf
             #else
                 #define wxVsnprintf_    vsnprintf
             #endif
         #endif
                 #define wxVsnprintf_    wx_fixed_vsnprintf
             #else
                 #define wxVsnprintf_    vsnprintf
             #endif
         #endif
-    #else
-        // the only exception on Windows is VC++ 8.0; it provides a new family
-        // of printf() functions with positional parameter support which should
-        // behave mostly identic to our wxVsnprintf() implementation
+    #else /* !HAVE_UNIX98_PRINTF */
+        /*
+            The only compiler with positional parameters support under Windows
+            is VC++ 8.0 which provides a new xxprintf_p() functions family
+         */
         #if defined(__VISUALC__) && __VISUALC__ >= 1400
             #if wxUSE_UNICODE
                 #define wxVsnprintf_    _vswprintf_p
         #if defined(__VISUALC__) && __VISUALC__ >= 1400
             #if wxUSE_UNICODE
                 #define wxVsnprintf_    _vswprintf_p
@@ -939,17 +920,69 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
                 #define wxVsnprintf_    _vsprintf_p
             #endif
         #endif
                 #define wxVsnprintf_    _vsprintf_p
             #endif
         #endif
+    #endif /* HAVE_UNIX98_PRINTF/!HAVE_UNIX98_PRINTF */
+#else /* !wxUSE_PRINTF_POS_PARAMS */
+    /*
+       We always want to define safe snprintf() function to be used instead of
+       sprintf(). Some compilers already have it (or rather vsnprintf() which
+       we really need...), otherwise we implement it using our own printf()
+       code.
+
+       We define function with a trailing underscore here because the real one
+       is a wrapper around it as explained below
+     */
+
+    /* first deal with TCHAR-aware compilers which have _vsntprintf */
+    #ifndef wxVsnprintf_
+        #if defined(__VISUALC__) || \
+                (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
+            #define wxVsnprintf_    _vsntprintf
+            #define wxSnprintf_     _sntprintf
+        #endif
     #endif
     #endif
-#endif  // !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
+
+    /* if this didn't work, define it separately for Unicode and ANSI builds */
+    #ifndef wxVsnprintf_
+        #if wxUSE_UNICODE
+            #if defined(HAVE__VSNWPRINTF)
+                #define wxVsnprintf_    _vsnwprintf
+            #elif defined(HAVE_VSWPRINTF)
+                #define wxVsnprintf_     vswprintf
+            #elif defined(__WATCOMC__)
+                #define wxVsnprintf_    _vsnwprintf
+                #define wxSnprintf_     _snwprintf
+            #endif
+        #else /* ASCII */
+            /*
+               All versions of CodeWarrior supported by wxWidgets apparently
+               have 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__)
+                #ifdef HAVE_BROKEN_VSNPRINTF_DECL
+                    #define wxVsnprintf_    wx_fixed_vsnprintf
+                #else
+                    #define wxVsnprintf_    vsnprintf
+                #endif
+            #endif
+        #endif /* Unicode/ASCII */
+    #endif /* wxVsnprintf_ */
+#endif /* wxUSE_PRINTF_POS_PARAMS/!wxUSE_PRINTF_POS_PARAMS */
 
 #ifndef wxSnprintf_
     /* no [v]snprintf(), cook our own */
 
 #ifndef wxSnprintf_
     /* no [v]snprintf(), cook our own */
-    WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
-                                ...) ATTRIBUTE_PRINTF_3;
+    WXDLLIMPEXP_BASE int
+    wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3;
 #endif
 #ifndef wxVsnprintf_
 #endif
 #ifndef wxVsnprintf_
-    WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
-                                 va_list argptr);
+    WXDLLIMPEXP_BASE int
+    wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr);
 #endif
 
 /*
 #endif
 
 /*