# HG changeset patch # User Ryoma SHINYA # Date 1289159254 -32400 # Node ID dd6d2b9e48ad01e61e50a4d81a876c59243574ba # Parent e06786b3c2dcf3b3c77fd0474379dc6d3a5e9241 improvement quick-filtering. diff -r e06786b3c2dc -r dd6d2b9e48ad pyrect/translator/grep_translator.py --- a/pyrect/translator/grep_translator.py Mon Nov 08 03:45:14 2010 +0900 +++ b/pyrect/translator/grep_translator.py Mon Nov 08 04:47:34 2010 +0900 @@ -117,12 +117,14 @@ for i in range(l-1): skip[key[i]] = l-1-i - self.emit("UCHARP tmp;", 2) - self.emit("int i; buf += %d;" % (l-1)) - self.emiti("while ((tmp = buf) < end) {") - self.emiti( "if (%s) {" % - " && ".join(reversed(["*tmp-- == %d" % ord(c) for c in key]))) - self.emit( "goto next;") + self.emit("UCHARP tmp1, *tmp2;", 2) + self.emit("buf += %d;" % (l-1)) + self.emiti("while (buf < end) {") + self.emiti( "if (*buf == %d /*%c*/) {" % (ord(key[-1]), key[-1])) + self.emit( "tmp1 = buf, tmp2 = key+%d;" % (l-1)) + self.emiti( "while (*(--tmp1) == *(--tmp2)) {") + self.emit( "if (tmp2 == key) goto next;") + self.emitd( "}") self.emitd( "}") self.emiti( "switch(*buf) {") for k, v in skip.iteritems(): @@ -166,11 +168,13 @@ for i in range(l): skip[key[i]] = l-i - self.emit("UCHARP tmp, *end_ = end - %d;" % l, 2) - self.emiti("while ((tmp = buf) <= end_) {") - self.emiti( "if (%s) {" % - " && ".join(["*tmp++ == %d" % ord(c) for c in key])) - self.emit( "goto next;") + self.emit("UCHARP tmp1, *tmp2, *end_ = end - %d;" % (l-1), 2) + self.emiti("while (buf < end_) {") + self.emiti( "if (*buf == %d) {" % ord(key[0])) + self.emit( "tmp1 = buf, tmp2 = key;") + self.emiti( "while (*(++tmp1) == *(++tmp2)){") + self.emit( "if (tmp2 == key+%d) goto next;" % (l-1)) + self.emitd( "}") self.emitd( "}") self.emiti( "switch(buf[%d]) {" % l) for k, v in skip.iteritems():