#include <regex.h>
#include "wx/regex.h"
-// WXREGEX_USING_BUILTIN defined when using the built-in regex lib
-// WXREGEX_IF_NEED_LEN() wrap the len parameter only used with the built-in
-// or GNU regex
-// WXREGEX_CONVERT_TO_MB defined when the regex lib is using chars and
-// wxChar is wide, so conversion must be done
-// WXREGEX_CHAR(x) Convert wxChar to wxRegChar
+// WXREGEX_USING_BUILTIN defined when using the built-in regex lib
+// WXREGEX_USING_RE_SEARCH defined when using re_search in the GNU regex lib
+// WXREGEX_IF_NEED_LEN() wrap the len parameter only used with the built-in
+// or GNU regex
+// WXREGEX_CONVERT_TO_MB defined when the regex lib is using chars and
+// wxChar is wide, so conversion must be done
+// WXREGEX_CHAR(x) Convert wxChar to wxRegChar
//
#ifdef __REG_NOFRONT
# define WXREGEX_USING_BUILTIN
#else
# ifdef HAVE_RE_SEARCH
# define WXREGEX_IF_NEED_LEN(x) ,x
-# else
+# define WXREGEX_USING_RE_SEARCH
+# else
# define WXREGEX_IF_NEED_LEN(x)
# endif
# if wxUSE_UNICODE
# define WXREGEX_CONVERT_TO_MB
# endif
# define WXREGEX_CHAR(x) wxConvertWX2MB(x)
+# define wx_regfree regfree
+# define wx_regerror regerror
#endif
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
-#ifndef HAVE_RE_SEARCH
+#ifndef WXREGEX_USING_RE_SEARCH
// the array of offsets for the matches, the usual POSIX regmatch_t array.
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; }
regmatch_t *m_matches;
};
-#else // HAVE_RE_SEARCH
+#else // WXREGEX_USING_RE_SEARCH
// the array of offsets for the matches, the struct used by the GNU lib
class wxRegExMatches
re_registers m_matches;
};
-#endif // HAVE_RE_SEARCH
+#endif // WXREGEX_USING_RE_SEARCH
// the character type used by the regular expression engine
#ifndef WXREGEX_CONVERT_TO_MB
{
if ( IsValid() )
{
- regfree(&m_RegEx);
+ wx_regfree(&m_RegEx);
}
delete m_Matches;
wxString szError;
// first get the string length needed
- int len = regerror(errorcode, &m_RegEx, NULL, 0);
+ int len = wx_regerror(errorcode, &m_RegEx, NULL, 0);
if ( len > 0 )
{
char* szcmbError = new char[++len];
- (void)regerror(errorcode, &m_RegEx, szcmbError, len);
+ (void)wx_regerror(errorcode, &m_RegEx, szcmbError, len);
- szError = wxConvertMB2WX(szcmbError);
+ szError = wxConvLibc.cMB2WX(szcmbError);
delete [] szcmbError;
}
else // regerror() returned 0
return IsValid();
}
-#ifdef HAVE_RE_SEARCH
+#ifdef WXREGEX_USING_RE_SEARCH
// On GNU, regexec is implemented as a wrapper around re_search. re_search
// requires a length parameter which the POSIX regexec does not have,
return ret >= 0 ? 0 : REG_NOMATCH;
}
-#endif // HAVE_RE_SEARCH
+#endif // WXREGEX_USING_RE_SEARCH
bool wxRegExImpl::Matches(const wxRegChar *str,
int flags
// do match it
#if defined WXREGEX_USING_BUILTIN
int rc = wx_re_exec(&self->m_RegEx, str, len, NULL, m_nMatches, matches, flagsRE);
-#elif defined HAVE_RE_SEARCH
+#elif defined WXREGEX_USING_RE_SEARCH
int rc = str ? ReSearch(&self->m_RegEx, str, len, matches, flagsRE) : REG_BADPAT;
#else
int rc = str ? regexec(&self->m_RegEx, str, m_nMatches, matches, flagsRE) : REG_BADPAT;