]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
Initial commit of native OS X list ctrl support. Compile tested on Win, Mac, FC4...
[wxWidgets.git] / include / wx / wxchar.h
index 0b3a697e5034f38d43bf11a3e37b24cc6140c094..f0c11fc7b24e73f8bf60472803e88f4b13868756 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 Kåven
+ * Author:      Joel Farley, Ove Ken
  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
  * Created:     1998/06/12
  * RCS-ID:      $Id$
- * Copyright:   (c) 1998-2002 wxWidgets dev team
+ * Copyright:   (c) 1998-2002 Joel Farley, Ove K�en, Robert Roebling, Ron Lee
  * Licence:     wxWindows licence
  */
 
 #ifndef _WX_WXCHAR_H_
 #define _WX_WXCHAR_H_
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma interface "wxchar.h"
-#endif
+/* defs.h indirectly includes this file, so don't include it here */
+#include "wx/platform.h"
+#include "wx/dlimpexp.h"
 
-#include "wx/defs.h"        /* for wxUSE_UNICODE */
+#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
 
 /* check whether we have wchar_t and which size it is if we do */
 #if !defined(wxUSE_WCHAR_T)
@@ -48,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!
  */
 
@@ -57,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
         /* Cygwin versions, wchar.h requires sys/types.h */
         #ifdef __CYGWIN__
             #include <sys/types.h>
