added wxJoin and wxSplit functions (modified patch 1638950)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user