]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxchar.h
avoid a bug in Carbon headers
[wxWidgets.git] / include / wx / wxchar.h
index 6b82bc62f406e7755e8c5f88b18cb117799e02e2..c7e516acf3905a7a3fc34251658eefc11fe4fe46 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef _WX_WXCHAR_H_
 #define _WX_WXCHAR_H_
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma interface "wxchar.h"
 #endif
 
@@ -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 wxHAVE_TCHAR_SUPPORT
 #endif // compilers with (good) TCHAR support
 
+#ifdef __MWERKS__
+    #define HAVE_WPRINTF
+#endif
+
 #ifdef wxHAVE_TCHAR_SUPPORT
     // get TCHAR definition if we've got it
     #include <tchar.h>
 // ----------------------------------------------------------------------------
 
 #ifdef wxHAVE_TCHAR_SUPPORT
+    #include <ctype.h>
+
     // ctype.h functions
     #define  wxIsalnum   _istalnum
     #define  wxIsalpha   _istalpha
     #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  wxVsscanf   _vstscanf
     #define  wxVsprintf  _vstprintf
 
+    // special case: not all TCHAR-aware compilers have those
+    #if defined(__VISUALC__) || \
+            (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
+        #define wxVsnprintf_    _vsntprintf
+        #define wxSnprintf_     _sntprintf
+    #endif
+
     // special case: these functions are missing under Win9x with Unicows so we
     // have to implement them ourselves
     #if wxUSE_UNICODE_MSLU
         #define  wxRemove    wxMSLU__tremove
         #define  wxRename    wxMSLU__trename
     #else
-        #define  wxRemove    _tremove
-        #define  wxRename    _trename
+        #ifdef __WXWINCE__
+            #define  wxRemove    DeleteFile
+        #else
+            #define  wxRemove    _tremove
+            #define  wxRename    _trename
+        #endif
     #endif
 
     // stdlib.h functions
             #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  wxStrspn    wcsspn
             #define  wxStrstr    wcsstr
             #define  wxStrtod    wcstod
-            #define  wxStrtok    wcstok
             #define  wxStrtol    wcstol
             #define  wxStrtoul   wcstoul
             #define  wxStrxfrm   wcsxfrm
                 #define  wxPuts      putws
                 #define  wxFputs     fputws
             #else
+                #define wxNEED_FPUTWC
+
                 #include <stdio.h>
 
                 int wxFputs(const wxChar *ch, FILE *stream);
             #define wxNEED_WX_STDIO_H
             #define wxNEED_WX_STDLIB_H
             #define wxNEED_WX_TIME_H
-        #else // !glibc
+        #elif defined(__MWERKS__) && ( defined(macintosh) || defined(__MACH__) )
+            // ctype.h functions (wctype.h)
+            #define  wxIsalnum   iswalnum
+            #define  wxIsalpha   iswalpha
+            #define  wxIsctrl    iswcntrl
+            #define  wxIsdigit   iswdigit
+            #define  wxIsgraph   iswgraph
+            #define  wxIslower   iswlower
+            #define  wxIsprint   iswprint
+            #define  wxIspunct   iswpunct
+            #define  wxIsspace   iswspace
+            #define  wxIsupper   iswupper
+            #define  wxIsxdigit  iswxdigit
+            #define  wxTolower   towlower
+            #define  wxToupper   towupper
+
+            // string.h functions (wchar.h)
+            #define  wxStrcat    wcscat
+            #define  wxStrchr    wcschr
+            #define  wxStrcmp    wcscmp
+            #define  wxStrcoll   wcscoll
+            #define  wxStrcpy    wcscpy
+            #define  wxStrcspn   wcscspn
+            #define  wxStrlen_   wxWcslen // wxStrlen_() is used in wxStrlen()
+            #define  wxStrncat   wcsncat
+            #define  wxStrncmp   wcsncmp
+            #define  wxStrncpy   wcsncpy
+            #define  wxStrpbrk   wcspbrk
+            #define  wxStrrchr   wcsrchr
+            #define  wxStrspn    wcsspn
+            #define  wxStrstr    wcsstr
+            #define  wxStrtod    wcstod
+            #define  wxStrtol    wcstol
+            #define  wxStrtoul   wcstoul
+            #define  wxStrxfrm   wcsxfrm
+
+            #define  wxFgetc     fgetwc
+            #define  wxFgetchar  fgetwchar
+            #define  wxFgets     fgetws
+            #define  wxFputc     fputwc
+            #define  wxFputchar  fputwchar
+            #define  wxGetc      getwc
+            #define  wxGetchar   getwchar
+            #define  wxGets      getws
+            #define  wxUngetc    ungetwc
+
+            #define wxNEED_PRINTF_CONVERSION
+
+            #define  wxPutc      putwc
+            #define  wxPutchar   putwchar
+            #define  wxFputs     fputws
+            
+            // stdio.h functions
+            
+             #define wxNEED_WX_STDIO_H
+
+            // stdlib.h functions
+            #define  wxAtof      watof
+            #define  wxAtoi      watoi
+            #define  wxAtol      watol
+            #define  wxGetenv(a)    ((wxChar*)NULL)
+            #define  wxSystem(a)    ((int)NULL)
+
+            // time.h functions
+            #define  wxAsctime   wasciitime
+            #define  wxCtime     wctime
+            #define  wxStrftime  wcsftime
+
+            /*
+            #define wxNEED_FPUTWC
+
+            #include <stdio.h>
+
+            int wxFputs(const wxChar *ch, FILE *stream);
+            int wxPutc(wxChar ch, FILE *stream);
+
+            #define wxPuts(ws) wxFputs(ws, stdout)
+            #define wxPutchar(wch) wxPutc(wch, stdout)
+
+            // we need %s to %ls conversion for printf and scanf etc
+            #define wxNEED_PRINTF_CONVERSION
+            // glibc doesn't have wide char equivalents of the other stuff so
+            // use our own versions
+            #define wxNEED_WX_STDIO_H
+            #define wxNEED_WX_STDLIB_H
+            #define wxNEED_WX_TIME_H
+            */
+        #else // !metrowerks for apple
             #error  "Please define wide character functions for your environment"
         #endif
     #else // ASCII
         #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
         #define  wxStrtod    strtod
         #ifdef HAVE_STRTOK_R
             #define  wxStrtok(str, sep, last)    strtok_r(str, sep, last)
-        #else
-            #define  wxStrtok(str, sep, last)    strtok(str, sep)
         #endif
         #define  wxStrtol    strtol
         #define  wxStrtoul   strtoul
         #define  wxStrxfrm   strxfrm
 
         // stdio.h functions
+        #if defined(__WXMAC__) && !defined(__DARWIN__)
+        #include <stdio.h>
+        WXDLLIMPEXP_BASE FILE *   wxFopen(const wxChar *path, const wxChar *mode);
+        WXDLLIMPEXP_BASE FILE *   wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream);
+        WXDLLIMPEXP_BASE int      wxRemove(const wxChar *path);
+        WXDLLIMPEXP_BASE int      wxRename(const wxChar *oldpath, const wxChar *newpath);
+        #else
         #define  wxFopen     fopen
         #define  wxFreopen   freopen