-            extern "C" {
+            #ifdef __cplusplus
+                extern "C" {
+            #endif
         #endif /* Cygwin */
-                #include <wchar.h>
-        #ifdef __CYGWIN__
+
+        #include <wchar.h>
+
+        #if defined(__CYGWIN__) && defined(__cplusplus)
             }
-        #endif /* Cygwin */
+        #endif /* Cygwin and C++ */
+
     #elif defined(HAVE_WCSTR_H)
         /* old compilers have relevant declarations here */
         #include <wcstr.h>
     #define wxHAVE_TCHAR_SUPPORT
 #elif defined(__DMC__)
     #define wxHAVE_TCHAR_SUPPORT
+#elif defined(__WXPALMOS__)
+    #include <stddef.h>
 #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
     #define wxHAVE_TCHAR_SUPPORT
     #include <stddef.h>
     #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__) || \
     #if !wxUSE_UNICODE
         #define _T(x) x
     #else /* Unicode */
-        #define _T(x) L ## x
+        /* use wxCONCAT_HELPER so that x could be expanded if it's a macro */
+        #define _T(x) wxCONCAT_HELPER(L, x)
     #endif /* ASCII/Unicode */
 #endif /* !defined(_T) */
 
 /* and _() in wxWidgets sources */
 #define wxT(x)       _T(x)
 
+/* a helper macro allowing to make another macro Unicode-friendly, see below */
+#define wxAPPLY_T(x) _T(x)
+
 /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
 #ifndef __TFILE__
-    #define __XFILE__(x) wxT(x)
-    #define __TFILE__ __XFILE__(__FILE__)
+    #define __TFILE__ wxAPPLY_T(__FILE__)
 #endif
 
 #ifndef __TDATE__
-    #define __XDATE__(x) wxT(x)
-    #define __TDATE__ __XDATE__(__DATE__)
+    #define __TDATE__ wxAPPLY_T(__DATE__)
 #endif
 
 #ifndef __TTIME__
-    #define __XTIME__(x) wxT(x)
-    #define __TTIME__ __XTIME__(__TIME__)
+    #define __TTIME__ wxAPPLY_T(__TIME__)
 #endif
 
 /*
 #ifdef wxHAVE_TCHAR_SUPPORT
     #include <ctype.h>
 
+    #if defined(__WATCOMC__) && defined(UNICODE)
+      #define WXWCHAR_T_CAST(c) (wint_t)(c)
+    #else
+      #define WXWCHAR_T_CAST(c) c
+    #endif
+
     /* ctype.h functions */
-    #define  wxIsalnum   _istalnum
-    #define  wxIsalpha   _istalpha
-    #define  wxIscntrl   _istcntrl
-    #define  wxIsdigit   _istdigit
-    #define  wxIsgraph   _istgraph
-    #define  wxIslower   _istlower
-    #define  wxIsprint   _istprint
-    #define  wxIspunct   _istpunct
-    #define  wxIsspace   _istspace
-    #define  wxIsupper   _istupper
-    #define  wxIsxdigit  _istxdigit
+    #define  wxIsalnum(c)   _istalnum(WXWCHAR_T_CAST(c))
+    #define  wxIsalpha(c)   _istalpha(WXWCHAR_T_CAST(c))
+    #define  wxIscntrl(c)   _istcntrl(WXWCHAR_T_CAST(c))
+    #define  wxIsdigit(c)   _istdigit(WXWCHAR_T_CAST(c))
+    #define  wxIsgraph(c)   _istgraph(WXWCHAR_T_CAST(c))
+    #define  wxIslower(c)   _istlower(WXWCHAR_T_CAST(c))
+    #define  wxIsprint(c)   _istprint(WXWCHAR_T_CAST(c))
+    #define  wxIspunct(c)   _istpunct(WXWCHAR_T_CAST(c))
+    #define  wxIsspace(c)   _istspace(WXWCHAR_T_CAST(c))
+    #define  wxIsupper(c)   _istupper(WXWCHAR_T_CAST(c))
+    #define  wxIsxdigit(c)  _istxdigit(WXWCHAR_T_CAST(c))
 
     /*
        There is a bug in VC6 C RTL: toxxx() functions dosn't do anything with
     #define  wxFgetc     _fgettc
     #define  wxFgetchar  _fgettchar
     #define  wxFgets     _fgetts
-    #define  wxFopen     _tfopen
+    #if wxUSE_UNICODE_MSLU
+        #define  wxFopen    wxMSLU__tfopen
+    #else
+        #define  wxFopen     _tfopen
+    #endif
     #define  wxFputc     _fputtc
     #define  wxFputchar  _fputtchar
     #define  wxFprintf   _ftprintf
     #define  wxGets      _getts
     #define  wxPerror    _tperror
     #define  wxPrintf    _tprintf
-    #define  wxPutc      _puttc
+    #define  wxPutc(c,f) _puttc(WXWCHAR_T_CAST(c),f)
     #define  wxPutchar   _puttchar
     #define  wxPuts      _putts
     #define  wxScanf     _tscanf
     /* special case: not all TCHAR-aware compilers have those */
     #if defined(__VISUALC__) || \
             (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
-        #define wxVsnprintf_    _vsntprintf
-        #define wxSnprintf_     _sntprintf
+        /*
+           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 */
         #define  wxRename    wxMSLU__trename
     #else
         #ifdef __WXWINCE__
-            #define  wxRemove    DeleteFile
+            /* carefully: wxRemove() must return 0 on success while DeleteFile()
+               returns 0 on error, so don't just define one as the other */
+            int wxRemove(const wxChar *path);
         #else
             #define  wxRemove    _tremove
             #define  wxRename    _trename
     #define  wxAtoi      _ttoi
     #define  wxAtol      _ttol
     /* #define  wxAtof   _tttof -- notice that there is no such thing (why?) */
-    #define  wxGetenv    _tgetenv
+    /* there are no env vars at all under CE, so no _tgetenv neither */
+    #ifdef __WXWINCE__
+        /* can't define as inline function as this is a C file... */
+        #define wxGetenv(name)  ((wxChar *)NULL)
+    #else
+        #define  wxGetenv    _tgetenv
+    #endif
     #define  wxSystem    _tsystem
 
     /* time.h functions */
     #define  wxAsctime   _tasctime
     #define  wxCtime     _tctime
+
+    #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
+
+    #ifdef __DARWIN__
+        #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2
+            #define wxNEED_WX_MBSTOWCS
+        #endif
+    #endif
 
-    #if !defined(__MWERKS__) && defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 )
-        /* even though they are defined and "implemented", they are bad and just 
+    #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!! */
-        #define mbstowcs wxInternalMbstowcs
-        #define wcstombs wxInternalWcstombs
-        
-        WXDLLIMPEXP_BASE size_t wxInternalMbstowcs (wchar_t *, const char *, size_t);
-        WXDLLIMPEXP_BASE size_t        wxInternalWcstombs (char *, const wchar_t *, size_t);
+        WXDLLIMPEXP_BASE size_t wxMbstowcs (wchar_t *, const char *, size_t);
+        WXDLLIMPEXP_BASE size_t wxWcstombs (char *, const wchar_t *, size_t);
+    #else
+        #define wxMbstowcs mbstowcs
+        #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
-        
+
         #define  wxFgetchar(c)  wxFgetc(c, stdin)
         #define  wxFputc     wxPutc
         #define  wxFputchar(c)  wxPutc(c, stdout)
         #define wxNEED_UNGETC
 
         #define wxNEED_FPUTS
+        #define wxNEED_PUTS
         #define wxNEED_PUTC
+
         int wxFputs(const wxChar *ch, FILE *stream);
+        int wxPuts(const wxChar *ws);
         int wxPutc(wxChar ch, FILE *stream);
-            
-        WXDLLIMPEXP_BASE size_t   wxStrlen_(const wxChar *s);
+
+        #ifdef __cplusplus
+        extern "C" {
+        #endif
+            WXDLLIMPEXP_BASE size_t   wxStrlen_(const wxChar *s);
+        #ifdef __cplusplus
+        }
+        #endif
 
         #define wxPutchar(wch) wxPutc(wch, stdout)
-        #define wxPuts(ws) wxFputs(ws, stdout)
-            
+
         #define wxNEED_PRINTF_CONVERSION
         #define wxNEED_WX_STDIO_H
         #define wxNEED_WX_STDLIB_H
         #define wxNEED_WX_TIME_H
-                
+
     #elif wxUSE_UNICODE
         #include <wctype.h>
 
             #ifdef HAVE_PUTWS
                 #define wxPuts      putws
             #else
-                #define wxPuts(ws) wxFputs(ws, stdout)
+                #define wxNEED_PUTS
+                int wxPuts(const wxChar *ws);
             #endif
 
             /* we need %s to %ls conversion for printf and scanf etc */
             defined(__EMX__) || defined(__DJGPP__)
         #define wxStricmp stricmp
         #define wxStrnicmp strnicmp
+    #elif defined(__WXPALMOS__)
+        /* FIXME: There is no equivalent to strnicmp in the Palm OS API.  This
+         * quick hack should do until one can be written.
+         */
+        #define wxStricmp StrCaselessCompare
+        #define wxStrnicmp strnicmp
     #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
             (defined(__MWERKS__) && defined(__INTEL__))
         #define wxStricmp _stricmp
     #ifdef HAVE_WCSLEN
         #define wxWcslen wcslen
     #else
-    #if defined( __WXMAC_XCODE__ ) && !defined( __cplusplus )
-    /* xcode native targets are giving multiply defined symbols on regex */
-        static
-    #endif
-        inline size_t wxWcslen(const wchar_t *s)
-        {
-            size_t n = 0;
-            while ( *s++ )
-                n++;
-
-            return n;
-        }
+        WXDLLIMPEXP_BASE size_t wxWcslen(const wchar_t *s);
     #endif
 #endif /* wxUSE_WCHAR_T */
 
@@ -746,14 +833,37 @@ 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)
+#ifdef __cplusplus
     extern "C"
+#else
+    extern
+#endif
     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()
@@ -763,32 +873,74 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
    We define function with a trailing underscore here because the real one is a
    wrapper around it as explained below
  */
-#ifndef wxVsnprintf_
+#if !defined( wxVsnprintf_ ) && !wxUSE_PRINTF_POS_PARAMS
     #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 */
-        #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__)
+        /* 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 */
-        /* vsnprintf() */
-        #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__)
-            /* assume we have snprintf() too if we have vsnprintf() */
-            #define wxVsnprintf_    vsnprintf
-            #define wxSnprintf_     snprintf
+        /* 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 */
+#endif /* wxVsnprintf_ not defined yet && !wxUSE_PRINTF_POS_PARAMS */
+
+#if !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
+    /*
+        The systems where vsnprintf() supports positionals 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
+        #else /* ASCII */
+            #if defined __cplusplus && defined 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
+            #if wxUSE_UNICODE
+                #define wxVsnprintf_    _vswprintf_p
+            #else
+                #define wxVsnprintf_    _vsprintf_p
+            #endif
+        #endif
+    #endif
+#endif  // !defined( wxVsnprintf_ ) && wxUSE_PRINTF_POS_PARAMS
 
 #ifndef wxSnprintf_
     /* no [v]snprintf(), cook our own */
@@ -935,33 +1087,49 @@ WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
     WXDLLIMPEXP_BASE char *strdup(const char* s);
 #endif
 
-/* RN: Used only under OSX <= 10.2 currently */
+/* RN: Used only under OSX <= 10.2 currently
+   The __cplusplus ifdefs are messy, but they are required to build
+   the regex library, since c does not support function overloading
+*/
 #ifdef wxNEED_WX_STRING_H
-    WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src);
-    WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c);
-    inline wxChar * wxStrchr(wxChar *s, wxChar c)
-        { return (wxChar *)wxStrchr((const wxChar *)s, c); }
-    WXDLLIMPEXP_BASE int      wxStrcmp(const wxChar *s1, const wxChar *s2);
-    WXDLLIMPEXP_BASE int      wxStrcoll(const wxChar *s1, const wxChar *s2);
-    WXDLLIMPEXP_BASE wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
-    WXDLLIMPEXP_BASE size_t   wxStrcspn(const wxChar *s, const wxChar *reject);
-    WXDLLIMPEXP_BASE wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
-    WXDLLIMPEXP_BASE int      wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
-    WXDLLIMPEXP_BASE wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
-    WXDLLIMPEXP_BASE const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
-    inline wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
-        { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); }
-    WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c);
-    inline wxChar * wxStrrchr(wxChar *s, wxChar c)
-        { return (wxChar *)wxStrrchr((const wxChar *)s, c); }
-    WXDLLIMPEXP_BASE size_t   wxStrspn(const wxChar *s, const wxChar *accept);
-    WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
-    inline wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
-        { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); }
+# ifdef __cplusplus
+    extern "C" {
+# endif
+        WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src);
+        WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c);
+        WXDLLIMPEXP_BASE int      wxStrcmp(const wxChar *s1, const wxChar *s2);
+        WXDLLIMPEXP_BASE int      wxStrcoll(const wxChar *s1, const wxChar *s2);
+        WXDLLIMPEXP_BASE wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
+        WXDLLIMPEXP_BASE size_t   wxStrcspn(const wxChar *s, const wxChar *reject);
+        WXDLLIMPEXP_BASE wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
+        WXDLLIMPEXP_BASE int      wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
+        WXDLLIMPEXP_BASE wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
+        WXDLLIMPEXP_BASE const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
+        WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c);
+        WXDLLIMPEXP_BASE size_t   wxStrspn(const wxChar *s, const wxChar *accept);
+        WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
+# ifdef __cplusplus
+    }
+# endif
+
+    /* These functions use C++, so we can't c extern them */
     WXDLLIMPEXP_BASE double   wxStrtod(const wxChar *nptr, wxChar **endptr);
     WXDLLIMPEXP_BASE long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base);
     WXDLLIMPEXP_BASE unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base);
     WXDLLIMPEXP_BASE size_t   wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
