Index: head/share/man/man5/src.conf.5 =================================================================== --- head/share/man/man5/src.conf.5 +++ head/share/man/man5/src.conf.5 @@ -1,6 +1,6 @@ .\" DO NOT EDIT-- this file is generated by tools/build/options/makeman. .\" $FreeBSD$ -.Dd April 19, 2017 +.Dd April 21, 2017 .Dt SRC.CONF 5 .Os .Sh NAME @@ -215,6 +215,11 @@ .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 Index: head/share/mk/src.opts.mk =================================================================== --- head/share/mk/src.opts.mk +++ head/share/mk/src.opts.mk @@ -62,6 +62,7 @@ BOOTPARAMD \ BOOTPD \ BSD_CPIO \ + BSD_GREP_FASTMATCH \ BSDINSTALL \ BSNMP \ BZIP2 \ Index: head/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH =================================================================== --- head/tools/build/options/WITHOUT_BSD_GREP_FASTMATCH +++ head/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 . Index: head/usr.bin/grep/Makefile =================================================================== --- head/usr.bin/grep/Makefile +++ head/usr.bin/grep/Makefile @@ -15,10 +15,14 @@ .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 Index: head/usr.bin/grep/grep.h =================================================================== --- head/usr.bin/grep/grep.h +++ head/usr.bin/grep/grep.h @@ -36,7 +36,9 @@ #include #include +#ifndef WITHOUT_FASTMATCH #include "fastmatch.h" +#endif #ifdef WITHOUT_NLS #define getstr(n) errstr[n] @@ -127,7 +129,9 @@ 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 Index: head/usr.bin/grep/grep.c =================================================================== --- head/usr.bin/grep/grep.c +++ head/usr.bin/grep/grep.c @@ -49,7 +49,9 @@ #include #include +#ifndef WITHOUT_FASTMATCH #include "fastmatch.h" +#endif #include "grep.h" #ifndef WITHOUT_NLS @@ -86,7 +88,9 @@ 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; @@ -715,20 +719,25 @@ 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); } } Index: head/usr.bin/grep/util.c =================================================================== --- head/usr.bin/grep/util.c +++ head/usr.bin/grep/util.c @@ -49,7 +49,9 @@ #include #include +#ifndef WITHOUT_FASTMATCH #include "fastmatch.h" +#endif #include "grep.h" static int linesqueued; @@ -317,10 +319,12 @@ 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 @@ (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' ';