#include <strings.h> // for strcasecmp()
#endif // HAVE_STRCASECMP_IN_STRINGS_H
+#ifdef __WXPALMOS__
+ #include <StringMgr.h>
+#endif
+
#include "wx/wxchar.h" // for wxChar
#include "wx/buffer.h" // for wxCharBuffer
#include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes
// constants
// ----------------------------------------------------------------------------
-#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
-// must define this static for VA or else you get multiply defined symbols everywhere
-extern const unsigned int wxSTRING_MAXLEN;
-
-#else
// maximum possible length for a string means "take all string" everywhere
-// (as sizeof(StringData) is unknown here, we substract 100)
-const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100;
-
-#endif
+#define wxSTRING_MAXLEN wxStringBase::npos
// ----------------------------------------------------------------------------
// global data
// All compare functions return -1, 0 or 1 if the [sub]string is less,
// equal or greater than the compare() argument.
- // just like strcmp()
- int compare(const wxStringBase& str) const
- { return wxStrcmp(c_str(), str.c_str()); }
+ // comparison with another string
+ int compare(const wxStringBase& str) const;
// comparison with a substring
int compare(size_t nStart, size_t nLen, const wxStringBase& str) const;
// comparison of 2 substrings
int compare(size_t nStart, size_t nLen,
const wxStringBase& str, size_t nStart2, size_t nLen2) const;
- // just like strcmp()
- int compare(const wxChar* sz) const
- { return wxStrcmp(c_str(), sz); }
+ // comparison with a c string
+ int compare(const wxChar* sz) const;
// substring comparison with first nCount characters of sz
int compare(size_t nStart, size_t nLen,
const wxChar* sz, size_t nCount = npos) const;
#endif // !wxUSE_STL
-// ---------------------------------------------------------------------------
-// This is (yet another one) String class for C++ programmers. It doesn't use
-// any of "advanced" C++ features (i.e. templates, exceptions, namespaces...)
-// thus you should be able to compile it with practicaly any C++ compiler.
-// This class uses copy-on-write technique, i.e. identical strings share the
-// same memory as long as neither of them is changed.
-//
-// This class aims to be as compatible as possible with the new standard
-// std::string class, but adds some additional functions and should be at
-// least as efficient than the standard implementation.
-//
-// Performance note: it's more efficient to write functions which take "const
-// String&" arguments than "const char *" if you assign the argument to
-// another string.
-//
-// It was compiled and tested under Win32, Linux (libc 5 & 6), Solaris 5.5.
-//
-// To do:
-// - ressource support (string tables in ressources)
-// - more wide character (UNICODE) support
-// - regular expressions support
+// ----------------------------------------------------------------------------
+// wxString: string class trying to be compatible with std::string, MFC
+// CString and wxWindows 1.x wxString all at once
// ---------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxString : public wxStringBase
// type differs because a function may either return pointer to the buffer
// directly or have to use intermediate buffer for translation.
#if wxUSE_UNICODE
- const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const
- { return conv.cWC2MB(c_str()); }
+ const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const;
const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); }
const wxWX2MBbuf mbc_str() const { return mb_str(); }
#if wxUSE_WCHAR_T
- const wxWCharBuffer wc_str(wxMBConv& conv) const
- { return conv.cMB2WC(c_str()); }
+ const wxWCharBuffer wc_str(wxMBConv& conv) const;
#endif // wxUSE_WCHAR_T
-
+#ifdef __WXOSX__
+ const wxCharBuffer fn_str() const { return wxConvFile.cWC2WX( wc_str( wxConvLocal ) ); }
+#else
const wxChar* fn_str() const { return c_str(); }
+#endif
#endif // Unicode/ANSI
// overloaded assignment
// string comparison
// case-sensitive comparison (returns a value < 0, = 0 or > 0)
- int Cmp(const wxChar *psz) const { return wxStrcmp(c_str(), psz); }
+ int Cmp(const wxChar *psz) const;
+ int Cmp(const wxString& s) const;
// same as Cmp() but not case-sensitive
- int CmpNoCase(const wxChar *psz) const { return wxStricmp(c_str(), psz); }
+ int CmpNoCase(const wxChar *psz) const;
+ int CmpNoCase(const wxString& s) const;
// test for the string equality, either considering case or not
// (if compareWithCase then the case matters)
bool IsSameAs(const wxChar *psz, bool compareWithCase = true) const
#if wxUSE_STL
// return an empty wxString (not very useful with wxUSE_STL == 1)
- inline const wxString wxGetEmptyString() { wxString(); }
+ inline const wxString wxGetEmptyString() { return wxString(); }
#else // !wxUSE_STL
// return an empty wxString (more efficient than wxString() here)
inline const wxString& wxGetEmptyString()
public:
wxStringBufferLength(wxString& str, size_t lenWanted = 1024)
: m_str(str), m_buf(NULL), m_len(0), m_lenSet(false)
- { m_buf = m_str.GetWriteBuf(lenWanted); }
+ {
+ m_buf = m_str.GetWriteBuf(lenWanted);
+ wxASSERT(m_buf != NULL);
+ }
~wxStringBufferLength()
{
// wxString comparison functions: operator versions are always case sensitive
// ---------------------------------------------------------------------------
-#if wxUSE_STL
-
-inline bool operator==(const wxString& s1, const wxString& s2)
- { return s1.compare(s2) == 0; }
-inline bool operator==(const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) == 0; }
-inline bool operator==(const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) == 0; }
-inline bool operator!=(const wxString& s1, const wxString& s2)
- { return s1.compare(s2) != 0; }
-inline bool operator!=(const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) != 0; }
-inline bool operator!=(const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) != 0; }
-inline bool operator< (const wxString& s1, const wxString& s2)
- { return s1.compare(s2) < 0; }
-inline bool operator< (const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) < 0; }
-inline bool operator< (const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) > 0; }
-inline bool operator> (const wxString& s1, const wxString& s2)
- { return s1.compare(s2) > 0; }
-inline bool operator> (const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) > 0; }
-inline bool operator> (const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) < 0; }
-inline bool operator<=(const wxString& s1, const wxString& s2)
- { return s1.compare(s2) <= 0; }
-inline bool operator<=(const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) <= 0; }
-inline bool operator<=(const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) >= 0; }
-inline bool operator>=(const wxString& s1, const wxString& s2)
- { return s1.compare(s2) >= 0; }
-inline bool operator>=(const wxString& s1, const wxChar * s2)
- { return s1.compare(s2) >= 0; }
-inline bool operator>=(const wxChar * s1, const wxString& s2)
- { return s2.compare(s1) <= 0; }
-
-#else // if !wxUSE_STL
+// note that when wxUSE_STL == 1 the comparison operators taking std::string
+// are used and defining them also for wxString would only result in
+// compilation ambiguities when comparing std::string and wxString
+#if !wxUSE_STL
inline bool operator==(const wxString& s1, const wxString& s2)
{ return (s1.Len() == s2.Len()) && (s1.Cmp(s2) == 0); }
inline bool operator>=(const wxChar * s1, const wxString& s2)
{ return s2.Cmp(s1) <= 0; }
-#endif // !wxUSE_STL
-
-// comparison with char
-inline bool operator==(wxChar c, const wxString& s) { return s.IsSameAs(c); }
-inline bool operator==(const wxString& s, wxChar c) { return s.IsSameAs(c); }
-inline bool operator!=(wxChar c, const wxString& s) { return !s.IsSameAs(c); }
-inline bool operator!=(const wxString& s, wxChar c) { return !s.IsSameAs(c); }
-
#if wxUSE_UNICODE
inline bool operator==(const wxString& s1, const wxWCharBuffer& s2)
{ return (s1.Cmp((const wchar_t *)s2) == 0); }
{ return (s2.Cmp((const char *)s1) != 0); }
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
-#if !wxUSE_STL
-
wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2);
wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch);
wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string);
wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz);
wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string);
-#endif // !wxUSE_STL
-
#if wxUSE_UNICODE
inline wxString operator+(const wxString& string, const wxWCharBuffer& buf)
{ return string + (const wchar_t *)buf; }
{ return (const char *)buf + string; }
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+#endif // !wxUSE_STL
+
+// comparison with char (those are not defined by std::[w]string and so should
+// be always available)
+inline bool operator==(wxChar c, const wxString& s) { return s.IsSameAs(c); }
+inline bool operator==(const wxString& s, wxChar c) { return s.IsSameAs(c); }
+inline bool operator!=(wxChar c, const wxString& s) { return !s.IsSameAs(c); }
+inline bool operator!=(const wxString& s, wxChar c) { return !s.IsSameAs(c); }
+
// ---------------------------------------------------------------------------
// Implementation only from here until the end of file
// ---------------------------------------------------------------------------