summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man5/src.conf.57
-rw-r--r--share/mk/src.opts.mk1
-rw-r--r--tools/build/options/WITHOUT_BSD_GREP_FASTMATCH5
-rw-r--r--usr.bin/grep/Makefile6
-rw-r--r--usr.bin/grep/grep.c25
-rw-r--r--usr.bin/grep/grep.h4
-rw-r--r--usr.bin/grep/util.c8
7 files changed, 46 insertions, 10 deletions
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index c71a7d7..5d5571c 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,6 +1,6 @@
.\" DO NOT EDIT-- this file is generated by tools/build/options/makeman.
.\" $FreeBSD$
-.Dd August 5, 2017
+.Dd August 16, 2017
.Dt SRC.CONF 5
.Os
.Sh NAME
@@ -214,6 +214,11 @@ Set to not build the BSD licensed version of cpio based on
.Xr libarchive 3 .
.It Va WITH_BSD_GREP
Install BSD-licensed grep as '[ef]grep' instead of GNU grep.
+.It Va WITHOUT_BSD_GREP_FASTMATCH
+Set this option to exclude the fastmatch implementation from
+.Xr bsdgrep 1 ,
+instead using only
+.Xr regex 3 .
.It Va WITHOUT_BSNMP
Set to not build or install
.Xr bsnmpd 1
diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
index fa1f7c8..2ff797c 100644
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -62,6 +62,7 @@ __DEFAULT_YES_OPTIONS = \
BOOTPARAMD \
BOOTPD \
BSD_CPIO \
+ BSD_GREP_FASTMATCH \
BSDINSTALL \
BSNMP \
BZIP2 \
diff --git a/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH b/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH
new file mode 100644
index 0000000..ffb3aaf
--- /dev/null
+++ b/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH
@@ -0,0 +1,5 @@
+.\" $FreeBSD$
+Set this option to exclude the fastmatch implementation from
+.Xr bsdgrep 1 ,
+instead using only
+.Xr regex 3 .
diff --git a/usr.bin/grep/Makefile b/usr.bin/grep/Makefile
index 7c67659..c6b25f0 100644
--- a/usr.bin/grep/Makefile
+++ b/usr.bin/grep/Makefile
@@ -15,10 +15,14 @@ bsdgrep.1: grep.1
.endif
SRCS= file.c grep.c queue.c util.c
-# Extra files ported backported form some regex improvements
+.if ${MK_BSD_GREP_FASTMATCH} == "yes"
+# Extra files ported backported for some regex improvements
.PATH: ${.CURDIR}/regex
SRCS+= fastmatch.c hashtable.c tre-compile.c tre-fastmatch.c
CFLAGS+=-I${.CURDIR}/regex
+.else
+CFLAGS+= -DWITHOUT_FASTMATCH
+.endif
CFLAGS.gcc+= --param max-inline-insns-single=500
diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c
index 47e6465..9709ce6 100644
--- a/usr.bin/grep/grep.c
+++ b/usr.bin/grep/grep.c
@@ -50,7 +50,9 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
+#ifndef WITHOUT_FASTMATCH
#include "fastmatch.h"
+#endif
#include "grep.h"
#ifndef WITHOUT_NLS
@@ -87,7 +89,9 @@ unsigned int patterns;
static unsigned int pattern_sz;
struct pat *pattern;
regex_t *r_pattern;
+#ifndef WITHOUT_FASTMATCH
fastmatch_t *fg_pattern;
+#endif
/* Filename exclusion/inclusion patterns */
unsigned int fpatterns, dpatterns;
@@ -716,20 +720,25 @@ main(int argc, char *argv[])
usage();
}
+#ifndef WITHOUT_FASTMATCH
fg_pattern = grep_calloc(patterns, sizeof(*fg_pattern));
+#endif
r_pattern = grep_calloc(patterns, sizeof(*r_pattern));
/* Check if cheating is allowed (always is for fgrep). */
for (i = 0; i < patterns; ++i) {
+#ifndef WITHOUT_FASTMATCH
+ /* Attempt compilation with fastmatch regex and fallback to
+ regex(3) if it fails. */
if (fastncomp(&fg_pattern[i], pattern[i].pat,
- pattern[i].len, cflags) != 0) {
- /* Fall back to full regex library */
- c = regcomp(&r_pattern[i], pattern[i].pat, cflags);
- if (c != 0) {
- regerror(c, &r_pattern[i], re_error,
- RE_ERROR_BUF);
- errx(2, "%s", re_error);
- }
+ pattern[i].len, cflags) == 0)
+ continue;
+#endif
+ c = regcomp(&r_pattern[i], pattern[i].pat, cflags);
+ if (c != 0) {
+ regerror(c, &r_pattern[i], re_error,
+ RE_ERROR_BUF);
+ errx(2, "%s", re_error);
}
}
diff --git a/usr.bin/grep/grep.h b/usr.bin/grep/grep.h
index c82e6bb..ea17af40 100644
--- a/usr.bin/grep/grep.h
+++ b/usr.bin/grep/grep.h
@@ -36,7 +36,9 @@
#include <stdio.h>
#include <zlib.h>
+#ifndef WITHOUT_FASTMATCH
#include "fastmatch.h"
+#endif
#ifdef WITHOUT_NLS
#define getstr(n) errstr[n]
@@ -127,7 +129,9 @@ extern unsigned int dpatterns, fpatterns, patterns;
extern struct pat *pattern;
extern struct epat *dpattern, *fpattern;
extern regex_t *er_pattern, *r_pattern;
+#ifndef WITHOUT_FASTMATCH
extern fastmatch_t *fg_pattern;
+#endif
/* For regex errors */
#define RE_ERROR_BUF 512
diff --git a/usr.bin/grep/util.c b/usr.bin/grep/util.c
index 285f883..8815d4f 100644
--- a/usr.bin/grep/util.c
+++ b/usr.bin/grep/util.c
@@ -49,7 +49,9 @@ __FBSDID("$FreeBSD$");
#include <wchar.h>
#include <wctype.h>
+#ifndef WITHOUT_FASTMATCH
#include "fastmatch.h"
+#endif
#include "grep.h"
static int linesqueued;
@@ -317,10 +319,12 @@ procline(struct str *l, int nottext)
for (i = 0; i < patterns; i++) {
pmatch.rm_so = st;
pmatch.rm_eo = l->len;
+#ifndef WITHOUT_FASTMATCH
if (fg_pattern[i].pattern)
r = fastexec(&fg_pattern[i],
l->dat, 1, &pmatch, leflags);
else
+#endif
r = regexec(&r_pattern[i], l->dat, 1,
&pmatch, leflags);
r = (r == 0) ? 0 : REG_NOMATCH;
@@ -332,7 +336,11 @@ procline(struct str *l, int nottext)
(size_t)pmatch.rm_eo != l->len)
r = REG_NOMATCH;
/* Check for whole word match */
+#ifndef WITHOUT_FASTMATCH
if (r == 0 && (wflag || fg_pattern[i].word)) {
+#else
+ if (r == 0 && wflag) {
+#endif
wchar_t wbegin, wend;
wbegin = wend = L' ';
OpenPOWER on IntegriCloud