Port to the pcre2 library.
This commit is contained in:
parent
55aa25eca3
commit
e5409a897d
2
TODO.md
2
TODO.md
@ -18,7 +18,7 @@
|
||||
|
||||
## File formats, encodings and standards
|
||||
|
||||
- [ ] migrate to pcre2, as pcre is obsolete
|
||||
- [x] migrate to pcre2, as pcre is obsolete
|
||||
- [ ] use a more modern hash function than MD5
|
||||
- [ ] MIME support
|
||||
- [ ] support for GnuPG
|
||||
|
27
configure.ac
27
configure.ac
@ -34,34 +34,35 @@ AC_HEADER_DIRENT
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
# Check for PCRE library
|
||||
AC_ARG_WITH(pcre, [ --without-pcre Compile without Perl regexp support],,
|
||||
# Check for PCRE2 library
|
||||
AC_ARG_WITH(pcre2, [ --without-pcre2 Compile without Perl regexp support],,
|
||||
[
|
||||
AC_PATH_PROG(PCRE_CONFIG, pcre-config)
|
||||
AC_PATH_PROG(PCRE2_CONFIG, pcre2-config)
|
||||
|
||||
if test "$PCRE_CONFIG"; then
|
||||
CFLAGS="$CFLAGS `$PCRE_CONFIG --cflags`"
|
||||
LIBS="$LIBS `$PCRE_CONFIG --libs`"
|
||||
if test "$PCRE2_CONFIG"; then
|
||||
CFLAGS="$CFLAGS `$PCRE2_CONFIG --cflags`"
|
||||
LIBS="$LIBS `$PCRE2_CONFIG --libs32`"
|
||||
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
#include <pcre.h>
|
||||
#define PCRE2_CODE_UNIT_WIDTH 32
|
||||
#include <pcre2.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
AC_DEFINE(HAVE_LIBPCRE),
|
||||
AC_DEFINE(HAVE_LIBPCRE2),
|
||||
[
|
||||
AC_MSG_NOTICE(found pcre-config but could not compile test program.)
|
||||
AC_MSG_FAILURE(is PCRE properly installed?)
|
||||
AC_MSG_NOTICE(found pcre2-config but could not compile test program.)
|
||||
AC_MSG_FAILURE(is PCRE2 properly installed?)
|
||||
]
|
||||
)
|
||||
else
|
||||
AC_MSG_NOTICE(pcre-config not found)
|
||||
AC_MSG_NOTICE(trying to find PCRE anyway)
|
||||
AC_CHECK_LIB(pcre, main)
|
||||
AC_MSG_NOTICE(pcre2-config not found)
|
||||
AC_MSG_NOTICE(trying to find PCRE2 anyway)
|
||||
AC_CHECK_LIB(pcre2, main)
|
||||
fi
|
||||
]
|
||||
)
|
||||
|
@ -25,8 +25,8 @@
|
||||
/* Define to 1 if you have the `garfield' library (-lgarfield). */
|
||||
#undef HAVE_LIBGARFIELD
|
||||
|
||||
/* Define to 1 if you have the `pcre' library (-lpcre). */
|
||||
#undef HAVE_LIBPCRE
|
||||
/* Define to 1 if you have the `pcre2' library (-lpcre2). */
|
||||
#undef HAVE_LIBPCRE2
|
||||
|
||||
/* Define to 1 if you have the `z' library (-lz). */
|
||||
#undef HAVE_LIBZ
|
||||
|
10
src/info.c
10
src/info.c
@ -74,9 +74,9 @@ version (void)
|
||||
/*
|
||||
fprintf (stdout, "HAVE_LIBLOCKFILE ");
|
||||
*/
|
||||
#ifdef HAVE_LIBPCRE
|
||||
print_wrap ("HAVE_LIBPCRE");
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
print_wrap ("HAVE_LIBPCRE2");
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
#ifdef HAVE_LIBZ
|
||||
print_wrap ("HAVE_LIBZ");
|
||||
#endif /* HAVE_LIBZ */
|
||||
@ -128,10 +128,10 @@ help (void)
|
||||
"Matching criteria:\n\n"
|
||||
" -E, --extended-regexp\tPATTERN is an extended regular expression\n"
|
||||
" -G, --basic-regexp\t\tPATTERN is a basic regular expression\n");
|
||||
#ifdef HAVE_LIBPCRE
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
fprintf (stdout,
|
||||
" -P, --perl-regexp\t\tPATTERN is a Perl regular expression\n");
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
fprintf (stdout,
|
||||
" -e, --regexp=PATTERN\t\tUse PATTERN as a regular expression\n"
|
||||
" -i, --ignore-case\t\tIgnore case distinctions\n"
|
||||
|
@ -99,11 +99,11 @@ main (int argc, char **argv)
|
||||
|
||||
if (config.haveregex)
|
||||
{
|
||||
#ifdef HAVE_LIBPCRE
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
if (config.regextype == REGEX_PERL)
|
||||
pcre_init ();
|
||||
else
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
regex_init ();
|
||||
}
|
||||
else
|
||||
|
@ -120,7 +120,7 @@ typedef struct
|
||||
char hostname[HOST_NAME_SIZE];
|
||||
char *boxname, *outboxname, *pipecmd, *tmpfilename, *regex_s;
|
||||
|
||||
void *pcre_pattern, *pcre_hints, *posix_pattern;
|
||||
void *pcre_pattern, *posix_pattern, *match_data;
|
||||
int res1, res2;
|
||||
|
||||
action_t action;
|
||||
|
@ -373,7 +373,7 @@ set_option_regextype (regextype_t regextype)
|
||||
exit (2);
|
||||
}
|
||||
|
||||
#ifndef HAVE_LIBPCRE
|
||||
#ifndef HAVE_LIBPCRE2
|
||||
if (regextype == REGEX_PERL);
|
||||
{
|
||||
fprintf (stderr,
|
||||
@ -381,6 +381,6 @@ set_option_regextype (regextype_t regextype)
|
||||
APPNAME);
|
||||
exit (2);
|
||||
}
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
config.regextype = regextype;
|
||||
}
|
||||
|
44
src/re.c
44
src/re.c
@ -21,52 +21,58 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <regex.h>
|
||||
#ifdef HAVE_LIBPCRE
|
||||
# include <pcre.h>
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
# define PCRE2_CODE_UNIT_WIDTH 32
|
||||
# include <pcre2.h>
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
#include "mboxgrep.h"
|
||||
#include "message.h"
|
||||
#include "wrap.h" /* xcalloc() et cetera */
|
||||
|
||||
#ifdef HAVE_LIBPCRE
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
void
|
||||
pcre_init (void)
|
||||
{
|
||||
int errptr;
|
||||
const char *error;
|
||||
int errornumber;
|
||||
PCRE2_SIZE erroroffset;
|
||||
|
||||
config.pcre_pattern =
|
||||
(pcre *) pcre_compile (config.regex_s,
|
||||
(config.ignorecase ? PCRE_CASELESS : 0),
|
||||
&error, &errptr, NULL);
|
||||
(pcre2_code *) pcre2_compile ((PCRE2_SPTR) config.regex_s, (PCRE2_SIZE) strlen (config.regex_s),
|
||||
(config.ignorecase ? PCRE2_CASELESS : 0),
|
||||
&errornumber, &erroroffset, NULL);
|
||||
if (config.pcre_pattern == NULL)
|
||||
{
|
||||
if (config.merr)
|
||||
fprintf (stderr, "%s: %s: %s\n", APPNAME, config.regex_s, error);
|
||||
{
|
||||
PCRE2_UCHAR buffer[256];
|
||||
|
||||
pcre2_get_error_message (errornumber, buffer, sizeof(buffer));
|
||||
fprintf (stderr, "%s: PCRE2 compilation failed at offset %d: %s\n",
|
||||
APPNAME, (int) erroroffset, (char *) buffer);
|
||||
}
|
||||
exit (2);
|
||||
}
|
||||
|
||||
config.match_data =
|
||||
(pcre2_match_data* ) pcre2_match_data_create_from_pattern (config.pcre_pattern, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
pcre_match (message_t * msg)
|
||||
{
|
||||
int of[BUFSIZ];
|
||||
|
||||
if (config.headers)
|
||||
config.res1 =
|
||||
pcre_exec ((pcre *) config.pcre_pattern,
|
||||
(pcre_extra *) config.pcre_hints,
|
||||
msg->headers, (int) strlen (msg->headers), 0, 0, of, BUFSIZ);
|
||||
pcre2_match ((pcre2_code *) config.pcre_pattern,
|
||||
(PCRE2_SPTR) msg->headers, (int) strlen (msg->headers), 0, 0, config.match_data, NULL);
|
||||
if (config.body)
|
||||
config.res2 =
|
||||
pcre_exec ((pcre *) config.pcre_pattern,
|
||||
(pcre_extra *) config.pcre_hints,
|
||||
msg->body, (int) strlen (msg->body), 0, 0, of, BUFSIZ);
|
||||
pcre2_match ((pcre2_code *) config.pcre_pattern,
|
||||
(PCRE2_SPTR) msg->body, (int) strlen (msg->body), 0, 0, config.match_data, NULL);
|
||||
|
||||
config.res1 = config.res1 ^ 1;
|
||||
config.res2 = config.res2 ^ 1;
|
||||
}
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
|
||||
void
|
||||
regex_init (void)
|
||||
|
4
src/re.h
4
src/re.h
@ -19,9 +19,9 @@
|
||||
|
||||
#include "mboxgrep.h"
|
||||
|
||||
#ifdef HAVE_LIBPCRE
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
void pcre_init (void);
|
||||
void pcre_match (message_t * msg);
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
void regex_init (void);
|
||||
void regex_match (message_t * msg);
|
||||
|
@ -146,11 +146,11 @@ scan_mailbox (char path[])
|
||||
if (msg->from == NULL)
|
||||
msg->from = (char *) xstrdup ("nobody");
|
||||
|
||||
#ifdef HAVE_LIBPCRE
|
||||
#ifdef HAVE_LIBPCRE2
|
||||
if (config.regextype == REGEX_PERL)
|
||||
pcre_match (msg);
|
||||
else
|
||||
#endif /* HAVE_LIBPCRE */
|
||||
#endif /* HAVE_LIBPCRE2 */
|
||||
regex_match (msg);
|
||||
|
||||
if (config.dedup)
|
||||
|
Loading…
Reference in New Issue
Block a user