applied patch from Xavier Nodet implementing better handling of subexpressions array in wxRegEx

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11565 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-09-06 17:21:00 +00:00
parent 567f21d2cd
commit 59078e629d
2 changed files with 30 additions and 21 deletions

View File

@ -26,12 +26,6 @@ class WXDLLEXPORT wxString;
// constants // constants
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// max number of subexpression matches, the default should be big enough for
// all uses but may be a bit wasteful
#ifndef WX_REGEX_MAXMATCHES
#define WX_REGEX_MAXMATCHES 1024
#endif
// flags for regex compilation: these can be used with Compile() // flags for regex compilation: these can be used with Compile()
enum enum
{ {
@ -148,6 +142,11 @@ private:
// the real guts of this class // the real guts of this class
wxRegExImpl *m_impl; wxRegExImpl *m_impl;
// as long as the class wxRegExImpl is not ref-counted,
// instances of the handle wxRegEx must not be copied.
wxRegEx(const wxRegEx&);
wxRegEx &operator=(const wxRegEx&);
}; };
#endif // wxUSE_REGEX #endif // wxUSE_REGEX

View File

@ -107,6 +107,7 @@ wxRegExImpl::wxRegExImpl()
{ {
m_isCompiled = FALSE; m_isCompiled = FALSE;
m_Matches = NULL; m_Matches = NULL;
m_nMatches = 0;
} }
wxRegExImpl::~wxRegExImpl() wxRegExImpl::~wxRegExImpl()
@ -176,8 +177,29 @@ bool wxRegExImpl::Compile(const wxString& expr, int flags)
} }
else else
{ {
// will alloc later // we will alloc the array later (only if really needed) but count
m_nMatches = WX_REGEX_MAXMATCHES; // the number of sub-expressions in the regex right now
// there is always one for the whole expression
m_nMatches = 1;
// and some more for bracketed subexperessions
const wxChar *cptr = expr.c_str();
wxChar prev = _T('\0');
while ( *cptr != _T('\0') )
{
// is this a subexpr start, i.e. "(" for extended regex or
// "\(" for a basic one?
if ( *cptr == _T('(') &&
(flags & wxRE_BASIC ? prev == _T('\\')
: prev != _T('\\')) )
{
m_nMatches++;
}
prev = *cptr;
cptr++;
}
} }
m_isCompiled = TRUE; m_isCompiled = TRUE;
@ -235,8 +257,6 @@ bool wxRegExImpl::GetMatch(size_t *start, size_t *len, size_t index) const
wxCHECK_MSG( index < m_nMatches, FALSE, _T("invalid match index") ); wxCHECK_MSG( index < m_nMatches, FALSE, _T("invalid match index") );
const regmatch_t& match = m_Matches[index]; const regmatch_t& match = m_Matches[index];
if ( match.rm_so == -1 )
return FALSE;
if ( start ) if ( start )
*start = match.rm_so; *start = match.rm_so;
@ -318,17 +338,7 @@ int wxRegExImpl::Replace(wxString *text,
size_t start, len; size_t start, len;
if ( !GetMatch(&start, &len, index) ) if ( !GetMatch(&start, &len, index) )
{ {
// we can't do it because GetMatch() returns FALSE wxFAIL_MSG( _T("invalid back reference") );
// even for a valid back reference index if it didn't
// match for this expression (e.g. it when alternative
// branches were used and the one contained the back
// ref didn't match)
//
// it would be better to distinguish between this case
// and really invalid index, but I don't know how to
// do it
//wxFAIL_MSG( _T("invalid back reference") );
// just eat it... // just eat it...
} }