-        #define  wxPerror    perror
         #define  wxRemove    remove
         #define  wxRename    rename
+        #endif
+        #define  wxPerror    perror
         #define  wxTmpnam    tmpnam
 
         #define  wxFgetc     fgetc
             defined(__EMX__) || defined(__DJGPP__)
         #define wxStricmp stricmp
         #define wxStrnicmp strnicmp
-    #elif defined(__SC__) || defined(__VISUALC__) || \
+    #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
             (defined(__MWERKS__) && defined(__INTEL__))
         #define wxStricmp _stricmp
         #define wxStrnicmp _strnicmp
     #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
@@ -559,12 +674,38 @@ inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; }
     #endif
 #endif // wxUSE_WCHAR_T
 
-WXDLLEXPORT bool wxOKlibc(); // for internal use
+// 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
+
+WXDLLIMPEXP_BASE 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.
+ */
+#if defined(HAVE_VSNPRINTF) && !defined(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()
@@ -574,28 +715,36 @@ WXDLLEXPORT 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
  */
-#ifdef wxHAVE_TCHAR_SUPPORT
-    #define wxVsnprintf_    _vsntprintf
-    #define wxSnprintf_     _sntprintf
-#else // !TCHAR
+#ifndef wxVsnprintf_
     #if wxUSE_UNICODE
-        #if defined(HAVE_VSWPRINTF)
+        #if defined(__MWERKS__)
+            #define HAVE_WCSRTOMBS 1
+            #define HAVE_VSWPRINTF 1
+        #endif
+        #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
-        #if (defined(HAVE_VSNPRINTF) || defined(__WXMAC__))
+        // all versions of CodeWarrior supported by wxWindows apparently have
+        // vsnprintf()
+        #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__)
             // assume we have snprintf() too if we have vsnprintf()
             #define wxVsnprintf_    vsnprintf
             #define wxSnprintf_     snprintf
         #endif
     #endif
