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
|
// 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
|
||||||
|
@ -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...
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user