>From f417ea8186c0ef0271ee5cf6943923bd60d06223 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 20 Jan 2019 09:52:09 -0800 Subject: [PATCH] grep: simplify pcresearch.c ifdefs This fixes a warning if PCRE is not used (Bug#34054). * configure.ac (USE_PCRE): New conditional. * src/Makefile.am (grep_SOURCES) [!USE_PCRE]: Omit pcresearch.c. * src/grep.c (matchers) [!HAVE_LIBPCRE]: Omit perl matcher. (setmatcher) [!HAVE_LIBPCRE]: If helpful, mention --disable-perl-regexp in diagnostic. * src/pcresearch.c: Simplify by assuming HAVE_LIBPCRE. --- configure.ac | 1 + src/Makefile.am | 4 +++- src/grep.c | 7 +++++++ src/pcresearch.c | 54 ++++++++++++++++++------------------------------ 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index 4ce7216..1bbfc4f 100644 --- a/configure.ac +++ b/configure.ac @@ -206,6 +206,7 @@ if test "$ac_use_included_regex" = no; then fi gl_FUNC_PCRE +AM_CONDITIONAL([USE_PCRE], [test $use_pcre = yes]) case $host_os in mingw*) suffix=w32 ;; diff --git a/src/Makefile.am b/src/Makefile.am index 40e9a96..1cfca3f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -29,8 +29,10 @@ grep_SOURCES = \ grep.c \ kwsearch.c \ kwset.c \ - pcresearch.c \ searchutils.c +if USE_PCRE +grep_SOURCES += pcresearch.c +endif noinst_HEADERS = grep.h kwset.h search.h system.h diff --git a/src/grep.c b/src/grep.c index 95fa809..e53b8cd 100644 --- a/src/grep.c +++ b/src/grep.c @@ -2016,7 +2016,9 @@ static struct { "awk", RE_SYNTAX_AWK, GEAcompile, EGexecute }, { "gawk", RE_SYNTAX_GNU_AWK, GEAcompile, EGexecute }, { "posixawk", RE_SYNTAX_POSIX_AWK, GEAcompile, EGexecute }, +#if HAVE_LIBPCRE { "perl", 0, Pcompile, Pexecute, }, +#endif }; /* Keep these in sync with the 'matchers' table. */ enum { E_MATCHER_INDEX = 1, F_MATCHER_INDEX = 2, G_MATCHER_INDEX = 0 }; @@ -2035,6 +2037,11 @@ setmatcher (char const *m, int matcher) return i; } +#if !HAVE_LIBPCRE + if (STREQ (m, "perl")) + die (EXIT_TROUBLE, 0, + _("Perl matching not supported in a --disable-perl-regexp build")); +#endif die (EXIT_TROUBLE, 0, _("invalid matcher %s"), m); } diff --git a/src/pcresearch.c b/src/pcresearch.c index 64e189c..3e45c00 100644 --- a/src/pcresearch.c +++ b/src/pcresearch.c @@ -22,22 +22,21 @@ #include "search.h" #include "die.h" -#if HAVE_LIBPCRE -# include +#include /* This must be at least 2; everything after that is for performance in pcre_exec. */ enum { NSUB = 300 }; -# ifndef PCRE_EXTRA_MATCH_LIMIT_RECURSION -# define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0 -# endif -# ifndef PCRE_STUDY_JIT_COMPILE -# define PCRE_STUDY_JIT_COMPILE 0 -# endif -# ifndef PCRE_STUDY_EXTRA_NEEDED -# define PCRE_STUDY_EXTRA_NEEDED 0 -# endif +#ifndef PCRE_EXTRA_MATCH_LIMIT_RECURSION +# define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0 +#endif +#ifndef PCRE_STUDY_JIT_COMPILE +# define PCRE_STUDY_JIT_COMPILE 0 +#endif +#ifndef PCRE_STUDY_EXTRA_NEEDED +# define PCRE_STUDY_EXTRA_NEEDED 0 +#endif struct pcre_comp { @@ -47,11 +46,11 @@ struct pcre_comp /* Additional information about the pattern. */ pcre_extra *extra; -# if PCRE_STUDY_JIT_COMPILE +#if PCRE_STUDY_JIT_COMPILE /* The JIT stack and its maximum size. */ pcre_jit_stack *jit_stack; int jit_stack_size; -# endif +#endif /* Table, indexed by ! (flag & PCRE_NOTBOL), of whether the empty string matches when that flag is used. */ @@ -72,7 +71,7 @@ jit_exec (struct pcre_comp *pc, char const *subject, int search_bytes, int e = pcre_exec (pc->cre, pc->extra, subject, search_bytes, search_offset, options, sub, NSUB); -# if PCRE_STUDY_JIT_COMPILE +#if PCRE_STUDY_JIT_COMPILE if (e == PCRE_ERROR_JIT_STACKLIMIT && 0 < pc->jit_stack_size && pc->jit_stack_size <= INT_MAX / 2) { @@ -87,9 +86,9 @@ jit_exec (struct pcre_comp *pc, char const *subject, int search_bytes, pcre_assign_jit_stack (pc->extra, NULL, pc->jit_stack); continue; } -# endif +#endif -# if PCRE_EXTRA_MATCH_LIMIT_RECURSION +#if PCRE_EXTRA_MATCH_LIMIT_RECURSION if (e == PCRE_ERROR_RECURSIONLIMIT && (PCRE_STUDY_EXTRA_NEEDED || pc->extra) && pc->extra->match_limit_recursion <= ULONG_MAX / 2) @@ -102,22 +101,15 @@ jit_exec (struct pcre_comp *pc, char const *subject, int search_bytes, } continue; } -# endif +#endif return e; } } -#endif - void * Pcompile (char *pattern, size_t size, reg_syntax_t ignored) { -#if !HAVE_LIBPCRE - die (EXIT_TROUBLE, 0, - _("support for the -P option is not compiled into " - "this --disable-perl-regexp binary")); -#else int e; char const *ep; static char const wprefix[] = "(?cre, pc->extra, PCRE_INFO_JIT, &e)) die (EXIT_TROUBLE, 0, _("internal error (should never happen)")); /* The PCRE documentation says that a 32 KiB stack is the default. */ if (e) pc->jit_stack_size = 32 << 10; -# endif +#endif free (re); @@ -202,17 +194,12 @@ Pcompile (char *pattern, size_t size, reg_syntax_t ignored) NSUB); return pc; -#endif /* HAVE_LIBPCRE */ } size_t Pexecute (void *vcp, char const *buf, size_t size, size_t *match_size, char const *start_ptr) { -#if !HAVE_LIBPCRE - /* We can't get here, because Pcompile would have been called earlier. */ - die (EXIT_TROUBLE, 0, _("internal error")); -#else int sub[NSUB]; char const *p = start_ptr ? start_ptr : buf; bool bol = p[-1] == eolbyte; @@ -312,10 +299,10 @@ Pexecute (void *vcp, char const *buf, size_t size, size_t *match_size, case PCRE_ERROR_NOMEMORY: die (EXIT_TROUBLE, 0, _("memory exhausted")); -# if PCRE_STUDY_JIT_COMPILE +#if PCRE_STUDY_JIT_COMPILE case PCRE_ERROR_JIT_STACKLIMIT: die (EXIT_TROUBLE, 0, _("exhausted PCRE JIT stack")); -# endif +#endif case PCRE_ERROR_MATCHLIMIT: die (EXIT_TROUBLE, 0, _("exceeded PCRE's backtracking limit")); @@ -349,5 +336,4 @@ Pexecute (void *vcp, char const *buf, size_t size, size_t *match_size, *match_size = end - beg; return beg - buf; } -#endif } -- 2.17.1