]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
experimental --inplace flag implementation
[wxWidgets.git] / include / wx / wxchar.h
index 6aea1283b1a08b2865819e00d6f707bc33d3f8d8..88ea3006468a75a66ee28db28d8e830575d99e24 100644 (file)
@@ -53,7 +53,7 @@
         #else
             #define wxUSE_WCHAR_T 0
         #endif
-    #elif defined(__GNUWIN32__) && !defined(__MINGW32__) // Cygwin (not Mingw32) doesn't have wcslen.h, needed in buffer.h
+    #elif defined(__GNUWIN32__) && !defined(__MINGW32__)
         #define wxUSE_WCHAR_T 0
     #elif defined(__WATCOMC__)
         #define wxUSE_WCHAR_T 0
 // Required for wxPrintf() etc
 #include <stdarg.h>
 
-#if defined(__CYGWIN__)
-    #ifndef HAVE_WCSLEN
-        #define HAVE_WCSLEN
-    #endif // !HAVE_WCSLEN
-    #include <stddef.h>
+// 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
 
 #if wxUSE_WCHAR_T
     #ifdef HAVE_WCHAR_H
-        // include wchar.h to get wcslen() declaration used by wx/buffer.h
-        #include <wchar.h>
+        // 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 <sys/types.h>
+            extern "C" {
+        #endif // Cygwin
+                #include <wchar.h>
+        #ifdef __CYGWIN__
+            }
+        #endif // Cygwin
     #elif defined(HAVE_WCSTR_H)
-        // old compilers have wcslen() here
+        // old compilers have relevant declarations here
         #include <wcstr.h>
     #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
-        // include stdlib.h for wchar_t, wcslen is provided in wxchar.cpp
+        // include stdlib.h for wchar_t
         #include <stdlib.h>
-        size_t WXDLLEXPORT wcslen(const wchar_t *s);
     #endif // HAVE_WCHAR_H
 #endif // wxUSE_WCHAR_T
 
     #define  wxStrcoll   _tcscoll
     #define  wxStrcpy    _tcscpy
     #define  wxStrcspn   _tcscspn
+    #define  wxStrdupW   _wcsdup        // notice the 'W'!
     #define  wxStrftime  _tcsftime
     #define  wxStricmp   _tcsicmp
     #define  wxStrnicmp  _tcsnicmp
             #define  wxStrcoll   wcscoll
             #define  wxStrcpy    wcscpy
             #define  wxStrcspn   wcscspn
-            #define  wxStrlen_   wcslen // used in wxStrlen inline function
+            #define  wxStrlen_   wxWcslen // wxStrlen_() is used in wxStrlen()
             #define  wxStrncat   wcsncat
             #define  wxStrncmp   wcsncmp
             #define  wxStrncpy   wcsncpy
         #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
     #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
@@ -567,12 +571,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.
+ */
+#ifndef 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()
@@ -584,7 +614,10 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use
  */
 #ifndef wxVsnprintf_
     #if wxUSE_UNICODE
-        #if defined(HAVE_VSWPRINTF)
+        #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
@@ -598,10 +631,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
@@ -640,13 +675,13 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use
 
     #include <stdio.h>  // 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 );
@@ -655,7 +690,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_
@@ -726,8 +761,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