projects
/
wxWidgets.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added bin selection
[wxWidgets.git]
/
src
/
common
/
regex.cpp
diff --git
a/src/common/regex.cpp
b/src/common/regex.cpp
index 38d5e6431d064f9566058021822cacba766c2ebd..1837bfff302598e40fc69984b7a1e10657d94e43 100644
(file)
--- a/
src/common/regex.cpp
+++ b/
src/common/regex.cpp
@@
-38,15
+38,15
@@
#include "wx/intl.h"
#endif //WX_PRECOMP
#include "wx/intl.h"
#endif //WX_PRECOMP
-// FreeBSD & Watcom require this, it probably doesn't hurt for others
+// FreeBSD, Watcom and DMars require this, CW doesn't have nor need it.
+// Others also don't seem to need it. If you have an error related to
+// (not) including <sys/types.h> please report details to
+// wx-dev@lists.wxwindows.org
#if defined(__UNIX__) || defined(__WATCOMC__) || defined(__DIGITALMARS__)
#if defined(__UNIX__) || defined(__WATCOMC__) || defined(__DIGITALMARS__)
-
#
include <sys/types.h>
+
#
include <sys/types.h>
#endif
#endif
-#ifndef __WXWINCE__
#include <regex.h>
#include <regex.h>
-#endif
-
#include "wx/regex.h"
// ----------------------------------------------------------------------------
#include "wx/regex.h"
// ----------------------------------------------------------------------------
@@
-68,12
+68,13
@@
public:
bool Compile(const wxString& expr, int flags = 0);
bool Matches(const wxChar *str, int flags = 0) const;
bool GetMatch(size_t *start, size_t *len, size_t index = 0) const;
bool Compile(const wxString& expr, int flags = 0);
bool Matches(const wxChar *str, int flags = 0) const;
bool GetMatch(size_t *start, size_t *len, size_t index = 0) const;
+ size_t GetMatchCount() const;
int Replace(wxString *pattern, const wxString& replacement,
size_t maxMatches = 0) const;
private:
// return the string containing the error message for the given err code
int Replace(wxString *pattern, const wxString& replacement,
size_t maxMatches = 0) const;
private:
// return the string containing the error message for the given err code
- wxString GetErrorMsg(int errorcode) const;
+ wxString GetErrorMsg(int errorcode
, bool badconv
) const;
// init the members
void Init()
// init the members
void Init()
@@
-131,48
+132,63
@@
wxRegExImpl::~wxRegExImpl()
Free();
}
Free();
}
-wxString wxRegExImpl::GetErrorMsg(int errorcode) const
+wxString wxRegExImpl::GetErrorMsg(int errorcode
, bool badconv
) const
{
{
- wxString msg;
+#if wxUSE_UNICODE && !defined(__REG_NOFRONT)
+ // currently only needed when using system library in Unicode mode
+ if ( badconv )
+ {
+ return _("conversion to 8-bit encoding failed");
+ }
+#else
+ // 'use' badconv to avoid a compiler warning
+ (void)badconv;
+#endif
+
+ wxString szError;
// first get the string length needed
int len = regerror(errorcode, &m_RegEx, NULL, 0);
if ( len > 0 )
{
// first get the string length needed
int len = regerror(errorcode, &m_RegEx, NULL, 0);
if ( len > 0 )
{
-
len++
;
+
char* szcmbError = new char[++len]
;
-#if wxUSE_UNICODE
- wxCharBuffer buf(len);
+ (void)regerror(errorcode, &m_RegEx, szcmbError, len);
- (void)regerror(errorcode, &m_RegEx, (char *)buf.data(), len);
-
- msg = wxString(buf.data(), wxConvLibc);
-#else // !Unicode
- (void)regerror(errorcode, &m_RegEx, msg.GetWriteBuf(len), len);
-
- msg.UngetWriteBuf();
-#endif // Unicode/!Unicode
+ szError = wxConvertMB2WX(szcmbError);
+ delete [] szcmbError;
}
else // regerror() returned 0
{
}
else // regerror() returned 0
{
-
msg
= _("unknown error");
+
szError
= _("unknown error");
}
}
- return
msg
;
+ return
szError
;
}
bool wxRegExImpl::Compile(const wxString& expr, int flags)
{
Reinit();
}
bool wxRegExImpl::Compile(const wxString& expr, int flags)
{
Reinit();
- // translate our flags to regcomp() ones
- wxASSERT_MSG( !(flags &
- ~(wxRE_BASIC | wxRE_ICASE | wxRE_NOSUB | wxRE_NEWLINE)),
+#ifdef WX_NO_REGEX_ADVANCED
+# define FLAVORS wxRE_BASIC
+#else
+# define FLAVORS (wxRE_ADVANCED | wxRE_BASIC)
+ wxASSERT_MSG( (flags & FLAVORS) != FLAVORS,
+ _T("incompatible flags in wxRegEx::Compile") );
+#endif
+ wxASSERT_MSG( !(flags & ~(FLAVORS | wxRE_ICASE | wxRE_NOSUB | wxRE_NEWLINE)),
_T("unrecognized flags in wxRegEx::Compile") );
_T("unrecognized flags in wxRegEx::Compile") );
+ // translate our flags to regcomp() ones
int flagsRE = 0;
if ( !(flags & wxRE_BASIC) )
int flagsRE = 0;
if ( !(flags & wxRE_BASIC) )
- flagsRE |= REG_EXTENDED;
+#ifndef WX_NO_REGEX_ADVANCED
+ if (flags & wxRE_ADVANCED)
+ flagsRE |= REG_ADVANCED;
+ else
+#endif
+ flagsRE |= REG_EXTENDED;
if ( flags & wxRE_ICASE )
flagsRE |= REG_ICASE;
if ( flags & wxRE_NOSUB )
if ( flags & wxRE_ICASE )
flagsRE |= REG_ICASE;
if ( flags & wxRE_NOSUB )
@@
-180,18
+196,19
@@
bool wxRegExImpl::Compile(const wxString& expr, int flags)
if ( flags & wxRE_NEWLINE )
flagsRE |= REG_NEWLINE;
if ( flags & wxRE_NEWLINE )
flagsRE |= REG_NEWLINE;
-
// compile it
// compile it
-#if wxUSE_NEW_REGEX
- int errorcode = wx_regcomp(&m_RegEx, expr, expr.Length(), flagsRE);
+#ifdef __REG_NOFRONT
+ bool conv = true;
+ int errorcode = re_comp(&m_RegEx, expr, expr.length(), flagsRE);
#else
#else
- int errorcode = regcomp(&m_RegEx, expr.mb_str(), flagsRE);
+ const wxWX2MBbuf conv = expr.mbc_str();
+ int errorcode = conv ? regcomp(&m_RegEx, conv, flagsRE) : REG_BADPAT;
#endif
#endif
-
if ( errorcode )
+ if ( errorcode )
{
wxLogError(_("Invalid regular expression '%s': %s"),
{
wxLogError(_("Invalid regular expression '%s': %s"),
- expr.c_str(), GetErrorMsg(errorcode).c_str());
+ expr.c_str(), GetErrorMsg(errorcode
, !conv
).c_str());
m_isCompiled = FALSE;
}
m_isCompiled = FALSE;
}
@@
-226,9
+243,12
@@
bool wxRegExImpl::Compile(const wxString& expr, int flags)
{
// we know that the previous character is not an unquoted
// backslash because it would have been eaten above, so we
{
// we know that the previous character is not an unquoted
// backslash because it would have been eaten above, so we
- // have a bar '(' and this indicates a group start for the
- // extended syntax
- m_nMatches++;
+ // have a bare '(' and this indicates a group start for the
+ // extended syntax. '(?' is used for extensions by perl-
+ // like REs (e.g. advanced), and is not valid for POSIX
+ // extended, so ignore them always.
+ if ( cptr[1] != _T('?') )
+ m_nMatches++;
}
}
}
}
}
}
@@
-261,11
+281,12
@@
bool wxRegExImpl::Matches(const wxChar *str, int flags) const
}
// do match it
}
// do match it
-#ifdef
wxUSE_NEW_REGEX
-
rm_detail_t rd
;
- int rc =
wx_regexec(&self->m_RegEx, str, wxStrlen(str), &rd
, m_nMatches, m_Matches, flagsRE);
+#ifdef
__REG_NOFRONT
+
bool conv = true
;
+ int rc =
re_exec(&self->m_RegEx, str, wxStrlen(str), NULL
, m_nMatches, m_Matches, flagsRE);
#else
#else
- int rc = regexec(&self->m_RegEx, wxConvertWX2MB(str), m_nMatches, m_Matches, flagsRE);
+ const wxWX2MBbuf conv = wxConvertWX2MB(str);
+ int rc = conv ? regexec(&self->m_RegEx, conv, m_nMatches, m_Matches, flagsRE) : REG_BADPAT;
#endif
switch ( rc )
#endif
switch ( rc )
@@
-277,7
+298,7
@@
bool wxRegExImpl::Matches(const wxChar *str, int flags) const
default:
// an error occured
wxLogError(_("Failed to match '%s' in regular expression: %s"),
default:
// an error occured
wxLogError(_("Failed to match '%s' in regular expression: %s"),
- str, GetErrorMsg(rc).c_str());
+ str, GetErrorMsg(rc
, !conv
).c_str());
// fall through
case REG_NOMATCH:
// fall through
case REG_NOMATCH:
@@
-289,7
+310,8
@@
bool wxRegExImpl::Matches(const wxChar *str, int flags) const
bool wxRegExImpl::GetMatch(size_t *start, size_t *len, size_t index) const
{
wxCHECK_MSG( IsValid(), FALSE, _T("must successfully Compile() first") );
bool wxRegExImpl::GetMatch(size_t *start, size_t *len, size_t index) const
{
wxCHECK_MSG( IsValid(), FALSE, _T("must successfully Compile() first") );
- wxCHECK_MSG( m_Matches, FALSE, _T("can't use with wxRE_NOSUB") );
+ wxCHECK_MSG( m_nMatches, FALSE, _T("can't use with wxRE_NOSUB") );
+ wxCHECK_MSG( m_Matches, FALSE, _T("must call Matches() first") );
wxCHECK_MSG( index < m_nMatches, FALSE, _T("invalid match index") );
const regmatch_t& match = m_Matches[index];
wxCHECK_MSG( index < m_nMatches, FALSE, _T("invalid match index") );
const regmatch_t& match = m_Matches[index];
@@
-302,6
+324,14
@@
bool wxRegExImpl::GetMatch(size_t *start, size_t *len, size_t index) const
return TRUE;
}
return TRUE;
}
+size_t wxRegExImpl::GetMatchCount() const
+{
+ wxCHECK_MSG( IsValid(), 0, _T("must successfully Compile() first") );
+ wxCHECK_MSG( m_nMatches, 0, _T("can't use with wxRE_NOSUB") );
+
+ return m_nMatches;
+}
+
int wxRegExImpl::Replace(wxString *text,
const wxString& replacement,
size_t maxMatches) const
int wxRegExImpl::Replace(wxString *text,
const wxString& replacement,
size_t maxMatches) const
@@
-470,6
+500,13
@@
wxString wxRegEx::GetMatch(const wxString& text, size_t index) const
return text.Mid(start, len);
}
return text.Mid(start, len);
}
+size_t wxRegEx::GetMatchCount() const
+{
+ wxCHECK_MSG( IsValid(), 0, _T("must successfully Compile() first") );
+
+ return m_impl->GetMatchCount();
+}
+
int wxRegEx::Replace(wxString *pattern,
const wxString& replacement,
size_t maxMatches) const
int wxRegEx::Replace(wxString *pattern,
const wxString& replacement,
size_t maxMatches) const