+
+    /* inlined versions */
+    #ifdef __cplusplus
+        inline wxChar * wxStrchr(wxChar *s, wxChar c)
+            { return (wxChar *)wxStrchr((const wxChar *)s, c); }
+        inline wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
+            { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); }
+        inline wxChar * wxStrrchr(wxChar *s, wxChar c)
+            { return (wxChar *)wxStrrchr((const wxChar *)s, c); }
+        inline wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
+            { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); }
+    #endif
+
 #endif /* wxNEED_WX_STRING_H */
 
 #ifndef wxStrdupA
@@ -1021,6 +1189,8 @@ WXDLLIMPEXP_BASE int      wxSystem(const wxChar *psz);
 #if defined(__MWERKS__) && defined(macintosh)
     #include <time.h>
 #endif
+    /*silent gabby compilers*/
+    struct tm;
     WXDLLIMPEXP_BASE size_t wxStrftime(wxChar *s, size_t max,
                                   const wxChar *fmt, const struct tm *tm);
 #endif /* wxNEED_WX_TIME_H */
@@ -1057,7 +1227,8 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
         #define wxWX2WC wxMB2WC
     #endif
 #else /* !wxUSE_UNICODE */
-#error ha
+/* Why is this here?
+#error ha */
     /* No wxUSE_WCHAR_T: we have to do something (JACS) */
     #define wxMB2WC wxStrncpy
     #define wxWC2MB wxStrncpy
