summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNorihiro Tanaka <noritnk@kcn.ne.jp>2014-04-03 22:57:09 +0900
committerPaul Eggert <eggert@cs.ucla.edu>2014-04-22 23:55:18 -0700
commit73893ffbada36599fb6ec2eb489b6a7decf0c248 (patch)
tree4068f355f96cc74d955ed75e2a4e436853ddad93 /src
parentc7ea5aea911b950b2398454ca89cce23cabd3a40 (diff)
downloadgrep-73893ffbada36599fb6ec2eb489b6a7decf0c248.tar.gz
grep: speed-up by using memchr() in Boyer-Moore searching
memchr() of glibc is faster than seeking by delta1 on some platforms. When there is no chance to match for a while, use it on them. * src/kwset.c (bmexec): Use memchr() in Boyer-Moore searching.
Diffstat (limited to 'src')
-rw-r--r--src/kwset.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/kwset.c b/src/kwset.c
index 69b0a55e..78fb0b21 100644
--- a/src/kwset.c
+++ b/src/kwset.c
@@ -582,8 +582,27 @@ bmexec (kwset_t kwset, char const *text, size_t size)
d = d1[U(tp[-1])], tp += d;
if (d == 0)
goto found;
- d = d1[U(tp[-1])], tp += d;
- d = d1[U(tp[-1])], tp += d;
+ /* memchar() of glibc is faster than seeking by delta1 on
+ some platforms. When there is no chance to match for a
+ while, use it on them. */
+#if defined(__GLIBC__) && (defined(__i386__) || defined(__x86_64__))
+ if (!trans)
+ {
+ tp = memchr (tp - 1, gc1, size + text - tp + 1);
+ if (tp)
+ {
+ ++tp;
+ goto found;
+ }
+ else
+ return -1;
+ }
+ else
+#endif
+ {
+ d = d1[U(tp[-1])], tp += d;
+ d = d1[U(tp[-1])], tp += d;
+ }
}
break;
found: