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:
parent
567f21d2cd
commit
59078e629d
@ -26,12 +26,6 @@ class WXDLLEXPORT wxString;
|
||||
// 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()
|
||||
enum
|
||||
{
|
||||
@ -148,6 +142,11 @@ private:
|
||||
|
||||
// the real guts of this class
|
||||
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
|
||||
|
@ -107,6 +107,7 @@ wxRegExImpl::wxRegExImpl()
|
||||
{
|
||||
m_isCompiled = FALSE;
|
||||
m_Matches = NULL;
|
||||
m_nMatches = 0;
|
||||
}
|
||||
|
||||
wxRegExImpl::~wxRegExImpl()
|
||||
@ -176,8 +177,29 @@ bool wxRegExImpl::Compile(const wxString& expr, int flags)
|
||||
}
|
||||
else
|
||||
{
|
||||
// will alloc later
|
||||
m_nMatches = WX_REGEX_MAXMATCHES;
|
||||
// we will alloc the array later (only if really needed) but count
|
||||
// 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;
|
||||
@ -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") );
|
||||
|
||||
const regmatch_t& match = m_Matches[index];
|
||||
if ( match.rm_so == -1 )
|
||||
return FALSE;
|
||||
|
||||
if ( start )
|
||||
*start = match.rm_so;
|
||||
@ -318,17 +338,7 @@ int wxRegExImpl::Replace(wxString *text,
|
||||
size_t start, len;
|
||||
if ( !GetMatch(&start, &len, index) )
|
||||
{
|
||||
// we can't do it because GetMatch() returns FALSE
|
||||
// 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") );
|
||||
wxFAIL_MSG( _T("invalid back reference") );
|
||||
|
||||
// just eat it...
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user