diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2016-12-31 16:17:03 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2016-12-31 16:18:42 -0800 |
commit | 296f3b994d59006a64fcd1a2398a6b3e13e84e3c (patch) | |
tree | 5ca828c7fb3bac13fa89ff810002c2eb1d653286 /src | |
parent | bf2b73acf81dd21e7e587dfd00c3362ff412aa46 (diff) | |
download | grep-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.c | 25 |
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; |