From e5409a897df1df93e99af45a1df583509669b82f Mon Sep 17 00:00:00 2001 From: Daniel Spiljar Date: Wed, 17 May 2023 16:27:47 +0200 Subject: [PATCH] Port to the pcre2 library. --- TODO.md | 2 +- configure.ac | 27 ++++++++++++++------------- src/config.h.in | 4 ++-- src/info.c | 10 +++++----- src/main.c | 4 ++-- src/mboxgrep.h | 2 +- src/misc.c | 4 ++-- src/re.c | 44 +++++++++++++++++++++++++------------------- src/re.h | 4 ++-- src/scan.c | 4 ++-- 10 files changed, 56 insertions(+), 49 deletions(-) diff --git a/TODO.md b/TODO.md index 3e73bd3..0f18d23 100644 --- a/TODO.md +++ b/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 diff --git a/configure.ac b/configure.ac index 53e3b77..d969ea3 100644 --- a/configure.ac +++ b/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 +#define PCRE2_CODE_UNIT_WIDTH 32 +#include 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 ] ) diff --git a/src/config.h.in b/src/config.h.in index 6e0a274..80c492f 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -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 diff --git a/src/info.c b/src/info.c index 5c16c94..17cb746 100644 --- a/src/info.c +++ b/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" diff --git a/src/main.c b/src/main.c index bdbe76f..81bdba3 100644 --- a/src/main.c +++ b/src/main.c @@ -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 diff --git a/src/mboxgrep.h b/src/mboxgrep.h index f06b95c..52dc5dc 100644 --- a/src/mboxgrep.h +++ b/src/mboxgrep.h @@ -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; diff --git a/src/misc.c b/src/misc.c index fe5527d..b545fd0 100644 --- a/src/misc.c +++ b/src/misc.c @@ -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; } diff --git a/src/re.c b/src/re.c index 77696cb..cc9862d 100644 --- a/src/re.c +++ b/src/re.c @@ -21,52 +21,58 @@ #include #include #include -#ifdef HAVE_LIBPCRE -# include -#endif /* HAVE_LIBPCRE */ +#ifdef HAVE_LIBPCRE2 +# define PCRE2_CODE_UNIT_WIDTH 32 +# include +#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) diff --git a/src/re.h b/src/re.h index 65af223..2731560 100644 --- a/src/re.h +++ b/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); diff --git a/src/scan.c b/src/scan.c index ef04a2f..85f19f9 100644 --- a/src/scan.c +++ b/src/scan.c @@ -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)