-#endif // TCHAR/!TCHAR
+#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,
+    WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
                                 ...) ATTRIBUTE_PRINTF_3;
-    WXDLLEXPORT int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
+#endif
+#ifndef wxVsnprintf_
+    WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
                                  va_list argptr);
 #endif
 
@@ -633,13 +782,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 );
@@ -648,7 +797,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_
@@ -664,19 +813,19 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use
 //
 // VZ: note that this is never defined currently
 #ifdef wxNEED_WX_CTYPE_H
-    WXDLLEXPORT int wxIsalnum(wxChar ch);
-    WXDLLEXPORT int wxIsalpha(wxChar ch);
-    WXDLLEXPORT int wxIsctrl(wxChar ch);
-    WXDLLEXPORT int wxIsdigit(wxChar ch);
-    WXDLLEXPORT int wxIsgraph(wxChar ch);
-    WXDLLEXPORT int wxIslower(wxChar ch);
-    WXDLLEXPORT int wxIsprint(wxChar ch);
-    WXDLLEXPORT int wxIspunct(wxChar ch);
-    WXDLLEXPORT int wxIsspace(wxChar ch);
-    WXDLLEXPORT int wxIsupper(wxChar ch);
-    WXDLLEXPORT int wxIsxdigit(wxChar ch);
-    WXDLLEXPORT int wxTolower(wxChar ch);
-    WXDLLEXPORT int wxToupper(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsalnum(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsalpha(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsctrl(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsdigit(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsgraph(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIslower(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsprint(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIspunct(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsspace(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsupper(wxChar ch);
+    WXDLLIMPEXP_BASE int wxIsxdigit(wxChar ch);
+    WXDLLIMPEXP_BASE int wxTolower(wxChar ch);
+    WXDLLIMPEXP_BASE int wxToupper(wxChar ch);
 #endif // wxNEED_WX_CTYPE_H
 
 // under VC++ 6.0 isspace() returns 1 for 8 bit chars which completely breaks
@@ -691,62 +840,66 @@ WXDLLEXPORT bool wxOKlibc(); // for internal use
 //
 // VZ: this is never defined neither currently
 #ifdef wxNEED_WX_STRING_H
-    WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src);
-    WXDLLEXPORT const wxChar * wxStrchr(const wxChar *s, wxChar c);
-    WXDLLEXPORT wxChar * wxStrchr(wxChar *s, wxChar c)
+    WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src);
+    WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c);
+    WXDLLIMPEXP_BASE wxChar * wxStrchr(wxChar *s, wxChar c)
         { return (wxChar *)wxStrchr((const wxChar *)s, c); }
-    WXDLLEXPORT int      wxStrcmp(const wxChar *s1, const wxChar *s2);
-    WXDLLEXPORT int      wxStrcoll(const wxChar *s1, const wxChar *s2);
-    WXDLLEXPORT wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
-    WXDLLEXPORT size_t   wxStrcspn(const wxChar *s, const wxChar *reject);
-    WXDLLEXPORT size_t   wxStrlen(const wxChar *s);
-    WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
-    WXDLLEXPORT int      wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
-    WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
-    WXDLLEXPORT const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
-    WXDLLEXPORT wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
+    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 size_t   wxStrlen(const wxChar *s);
+    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 wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
         { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); }
-    WXDLLEXPORT const wxChar * wxStrrchr(const wxChar *s, wxChar c);
-    WXDLLEXPORT wxChar * wxStrrchr(wxChar *s, wxChar c)
+    WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c);
+    WXDLLIMPEXP_BASE wxChar * wxStrrchr(wxChar *s, wxChar c)
         { return (wxChar *)wxStrrchr((const wxChar *)s, c); }
-    WXDLLEXPORT size_t   wxStrspn(const wxChar *s, const wxChar *accept);
-    WXDLLEXPORT const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
-    WXDLLEXPORT wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
+    WXDLLIMPEXP_BASE size_t   wxStrspn(const wxChar *s, const wxChar *accept);
+    WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
+    WXDLLIMPEXP_BASE wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
         { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); }
-    WXDLLEXPORT double   wxStrtod(const wxChar *nptr, wxChar **endptr);
-    WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base);
-    WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base);
-    WXDLLEXPORT size_t   wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
+    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);
 #endif // wxNEED_WX_STRING_H
 
-#ifndef wxStrdup
-WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz);
+#ifndef wxStrdupA
+WXDLLIMPEXP_BASE char *wxStrdupA(const char *psz);
+#endif
+
+#ifndef wxStrdupW
+WXDLLIMPEXP_BASE wchar_t *wxStrdupW(const wchar_t *pwz);
 #endif
 
 #ifndef wxStricmp
