X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0f2ecc913ba8f6998a3c77001e20210aca0b9d0a..c04857dd6a69272399054f4e7fac47d46bf8b09f:/src/common/regex.cpp diff --git a/src/common/regex.cpp b/src/common/regex.cpp index db11e97cec..7b480f24c8 100644 --- a/src/common/regex.cpp +++ b/src/common/regex.cpp @@ -38,8 +38,8 @@ #include "wx/intl.h" #endif //WX_PRECOMP -// FreeBSD requires this, it probably doesn't hurt for others -#ifdef __UNIX__ +// FreeBSD & Watcom require this, it probably doesn't hurt for others +#if defined(__UNIX__) || defined(__WATCOMC__) #include #endif @@ -107,6 +107,7 @@ wxRegExImpl::wxRegExImpl() { m_isCompiled = FALSE; m_Matches = NULL; + m_nMatches = 0; } wxRegExImpl::~wxRegExImpl() @@ -126,9 +127,17 @@ wxString wxRegExImpl::GetErrorMsg(int errorcode) const { len++; +#if wxUSE_UNICODE + wxCharBuffer buf(len); + + (void)regerror(errorcode, &m_RegEx, (char *)buf.data(), len); + + msg = buf.data(); +#else // !Unicode (void)regerror(errorcode, &m_RegEx, msg.GetWriteBuf(len), len); msg.UngetWriteBuf(); +#endif // Unicode/!Unicode } else // regerror() returned 0 { @@ -158,7 +167,7 @@ bool wxRegExImpl::Compile(const wxString& expr, int flags) flagsRE |= REG_NEWLINE; // compile it - int errorcode = regcomp(&m_RegEx, expr, flagsRE); + int errorcode = regcomp(&m_RegEx, expr.mb_str(), flagsRE); if ( errorcode ) { wxLogError(_("Invalid regular expression '%s': %s"), @@ -176,8 +185,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; @@ -208,7 +238,7 @@ bool wxRegExImpl::Matches(const wxChar *str, int flags) const } // do match it - int rc = regexec(&self->m_RegEx, str, m_nMatches, m_Matches, flagsRE); + int rc = regexec(&self->m_RegEx, wxConvertWX2MB(str), m_nMatches, m_Matches, flagsRE); switch ( rc ) { @@ -235,8 +265,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 +346,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... }