@@ -1067,27 +1238,27 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
     #define wxWX2WC wxMB2WC
 #endif
 
-//
-// RN:  The following are not normal versions of memcpy et al., rather
-// these are either char or widechar versions depending on 
-// if unicode is used or not.
-//
+/*
+    RN:  The following are not normal versions of memcpy et al., rather
+    these are either char or widechar versions depending on
+    if unicode is used or not.
+*/
 
 #ifdef __cplusplus
 
     //
-    // RN: We could do the usual tricky compiler detection here,
+    //  RN: We could do the usual tricky compiler detection here,
     //  and use their variant (such as wmemchr, etc.).  The problem
-    //  is that these functions are quite rare, even though they are 
+    //  is that these functions are quite rare, even though they are
     //  part of the current POSIX standard.  In addition, most compilers
     //  (including even MSC) inline them just like we do right in their
     //  headers.
     //
     #if wxUSE_UNICODE
         #include <string.h> //for mem funcs
-        
+
         //implement our own wmem variants
-        inline wxChar* wxMemchr(const wxChar* s, wxChar c, size_t l)
+        inline wxChar* wxTmemchr(const wxChar* s, wxChar c, size_t l)
         {
             for(;l && *s != c;--l, ++s) {}
 
@@ -1096,7 +1267,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
             return NULL;
         }
 
