X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7553e636a2d186784b2a6148c9557a410599956e..8c36c49496660f0779584c6a318c7416c519f84d:/src/common/regex.cpp diff --git a/src/common/regex.cpp b/src/common/regex.cpp index c646c915bb..58c50f399d 100644 --- a/src/common/regex.cpp +++ b/src/common/regex.cpp @@ -32,6 +32,7 @@ #include "wx/string.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/crt.h" #endif //WX_PRECOMP // FreeBSD, Watcom and DMars require this, CW doesn't have nor need it. @@ -56,18 +57,22 @@ #ifdef __REG_NOFRONT # define WXREGEX_USING_BUILTIN # define WXREGEX_IF_NEED_LEN(x) ,x -# define WXREGEX_CHAR(x) x +# if wxUSE_UNICODE +# define WXREGEX_CHAR(x) (x).wc_str() +# else +# define WXREGEX_CHAR(x) (x).mb_str() +# endif #else # ifdef HAVE_RE_SEARCH # define WXREGEX_IF_NEED_LEN(x) ,x # define WXREGEX_USING_RE_SEARCH -# else +# else # define WXREGEX_IF_NEED_LEN(x) # endif # if wxUSE_UNICODE # define WXREGEX_CONVERT_TO_MB # endif -# define WXREGEX_CHAR(x) wxConvertWX2MB(x) +# define WXREGEX_CHAR(x) (x).mb_str() # define wx_regfree regfree # define wx_regerror regerror #endif @@ -84,11 +89,22 @@ class wxRegExMatches public: typedef regmatch_t *match_type; - wxRegExMatches(size_t n) { m_matches = new regmatch_t[n]; } + wxRegExMatches(size_t n) { m_matches = new regmatch_t[n]; } ~wxRegExMatches() { delete [] m_matches; } - size_t Start(size_t n) const { return m_matches[n].rm_so; } - size_t End(size_t n) const { return m_matches[n].rm_eo; } + // we just use casts here because the fields of regmatch_t struct may be 64 + // bit but we're limited to size_t in our public API and are not going to + // change it because operating on strings longer than 4GB using it is + // absolutely impractical anyhow + size_t Start(size_t n) const + { + return wx_truncate_cast(size_t, m_matches[n].rm_so); + } + + size_t End(size_t n) const + { + return wx_truncate_cast(size_t, m_matches[n].rm_eo); + } regmatch_t *get() const { return m_matches; } @@ -238,7 +254,7 @@ wxString wxRegExImpl::GetErrorMsg(int errorcode, bool badconv) const (void)wx_regerror(errorcode, &m_RegEx, szcmbError, len); - szError = wxConvertMB2WX(szcmbError); + szError = wxConvLibc.cMB2WX(szcmbError); delete [] szcmbError; } else // regerror() returned 0 @@ -282,8 +298,11 @@ bool wxRegExImpl::Compile(const wxString& expr, int flags) // compile it #ifdef WXREGEX_USING_BUILTIN bool conv = true; - int errorcode = wx_re_comp(&m_RegEx, expr, expr.length(), flagsRE); + // FIXME-UTF8: use wc_str() after removing ANSI build + int errorcode = wx_re_comp(&m_RegEx, expr.c_str(), expr.length(), flagsRE); #else + // FIXME-UTF8: this is potentially broken, we shouldn't even try it + // and should always use builtin regex library (or PCRE?) const wxWX2MBbuf conv = expr.mbc_str(); int errorcode = conv ? regcomp(&m_RegEx, conv, flagsRE) : REG_BADPAT; #endif @@ -494,7 +513,11 @@ int wxRegExImpl::Replace(wxString *text, // note that "^" shouldn't match after the first call to Matches() so we // use wxRE_NOTBOL to prevent it from happening while ( (!maxMatches || countRepl < maxMatches) && +#ifndef WXREGEX_CONVERT_TO_MB Matches(textstr + matchStart, +#else + Matches(textstr.data() + matchStart, +#endif countRepl ? wxRE_NOTBOL : 0 WXREGEX_IF_NEED_LEN(textlen - matchStart)) ) { @@ -540,7 +563,12 @@ int wxRegExImpl::Replace(wxString *text, } else { +#ifndef WXREGEX_CONVERT_TO_MB textNew += wxString(textstr + matchStart + start, +#else + textNew += wxString(textstr.data() + matchStart + + start, +#endif *wxConvCurrent, len); mayHaveBackrefs = true; @@ -570,7 +598,8 @@ int wxRegExImpl::Replace(wxString *text, #ifndef WXREGEX_CONVERT_TO_MB result.append(*text, matchStart, start); #else - result.append(wxString(textstr + matchStart, *wxConvCurrent, start)); + result.append(wxString(textstr.data() + matchStart, *wxConvCurrent, + start)); #endif matchStart += start; result.append(textNew); @@ -583,7 +612,7 @@ int wxRegExImpl::Replace(wxString *text, #ifndef WXREGEX_CONVERT_TO_MB result.append(*text, matchStart, wxString::npos); #else - result.append(wxString(textstr + matchStart, *wxConvCurrent)); + result.append(wxString(textstr.data() + matchStart, *wxConvCurrent)); #endif *text = result; @@ -623,21 +652,12 @@ bool wxRegEx::Compile(const wxString& expr, int flags) return true; } -bool wxRegEx::Matches(const wxChar *str, int flags, size_t len) const -{ - wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); - (void)len; - - return m_impl->Matches(WXREGEX_CHAR(str), flags WXREGEX_IF_NEED_LEN(len)); -} - -bool wxRegEx::Matches(const wxChar *str, int flags) const +bool wxRegEx::Matches(const wxString& str, int flags) const { wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); - return m_impl->Matches(WXREGEX_CHAR(str), - flags - WXREGEX_IF_NEED_LEN(wxStrlen(str))); + return m_impl->Matches(WXREGEX_CHAR(str), flags + WXREGEX_IF_NEED_LEN(str.length())); } bool wxRegEx::GetMatch(size_t *start, size_t *len, size_t index) const