made wxString::Replace, Matches and Find work with any form of string argument
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45249 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -673,11 +673,11 @@ See also: \helpref{Clear()}{wxstringclear}.
|
|||||||
|
|
||||||
\membersection{wxString::Find}\label{wxstringfind}
|
\membersection{wxString::Find}\label{wxstringfind}
|
||||||
|
|
||||||
\constfunc{int}{Find}{\param{wxChar}{ ch}, \param{bool}{ fromEnd = false}}
|
\constfunc{int}{Find}{\param{wxUniChar}{ ch}, \param{bool}{ fromEnd = false}}
|
||||||
|
|
||||||
Searches for the given character. Returns the starting index, or {\tt wxNOT\_FOUND} if not found.
|
Searches for the given character. Returns the starting index, or {\tt wxNOT\_FOUND} if not found.
|
||||||
|
|
||||||
\constfunc{int}{Find}{\param{const wxChar*}{ sz}}
|
\constfunc{int}{Find}{\param{const wxString\&}{ sub}}
|
||||||
|
|
||||||
Searches for the given string. Returns the starting index, or {\tt wxNOT\_FOUND} if not found.
|
Searches for the given string. Returns the starting index, or {\tt wxNOT\_FOUND} if not found.
|
||||||
|
|
||||||
@@ -942,7 +942,7 @@ Converts all characters to upper case and returns the result.
|
|||||||
|
|
||||||
\membersection{wxString::Matches}\label{wxstringmatches}
|
\membersection{wxString::Matches}\label{wxstringmatches}
|
||||||
|
|
||||||
\constfunc{bool}{Matches}{\param{const wxChar*}{ szMask}}
|
\constfunc{bool}{Matches}{\param{const wxString\&}{ mask}}
|
||||||
|
|
||||||
Returns \true if the string contents matches a mask containing '*' and '?'.
|
Returns \true if the string contents matches a mask containing '*' and '?'.
|
||||||
|
|
||||||
@@ -1046,7 +1046,7 @@ Removes the last character.
|
|||||||
|
|
||||||
\membersection{wxString::Replace}\label{wxstringreplace}
|
\membersection{wxString::Replace}\label{wxstringreplace}
|
||||||
|
|
||||||
\func{size\_t}{Replace}{\param{const wxChar*}{ szOld}, \param{const wxChar*}{ szNew}, \param{bool}{ replaceAll = true}}
|
\func{size\_t}{Replace}{\param{const wxString\&}{ strOld}, \param{const wxString\&}{ strNew}, \param{bool}{ replaceAll = true}}
|
||||||
|
|
||||||
Replace first (or all) occurrences of substring with another one.
|
Replace first (or all) occurrences of substring with another one.
|
||||||
|
|
||||||
|
@@ -1241,16 +1241,40 @@ public:
|
|||||||
// searching and replacing
|
// searching and replacing
|
||||||
// searching (return starting index, or -1 if not found)
|
// searching (return starting index, or -1 if not found)
|
||||||
int Find(wxUniChar ch, bool bFromEnd = false) const; // like strchr/strrchr
|
int Find(wxUniChar ch, bool bFromEnd = false) const; // like strchr/strrchr
|
||||||
|
int Find(wxUniCharRef ch, bool bFromEnd = false) const
|
||||||
|
{ return Find(wxUniChar(ch), bFromEnd); }
|
||||||
|
int Find(char ch, bool bFromEnd = false) const
|
||||||
|
{ return Find(wxUniChar(ch), bFromEnd); }
|
||||||
|
int Find(unsigned char ch, bool bFromEnd = false) const
|
||||||
|
{ return Find(wxUniChar(ch), bFromEnd); }
|
||||||
|
int Find(wchar_t ch, bool bFromEnd = false) const
|
||||||
|
{ return Find(wxUniChar(ch), bFromEnd); }
|
||||||
// searching (return starting index, or -1 if not found)
|
// searching (return starting index, or -1 if not found)
|
||||||
int Find(const wxChar *pszSub) const; // like strstr
|
// FIXME-UTF8: keep wxString overload only
|
||||||
|
int Find(const wxString& sub) const // like strstr
|
||||||
|
{
|
||||||
|
size_type idx = find(sub);
|
||||||
|
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
||||||
|
}
|
||||||
|
int Find(const char *sub) const // like strstr
|
||||||
|
{
|
||||||
|
size_type idx = find(sub);
|
||||||
|
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
||||||
|
}
|
||||||
|
int Find(const wchar_t *sub) const // like strstr
|
||||||
|
{
|
||||||
|
size_type idx = find(sub);
|
||||||
|
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
||||||
|
}
|
||||||
|
|
||||||
// replace first (or all of bReplaceAll) occurences of substring with
|
// replace first (or all of bReplaceAll) occurences of substring with
|
||||||
// another string, returns the number of replacements made
|
// another string, returns the number of replacements made
|
||||||
size_t Replace(const wxChar *szOld,
|
size_t Replace(const wxString& strOld,
|
||||||
const wxChar *szNew,
|
const wxString& strNew,
|
||||||
bool bReplaceAll = true);
|
bool bReplaceAll = true);
|
||||||
|
|
||||||
// check if the string contents matches a mask containing '*' and '?'
|
// check if the string contents matches a mask containing '*' and '?'
|
||||||
bool Matches(const wxChar *szMask) const;
|
bool Matches(const wxString& mask) const;
|
||||||
|
|
||||||
// conversion to numbers: all functions return true only if the whole
|
// conversion to numbers: all functions return true only if the whole
|
||||||
// string is a number and put the value of this number into the pointer
|
// string is a number and put the value of this number into the pointer
|
||||||
@@ -1351,6 +1375,7 @@ public:
|
|||||||
|
|
||||||
// use Find()
|
// use Find()
|
||||||
int First( wxUniChar ch ) const { return Find(ch); }
|
int First( wxUniChar ch ) const { return Find(ch); }
|
||||||
|
int First( wxUniCharRef ch ) const { return Find(ch); }
|
||||||
int First( char ch ) const { return Find(ch); }
|
int First( char ch ) const { return Find(ch); }
|
||||||
int First( unsigned char ch ) const { return Find(ch); }
|
int First( unsigned char ch ) const { return Find(ch); }
|
||||||
int First( wchar_t ch ) const { return Find(ch); }
|
int First( wchar_t ch ) const { return Find(ch); }
|
||||||
|
@@ -941,32 +941,32 @@ wxString wxString::AfterFirst(wxUniChar ch) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// replace first (or all) occurences of some substring with another one
|
// replace first (or all) occurences of some substring with another one
|
||||||
size_t wxString::Replace(const wxChar *szOld,
|
size_t wxString::Replace(const wxString& strOld,
|
||||||
const wxChar *szNew, bool bReplaceAll)
|
const wxString& strNew, bool bReplaceAll)
|
||||||
{
|
{
|
||||||
// if we tried to replace an empty string we'd enter an infinite loop below
|
// if we tried to replace an empty string we'd enter an infinite loop below
|
||||||
wxCHECK_MSG( szOld && *szOld && szNew, 0,
|
wxCHECK_MSG( !strOld.empty(), 0,
|
||||||
_T("wxString::Replace(): invalid parameter") );
|
_T("wxString::Replace(): invalid parameter") );
|
||||||
|
|
||||||
size_t uiCount = 0; // count of replacements made
|
size_t uiCount = 0; // count of replacements made
|
||||||
|
|
||||||
size_t uiOldLen = wxStrlen(szOld);
|
size_t uiOldLen = strOld.length();
|
||||||
size_t uiNewLen = wxStrlen(szNew);
|
size_t uiNewLen = strNew.length();
|
||||||
|
|
||||||
size_t dwPos = 0;
|
size_t dwPos = 0;
|
||||||
|
|
||||||
while ( this->c_str()[dwPos] != wxT('\0') )
|
while ( (*this)[dwPos] != wxT('\0') )
|
||||||
{
|
{
|
||||||
//DO NOT USE STRSTR HERE
|
//DO NOT USE STRSTR HERE
|
||||||
//this string can contain embedded null characters,
|
//this string can contain embedded null characters,
|
||||||
//so strstr will function incorrectly
|
//so strstr will function incorrectly
|
||||||
dwPos = find(szOld, dwPos);
|
dwPos = find(strOld, dwPos);
|
||||||
if ( dwPos == npos )
|
if ( dwPos == npos )
|
||||||
break; // exit the loop
|
break; // exit the loop
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//replace this occurance of the old string with the new one
|
//replace this occurance of the old string with the new one
|
||||||
replace(dwPos, uiOldLen, szNew, uiNewLen);
|
replace(dwPos, uiOldLen, strNew, uiNewLen);
|
||||||
|
|
||||||
//move up pos past the string that was replaced
|
//move up pos past the string that was replaced
|
||||||
dwPos += uiNewLen;
|
dwPos += uiNewLen;
|
||||||
@@ -1131,14 +1131,6 @@ int wxString::Find(wxUniChar ch, bool bFromEnd) const
|
|||||||
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
// find a sub-string (like strstr)
|
|
||||||
int wxString::Find(const wxChar *pszSub) const
|
|
||||||
{
|
|
||||||
size_type idx = find(pszSub);
|
|
||||||
|
|
||||||
return (idx == npos) ? wxNOT_FOUND : (int)idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// conversion to numbers
|
// conversion to numbers
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -1356,7 +1348,7 @@ int wxString::PrintfV(const wxString& format, va_list argptr)
|
|||||||
// returns true if the string matches the pattern which may contain '*' and
|
// returns true if the string matches the pattern which may contain '*' and
|
||||||
// '?' metacharacters (as usual, '?' matches any character and '*' any number
|
// '?' metacharacters (as usual, '?' matches any character and '*' any number
|
||||||
// of them)
|
// of them)
|
||||||
bool wxString::Matches(const wxChar *pszMask) const
|
bool wxString::Matches(const wxString& mask) const
|
||||||
{
|
{
|
||||||
// I disable this code as it doesn't seem to be faster (in fact, it seems
|
// I disable this code as it doesn't seem to be faster (in fact, it seems
|
||||||
// to be much slower) than the old, hand-written code below and using it
|
// to be much slower) than the old, hand-written code below and using it
|
||||||
@@ -1407,8 +1399,17 @@ bool wxString::Matches(const wxChar *pszMask) const
|
|||||||
#else // !wxUSE_REGEX
|
#else // !wxUSE_REGEX
|
||||||
// TODO: this is, of course, awfully inefficient...
|
// TODO: this is, of course, awfully inefficient...
|
||||||
|
|
||||||
|
// FIXME-UTF8: implement using iterators, remove #if
|
||||||
|
#if wxUSE_UNICODE_UTF8
|
||||||
|
wxWCharBuffer maskBuf = mask.wc_str();
|
||||||
|
wxWCharBuffer txtBuf = wc_str();
|
||||||
|
const wxChar *pszMask = maskBuf.data();
|
||||||
|
const wxChar *pszTxt = txtBuf.data();
|
||||||
|
#else
|
||||||
|
const wxChar *pszMask = mask.wx_str();
|
||||||
// the char currently being checked
|
// the char currently being checked
|
||||||
const wxChar *pszTxt = c_str();
|
const wxChar *pszTxt = wx_str();
|
||||||
|
#endif
|
||||||
|
|
||||||
// the last location where '*' matched
|
// the last location where '*' matched
|
||||||
const wxChar *pszLastStarInText = NULL;
|
const wxChar *pszLastStarInText = NULL;
|
||||||
|
Reference in New Issue
Block a user