-        inline int wxMemcmp(const wxChar* sz1, const wxChar* sz2, size_t len)
+        inline int wxTmemcmp(const wxChar* sz1, const wxChar* sz2, size_t len)
         {
             for(; *sz1 == *sz2 && len; --len, ++sz1, ++sz2) {}
 
@@ -1106,17 +1277,17 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
                 return 0;
         }
 
-        inline wxChar* wxMemcpy(wxChar* szOut, const wxChar* szIn, size_t len)
+        inline wxChar* wxTmemcpy(wxChar* szOut, const wxChar* szIn, size_t len)
         {
             return (wxChar*) memcpy(szOut, szIn, len * sizeof(wxChar));
         }
 
-        inline wxChar* wxMemmove(wxChar* szOut, const wxChar* szIn, size_t len)
+        inline wxChar* wxTmemmove(wxChar* szOut, const wxChar* szIn, size_t len)
         {
             return (wxChar*) memmove(szOut, szIn, len * sizeof(wxChar));
         }
 
-        inline wxChar* wxMemset(wxChar* szOut, const wxChar cIn, size_t len)
+        inline wxChar* wxTmemset(wxChar* szOut, const wxChar cIn, size_t len)
         {
             wxChar* szRet = szOut;
 
@@ -1126,13 +1297,13 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
             return szRet;
         }
 
-    #else //!wxUSE_UNICODE
-    #   define wxMemchr memchr
-    #   define wxMemcmp memcmp
-    #   define wxMemcpy memcpy
-    #   define wxMemmove memmove
-    #   define wxMemset memset
-    #endif
+    #else /* !wxUSE_UNICODE */
+    #   define wxTmemchr memchr
+    #   define wxTmemcmp memcmp
+    #   define wxTmemcpy memcpy
+    #   define wxTmemmove memmove
+    #   define wxTmemset memset
+    #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */
 
 #endif /*__cplusplus*/