// Name: wx/wxcrt.h
// Purpose: Type-safe ANSI and Unicode builds compatible wrappers for
// CRT functions
-// Author: Joel Farley, Ove K�ven
+// Author: Joel Farley, Ove Kaaven
// Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee, Vaclav Slavik
// Created: 1998/06/12
// RCS-ID: $Id$
#include "wx/wxcrtbase.h"
#include "wx/string.h"
+#if defined (__VISUALC__) || defined (__DMC__)
+ #define HAVE_NO_VSSCANF 1
+#endif
+
// ============================================================================
// misc functions
// ============================================================================
// (including even MSC) inline them just like we do right in their
// headers.
//
-#if wxUSE_UNICODE
- #include <string.h> //for mem funcs
+#include <string.h>
+#if wxUSE_UNICODE
//implement our own wmem variants
inline wxChar* wxTmemchr(const wxChar* s, wxChar c, size_t l)
{
return szRet;
}
-
- // and trivial wrappers for char* versions:
- inline char* wxTmemchr(const char* s, char c, size_t len)
- { return (char*)memchr(s, c, len); }
- inline int wxTmemcmp(const char* sz1, const char* sz2, size_t len)
- { return memcmp(sz1, sz2, len); }
- inline char* wxTmemcpy(char* szOut, const char* szIn, size_t len)
- { return (char*)memcpy(szOut, szIn, len); }
- inline char* wxTmemmove(char* szOut, const char* szIn, size_t len)
- { return (char*)memmove(szOut, szIn, len); }
- inline char* wxTmemset(char* szOut, const char cIn, size_t len)
- { return (char*)memset(szOut, cIn, len); }
-
-#else /* !wxUSE_UNICODE */
- #define wxTmemchr memchr
- #define wxTmemcmp memcmp
- #define wxTmemcpy memcpy
- #define wxTmemmove memmove
- #define wxTmemset memset
-#endif /* wxUSE_UNICODE/!wxUSE_UNICODE */
-
+#endif /* wxUSE_UNICODE */
+
+// provide trivial wrappers for char* versions for both ANSI and Unicode builds
+// (notice that these intentionally return "char *" and not "void *" unlike the
+// standard memxxx() for symmetry with the wide char versions):
+inline char* wxTmemchr(const char* s, char c, size_t len)
+ { return (char*)memchr(s, c, len); }
+inline int wxTmemcmp(const char* sz1, const char* sz2, size_t len)
+ { return memcmp(sz1, sz2, len); }
+inline char* wxTmemcpy(char* szOut, const char* szIn, size_t len)
+ { return (char*)memcpy(szOut, szIn, len); }
+inline char* wxTmemmove(char* szOut, const char* szIn, size_t len)
+ { return (char*)memmove(szOut, szIn, len); }
+inline char* wxTmemset(char* szOut, const char cIn, size_t len)
+ { return (char*)memset(szOut, cIn, len); }
// ============================================================================
// ----------------------------------------------------------------------------
// NB: we can't provide const wchar_t* (= wxChar*) overload, because calling
-// wxSetlocale(category, NULL) -- which is a common thing to do --would be
+// wxSetlocale(category, NULL) -- which is a common thing to do -- would be
// ambiguous
WXDLLIMPEXP_BASE char* wxSetlocale(int category, const char *locale);
inline char* wxSetlocale(int category, const wxCharBuffer& locale)
{ return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \
inline rettype WX_STR_DECL(name, const wxCharBuffer&, const wxCharBuffer&)\
{ return WX_STR_CALL(crtA, s1.data(), s2.data()); } \
- inline int WX_STR_DECL(name, const wxCharBuffer&, const wxWCharBuffer&) \
+ inline rettype WX_STR_DECL(name, const wxCharBuffer&, const wxWCharBuffer&) \
{ return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \
\
inline rettype WX_STR_DECL(name, const wxWCharBuffer&, const wchar_t *) \
{ return WX_STR_CALL(crtW, s1.data(), s2); } \
inline rettype WX_STR_DECL(name, const wxWCharBuffer&, const char *) \
{ return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \
- inline int WX_STR_DECL(name, const wxWCharBuffer&, const wxWCharBuffer&) \
+ inline rettype WX_STR_DECL(name, const wxWCharBuffer&, const wxWCharBuffer&) \
{ return WX_STR_CALL(crtW, s1.data(), s2.data()); } \
- inline int WX_STR_DECL(name, const wxWCharBuffer&, const wxCharBuffer&) \
+ inline rettype WX_STR_DECL(name, const wxWCharBuffer&, const wxCharBuffer&) \
{ return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \
\
inline rettype WX_STR_DECL(name, const wxString&, const char*) \
#endif // defined(wxCRT_Strcoll[AW])
template<typename T>
-inline int wxStrspn_String(const wxString& s1, const T& s2)
+inline size_t wxStrspn_String(const wxString& s1, const T& s2)
{
size_t pos = s1.find_first_not_of(s2);
- return (pos == wxString::npos) ? s1.length() : pos;
+ return pos == wxString::npos ? s1.length() : pos;
}
-WX_STR_FUNC(size_t, wxStrspn, wxCRT_StrspnA, wxCRT_StrspnW, wxStrspn_String)
+WX_STR_FUNC_NO_INVERT(size_t, wxStrspn,
+ wxCRT_StrspnA, wxCRT_StrspnW, wxStrspn_String)
template<typename T>
-inline int wxStrcspn_String(const wxString& s1, const T& s2)
+inline size_t wxStrcspn_String(const wxString& s1, const T& s2)
{
size_t pos = s1.find_first_of(s2);
- return (pos == wxString::npos) ? s1.length() : pos;
+ return pos == wxString::npos ? s1.length() : pos;
}
-WX_STR_FUNC(size_t, wxStrcspn, wxCRT_StrcspnA, wxCRT_StrcspnW, wxStrcspn_String)
+WX_STR_FUNC_NO_INVERT(size_t, wxStrcspn,
+ wxCRT_StrcspnA, wxCRT_StrcspnW, wxStrcspn_String)
#undef WX_STR_DECL
#undef WX_STR_CALL