changeset 74:2ad03c243524

modify filtering algorithm, from boyer-moore-horspool to quick-search.
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Mon, 08 Nov 2010 02:46:13 +0900
parents a6a0504dea7b
children
files pyrect/translator/grep_translator.py
diffstat 1 files changed, 12 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/pyrect/translator/grep_translator.py	Mon Nov 08 02:19:18 2010 +0900
+++ b/pyrect/translator/grep_translator.py	Mon Nov 08 02:46:13 2010 +0900
@@ -88,7 +88,7 @@
             if self.filter_only:
                 self.emit("accept(%s);" % self.args)
             elif self.filter_prefix:
-                self.emit("buf -= %d;" % l)
+                self.emit("buf--;" % l)
                 self.emit("%s(%s);" % (self.state_name(self.cg.start) ,self.args))
             else:
                 self.emit("beg = get_line_beg(buf, beg);")
@@ -97,7 +97,7 @@
 
         self.emit("UCHARP get_line_beg(UCHARP p, UCHARP beg);", 2)
 
-        self.emiti("void bm_filter(%s) {" % self.interface)
+        self.emiti("void quick_filter(%s) {" % self.interface)
         l = len(key)
         if l == 1:
             self.emit("buf = memchr(buf, %d, (end - buf));" % ord(key))
@@ -109,23 +109,21 @@
         self.emit('static UCHAR key[] = "%s";' % key)
 
         skip = dict()
-        for i in range(l-1):
-            skip[key[i]] = l-1-i
+        for i in range(l):
+            skip[key[i]] = l-i
 
         self.emit("UCHARP tmp1, *tmp2;",  2)
-        self.emit("int i; buf += %d;" % (l-1))
-        self.emiti("while (buf < end) {")
-        self.emiti(  "if (*buf == %d /*'%c'*/) {" % (ord(key[l-1]), key[l-1]))
-        self.emit(     "tmp1 = key+%d; tmp2 = buf;" % (l-1))
-        self.emit(     "while (*(--tmp1) == *(--tmp2)) {")
-        self.emit(       "if (tmp1 == key) goto next;")
-        self.emitd(    "}")
+        self.emit("int i;")
+        self.emiti("while (buf <= end - %d) {" % l)
+        self.emit(   "tmp1 = key; tmp2 = buf;")
+        self.emiti(  "while (*tmp1++ == *tmp2++) {")
+        self.emit(     "if (*tmp1 == '\\0') goto next;")
         self.emitd(  "}")
-        self.emiti(  "switch(*buf) {")
+        self.emiti(  "switch(buf[%d]) {" % l)
         for k, v in skip.iteritems():
             self.emiti(  "case %d: /* %s */" % (ord(k), Character.ascii(k)))
             self.emit(     "buf += %d; break;" % v), self.dedent()
-        self.emiti("default: buf += %d;" % l), self.dedent()
+        self.emiti("default: buf += %d;" % (l+1)), self.dedent()
         self.emitd(  "}")
         self.emitd("}")
         self.emit( "return;")
@@ -149,7 +147,7 @@
     def emit_driver(self):
         self.emiti("void matcher(%s) {" % self.interface)
         if self.filter:
-            self.emit(   "%s(%s);" % ("bm_filter", self.args))
+            self.emit(   "%s(%s);" % ("quick_filter", self.args))
         else:
             self.emit(   "%s(%s);" % (self.state_name(self.cg.start), self.args))
         self.emit(   "return;")