diff options
-rw-r--r-- | share/man/man5/src.conf.5 | 7 | ||||
-rw-r--r-- | share/mk/src.opts.mk | 1 | ||||
-rw-r--r-- | tools/build/options/WITHOUT_BSD_GREP_FASTMATCH | 5 | ||||
-rw-r--r-- | usr.bin/grep/Makefile | 6 | ||||
-rw-r--r-- | usr.bin/grep/grep.c | 25 | ||||
-rw-r--r-- | usr.bin/grep/grep.h | 4 | ||||
-rw-r--r-- | usr.bin/grep/util.c | 8 |
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' '; |