X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/765624f7350bf32b1c78a10ab1a1e10729c52cd1..e6adf05834e880312efa3d59914ecc1d4f5f78a6:/src/common/regex.cpp?ds=sidebyside diff --git a/src/common/regex.cpp b/src/common/regex.cpp index 46eb372cfb..45efe1a5b2 100644 --- a/src/common/regex.cpp +++ b/src/common/regex.cpp @@ -38,6 +38,11 @@ #include "wx/intl.h" #endif //WX_PRECOMP +// FreeBSD requires this, it probably doesn't hurt for others +#ifdef __UNIX__ + #include +#endif + #include #include "wx/regex.h" @@ -102,6 +107,7 @@ wxRegExImpl::wxRegExImpl() { m_isCompiled = FALSE; m_Matches = NULL; + m_nMatches = 0; } wxRegExImpl::~wxRegExImpl() @@ -171,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; @@ -230,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;