-WXDLLEXPORT int wxStricmp(const wxChar *psz1, const wxChar *psz2);
+WXDLLIMPEXP_BASE int wxStricmp(const wxChar *psz1, const wxChar *psz2);
 #endif
 
 #ifndef wxStrnicmp
-WXDLLEXPORT int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len);
+WXDLLIMPEXP_BASE int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len);
 #endif
 
 #ifndef wxStrtok
-WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr);
+WXDLLIMPEXP_BASE wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr);
 #endif
 
 #ifndef wxSetlocale
-class WXDLLEXPORT wxWCharBuffer;
-WXDLLEXPORT wxWCharBuffer wxSetlocale(int category, const wxChar *locale);
+class WXDLLIMPEXP_BASE wxWCharBuffer;
+WXDLLIMPEXP_BASE wxWCharBuffer wxSetlocale(int category, const wxChar *locale);
 #endif
 
 // stdio.h functions
 #ifdef wxNEED_WX_STDIO_H
     #include <stdio.h>
-    WXDLLEXPORT FILE *   wxFopen(const wxChar *path, const wxChar *mode);
-    WXDLLEXPORT FILE *   wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream);
-    WXDLLEXPORT int      wxRemove(const wxChar *path);
-    WXDLLEXPORT int      wxRename(const wxChar *oldpath, const wxChar *newpath);
+    WXDLLIMPEXP_BASE FILE *   wxFopen(const wxChar *path, const wxChar *mode);
+    WXDLLIMPEXP_BASE FILE *   wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream);
+    WXDLLIMPEXP_BASE int      wxRemove(const wxChar *path);
+    WXDLLIMPEXP_BASE int      wxRename(const wxChar *oldpath, const wxChar *newpath);
 
     // *printf() family is handled separately
 #endif // wxNEED_WX_STDIO_H
@@ -754,31 +907,45 @@ WXDLLEXPORT wxWCharBuffer wxSetlocale(int category, const wxChar *locale);
 
 // stdlib.h functions
 #ifndef wxAtof
-WXDLLEXPORT double   wxAtof(const wxChar *psz);
+WXDLLIMPEXP_BASE double   wxAtof(const wxChar *psz);
 #endif
 
 #ifdef wxNEED_WX_STDLIB_H
-WXDLLEXPORT int      wxAtoi(const wxChar *psz);
-WXDLLEXPORT long     wxAtol(const wxChar *psz);
-WXDLLEXPORT wxChar * wxGetenv(const wxChar *name);
-WXDLLEXPORT int      wxSystem(const wxChar *psz);
+WXDLLIMPEXP_BASE int      wxAtoi(const wxChar *psz);
+WXDLLIMPEXP_BASE long     wxAtol(const wxChar *psz);
+WXDLLIMPEXP_BASE wxChar * wxGetenv(const wxChar *name);
+WXDLLIMPEXP_BASE int      wxSystem(const wxChar *psz);
 #endif
 
 
 // time.h functions
 #ifdef wxNEED_WX_TIME_H
-    WXDLLEXPORT size_t wxStrftime(wxChar *s, size_t max,
+#if defined(__MWERKS__) && defined(macintosh)
+    #include <time.h> 
+#endif
+    WXDLLIMPEXP_BASE size_t wxStrftime(wxChar *s, size_t max,
                                   const wxChar *fmt, const struct tm *tm);
 #endif // wxNEED_WX_TIME_H
 
+// missing functions in WinCE
+#ifdef __WXWINCE__
+WXDLLIMPEXP_BASE char* strdup(const char* s);
+WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
+
+#if _WIN32_WCE <= 211
+WXDLLIMPEXP_BASE int isspace(int c);
+WXDLLIMPEXP_BASE int isascii( int c );
+#endif
+#endif
+
 // ----------------------------------------------------------------------------
 // multibyte to wide char conversion functions and macros
 // ----------------------------------------------------------------------------
 
 #if wxUSE_WCHAR_T
     // multibyte<->widechar conversion
-    WXDLLEXPORT size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n);
-    WXDLLEXPORT size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n);
+    WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n);
+    WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n);
 
     #if wxUSE_UNICODE
         #define wxMB2WX wxMB2WC