>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