X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c9f7896861f734ce044ee8601ba2d8a6959c9d9e..38b36b4c679d20adb70d1695f3be9b801fdbf556:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 2a495e50c2..f26486112a 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -56,7 +56,7 @@ // static class variables definition // --------------------------------------------------------------------------- -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING //According to STL _must_ be a -1 size_t const size_t wxStringBase::npos = (size_t) -1; #endif @@ -65,7 +65,7 @@ // static data // ---------------------------------------------------------------------------- -#if wxUSE_STL +#if wxUSE_STL_BASED_WXSTRING extern const wxChar WXDLLIMPEXP_BASE *wxEmptyString = _T(""); @@ -138,7 +138,7 @@ wxSTD ostream& operator<<(wxSTD ostream& os, const wxCStrData& str) #define STATISTICS_ADD(av, val) #endif // WXSTRING_STATISTICS -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING // =========================================================================== // wxStringData class deallocation @@ -911,11 +911,11 @@ bool wxStringBase::AllocCopy(wxString& dest, int nCopyLen, int nCopyIndex) const return true; } -#endif // !wxUSE_STL +#endif // !wxUSE_STL_BASED_WXSTRING -#if !wxUSE_STL || !defined(HAVE_STD_STRING_COMPARE) +#if !wxUSE_STL_BASED_WXSTRING || !defined(HAVE_STD_STRING_COMPARE) -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING #define STRINGCLASS wxStringBase #else #define STRINGCLASS wxString @@ -985,7 +985,7 @@ int STRINGCLASS::compare(size_t nStart, size_t nLen, #undef STRINGCLASS -#endif // !wxUSE_STL || !defined(HAVE_STD_STRING_COMPARE) +#endif // !wxUSE_STL_BASED_WXSTRING || !defined(HAVE_STD_STRING_COMPARE) // =========================================================================== // wxString class core @@ -1064,7 +1064,7 @@ bool wxString::Shrink() return tmp.length() == length(); } -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING // get the pointer to writable buffer of (at least) nLen bytes wxChar *wxString::DoGetWriteBuf(size_t nLen) { @@ -1115,7 +1115,7 @@ void wxString::UngetWriteBuf(size_t nLen) } #endif // WXWIN_COMPATIBILITY_2_8 -#endif // !wxUSE_STL +#endif // !wxUSE_STL_BASED_WXSTRING // --------------------------------------------------------------------------- @@ -1157,7 +1157,7 @@ wxString& wxString::operator=(const wchar_t *pwz) wxString operator+(const wxString& str1, const wxString& str2) { -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING wxASSERT( str1.GetStringData()->IsValid() ); wxASSERT( str2.GetStringData()->IsValid() ); #endif @@ -1170,7 +1170,7 @@ wxString operator+(const wxString& str1, const wxString& str2) wxString operator+(const wxString& str, wxUniChar ch) { -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING wxASSERT( str.GetStringData()->IsValid() ); #endif @@ -1182,7 +1182,7 @@ wxString operator+(const wxString& str, wxUniChar ch) wxString operator+(wxUniChar ch, const wxString& str) { -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING wxASSERT( str.GetStringData()->IsValid() ); #endif @@ -1194,7 +1194,7 @@ wxString operator+(wxUniChar ch, const wxString& str) wxString operator+(const wxString& str, const wxChar *psz) { -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING wxASSERT( str.GetStringData()->IsValid() ); #endif @@ -1210,7 +1210,7 @@ wxString operator+(const wxString& str, const wxChar *psz) wxString operator+(const wxChar *psz, const wxString& str) { -#if !wxUSE_STL +#if !wxUSE_STL_BASED_WXSTRING wxASSERT( str.GetStringData()->IsValid() ); #endif @@ -2527,3 +2527,106 @@ int wxCMPFUNC_CONV wxStringSortDescending(wxString* s1, wxString* s2) { return -s1->Cmp(*s2); } + + + +// =========================================================================== +// wxJoin and wxSplit +// =========================================================================== + +#include "wx/tokenzr.h" + +wxString wxJoin(const wxArrayString& arr, const wxChar sep, const wxChar escape) +{ + size_t count = arr.size(); + if ( count == 0 ) + return wxEmptyString; + + wxString str; + + // pre-allocate memory using the estimation of the average length of the + // strings in the given array: this is very imprecise, of course, but + // better than nothing + str.reserve(count*(arr[0].length() + arr[count-1].length()) / 2); + + if ( escape == wxT('\0') ) + { + // escaping is disabled: + for ( size_t i = 0; i < count; i++ ) + { + if ( i ) + str += sep; + str += arr[i]; + } + } + else // use escape character + { + for ( size_t n = 0; n < count; n++ ) + { + if ( n ) + str += sep; + + for ( wxString::const_iterator i = arr[n].begin(), + end = arr[n].end(); + i != end; + ++i ) + { + const wxChar ch = *i; + if ( ch == sep ) + str += escape; // escape this separator + str += ch; + } + } + } + + str.Shrink(); // release extra memory if we allocated too much + return str; +} + +wxArrayString wxSplit(const wxString& str, const wxChar sep, const wxChar escape) +{ + if ( escape == wxT('\0') ) + { + // simple case: we don't need to honour the escape character + return wxStringTokenize(str, sep, wxTOKEN_RET_EMPTY_ALL); + } + + wxArrayString ret; + wxString curr; + wxChar prev = wxT('\0'); + + for ( wxString::const_iterator i = str.begin(), + end = str.end(); + i != end; + ++i ) + { + const wxChar ch = *i; + + if ( ch == sep ) + { + if ( prev == escape ) + { + // remove the escape character and don't consider this + // occurrence of 'sep' as a real separator + *curr.rbegin() = sep; + } + else // real separator + { + ret.push_back(curr); + curr.clear(); + } + } + else // normal character + { + curr += ch; + } + + prev = ch; + } + + // add the last token + if ( !curr.empty() || prev == sep ) + ret.Add(curr); + + return ret; +}