# HG changeset patch # User Ryoma SHINYA # Date 1289151973 -32400 # Node ID 2ad03c243524a5f11aed9eeab31aaa305ab066eb # Parent a6a0504dea7b31746e7ea66c5881599d5677c957 modify filtering algorithm, from boyer-moore-horspool to quick-search. diff -r a6a0504dea7b -r 2ad03c243524 pyrect/translator/grep_translator.py --- 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;")