summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2016-12-31 16:17:03 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2016-12-31 16:18:42 -0800
commit296f3b994d59006a64fcd1a2398a6b3e13e84e3c (patch)
tree5ca828c7fb3bac13fa89ff810002c2eb1d653286 /src
parentbf2b73acf81dd21e7e587dfd00c3362ff412aa46 (diff)
downloadgrep-296f3b994d59006a64fcd1a2398a6b3e13e84e3c.tar.gz
grep: speed up -x with many patterns
* src/kwsearch.c (Fcompile): Improve buffer allocation overhead with -x and multiple patterns. In the common case where '\n' is the end-of-line byte, avoid copying other than the first and last patterns.
Diffstat (limited to 'src')
-rw-r--r--src/kwsearch.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/kwsearch.c b/src/kwsearch.c
index fedbe329..a36381fe 100644
--- a/src/kwsearch.c
+++ b/src/kwsearch.c
@@ -26,6 +26,8 @@ Fcompile (char const *pattern, size_t size, reg_syntax_t ignored)
{
kwset_t kwset;
size_t total = size;
+ char *buf = NULL;
+ size_t bufalloc = 0;
kwset = kwsinit (true);
@@ -46,23 +48,32 @@ Fcompile (char const *pattern, size_t size, reg_syntax_t ignored)
total = 0;
}
- char *buf = NULL;
if (match_lines)
{
- buf = xmalloc (len + 2);
- buf[0] = eolbyte;
- memcpy (buf + 1, p, len);
- buf[len + 1] = eolbyte;
- p = buf;
+ if (eolbyte == '\n' && pattern < p && sep)
+ p--;
+ else
+ {
+ if (bufalloc < len + 2)
+ {
+ free (buf);
+ bufalloc = len + 2;
+ buf = x2realloc (NULL, &bufalloc);
+ buf[0] = eolbyte;
+ }
+ memcpy (buf + 1, p, len);
+ buf[len + 1] = eolbyte;
+ p = buf;
+ }
len += 2;
}
kwsincr (kwset, p, len);
- free (buf);
p = sep;
}
while (p);
+ free (buf);
kwsprep (kwset);
return kwset;