+int wxString::CmpNoCase(const wxString& s) const
+{
+ // FIXME-UTF8: use wxUniChar::ToLower/ToUpper once added
+
+ const_iterator i1 = begin();
+ const_iterator end1 = end();
+ const_iterator i2 = s.begin();
+ const_iterator end2 = s.end();
+
+ for ( ; i1 != end1 && i2 != end2; ++i1, ++i2 )
+ {
+ wxUniChar lower1 = (wxChar)wxTolower(*i1);
+ wxUniChar lower2 = (wxChar)wxTolower(*i2);
+ if ( lower1 != lower2 )
+ return lower1 < lower2 ? -1 : 1;
+ }
+
+ size_t len1 = length();
+ size_t len2 = s.length();
+
+ if ( len1 < len2 )
+ return -1;
+ else if ( len1 > len2 )
+ return 1;
+ return 0;
+}
+
+
+#if wxUSE_UNICODE
+
+#ifdef __MWERKS__
+#ifndef __SCHAR_MAX__
+#define __SCHAR_MAX__ 127
+#endif
+#endif
+
+wxString wxString::FromAscii(const char *ascii, size_t len)
+{
+ if (!ascii || len == 0)
+ return wxEmptyString;
+
+ wxString res;
+
+ {
+ wxStringInternalBuffer buf(res, len);
+ wxStringCharType *dest = buf;
+
+ for ( ; len > 0; --len )
+ {
+ unsigned char c = (unsigned char)*ascii++;
+ wxASSERT_MSG( c < 0x80,
+ _T("Non-ASCII value passed to FromAscii().") );
+
+ *dest++ = (wchar_t)c;
+ }
+ }
+
+ return res;
+}
+
+wxString wxString::FromAscii(const char *ascii)
+{
+ return FromAscii(ascii, wxStrlen(ascii));
+}
+
+wxString wxString::FromAscii(char ascii)
+{
+ // What do we do with '\0' ?
+
+ unsigned char c = (unsigned char)ascii;
+
+ wxASSERT_MSG( c < 0x80, _T("Non-ASCII value passed to FromAscii().") );
+
+ // NB: the cast to wchar_t causes interpretation of 'ascii' as Latin1 value
+ return wxString(wxUniChar((wchar_t)c));
+}
+
+const wxCharBuffer wxString::ToAscii() const
+{
+ // this will allocate enough space for the terminating NUL too
+ wxCharBuffer buffer(length());
+ char *dest = buffer.data();
+
+ for ( const_iterator i = begin(); i != end(); ++i )
+ {
+ wxUniChar c(*i);
+ // FIXME-UTF8: unify substituted char ('_') with wxUniChar ('?')
+ *dest++ = c.IsAscii() ? (char)c : '_';
+
+ // the output string can't have embedded NULs anyhow, so we can safely
+ // stop at first of them even if we do have any
+ if ( !c )
+ break;
+ }
+
+ return buffer;
+}
+
+#endif // wxUSE_UNICODE
+
+// extract string of length nCount starting at nFirst
+wxString wxString::Mid(size_t nFirst, size_t nCount) const
+{
+ size_t nLen = length();
+
+ // default value of nCount is npos and means "till the end"
+ if ( nCount == npos )
+ {
+ nCount = nLen - nFirst;
+ }
+
+ // out-of-bounds requests return sensible things
+ if ( nFirst + nCount > nLen )
+ {
+ nCount = nLen - nFirst;
+ }
+
+ if ( nFirst > nLen )
+ {
+ // AllocCopy() will return empty string
+ return wxEmptyString;
+ }
+
+ wxString dest(*this, nFirst, nCount);
+ if ( dest.length() != nCount )
+ {
+ wxFAIL_MSG( _T("out of memory in wxString::Mid") );
+ }
+
+ return dest;
+}