]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
source id type is unsigned; minor cleanup
[wxWidgets.git] / include / wx / wxchar.h
index f0c11fc7b24e73f8bf60472803e88f4b13868756..84e8ee28f2bbc76c14bcc94958441757cb35f876 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * 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$
- * Copyright:   (c) 1998-2002 Joel Farley, Ove K�en, Robert Roebling, Ron Lee
+ * Copyright:   (c) 1998-2006 wxWidgets dev team
  * Licence:     wxWindows licence
  */
 
@@ -18,6 +18,8 @@
 #include "wx/platform.h"
 #include "wx/dlimpexp.h"
 
+#include <stdio.h>  /* we use FILE below */
+
 #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
         /* include stdlib.h for wchar_t */
         #include <stdlib.h>
     #endif /* HAVE_WCHAR_H */
+
+    #ifdef HAVE_WIDEC_H
+        #include <widec.h>
+    #endif
 #endif /* wxUSE_WCHAR_T */
 
 /* ---------------------------------------------------------------------------- */
     #endif
 
     #ifdef wxHAVE_MWERKS_UNICODE
-        #define HAVE_WPRINTF
+        #define HAVE_WPRINTF   1
+        #define HAVE_WCSRTOMBS 1
+        #define HAVE_VSWPRINTF 1
     #endif
 #endif /* __MWERKS__ */
 
     #define  wxStrtod    _tcstod
     #define  wxStrtol    _tcstol
     #define  wxStrtoul   _tcstoul
+    #ifdef __VISUALC__
+        #if __VISUALC__ >= 1300 && !defined(__WXWINCE__)
+            #define wxStrtoll  _tcstoi64
+            #define wxStrtoull _tcstoui64
+        #endif /* VC++ 7+ */
+    #endif
     #define  wxStrxfrm   _tcsxfrm
 
     /* stdio.h functions */
     #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  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
+        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 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.
-       
+
        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
+            #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
         #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 */
     #endif /* Unicode/ASCII */
 #endif /* TCHAR-aware compilers/the others */
 
+#ifdef wxStrtoll
+    #define wxHAS_STRTOLL
+#endif
+
 /*
     various special cases
  */
@@ -851,7 +871,7 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
 #else
     extern
 #endif
-    int snprintf(char *str, size_t size, const char *format, ...);
+    WXDLLIMPEXP_BASE 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
@@ -865,91 +885,115 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
 #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.
-
-   We define function with a trailing underscore here because the real one is a
-   wrapper around it as explained below
+   MinGW MSVCRT has non-standard vswprintf() (for MSVC compatibility
+   presumably) and normally _vsnwprintf() is used instead
  */
-#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__)
+    #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
-            #define wxVsnprintf_        vswprintf
+            #ifdef HAVE_VSWPRINTF
+                #define wxVsnprintf_        vswprintf
+            #endif
         #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
-    #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
-        #if defined(__VISUALC__) && __VISUALC__ >= 1400
+    #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.
+            The 2003 PSDK includes a slightly earlier version of VC8 than the
+            main release and does not have the printf_p functions.
+         */
+        #if defined _MSC_FULL_VER && _MSC_FULL_VER >= 140050727 && !defined __WXWINCE__
             #if wxUSE_UNICODE
                 #define wxVsnprintf_    _vswprintf_p
             #else
                 #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  // !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 */
-    WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
-                                ...) ATTRIBUTE_PRINTF_3;
+    /* no snprintf(), cook our own */
+    WXDLLIMPEXP_BASE int
+    wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3;
 #endif
 #ifndef wxVsnprintf_
-    WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
-                                 va_list argptr);
+    /* no (suitable) vsnprintf(), cook our own */
+    WXDLLIMPEXP_BASE int
+    wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr);
+
+    #define wxUSE_WXVSNPRINTF 1
+#else
+    #define wxUSE_WXVSNPRINTF 0
 #endif
 
 /*
@@ -980,9 +1024,6 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
         either because we don't have them at all or because they don't have the
         semantics we need
      */
-
-    #include <stdio.h>  /* for FILE */
-
     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;