# HG changeset patch # User Ryoma SHINYA # Date 1289396913 -32400 # Node ID 68cefeb3bee1c387500666826480804a99e70fc4 # Parent 3dc381c908708a42d6c02e56993469f6b6375baf experimentation, use table-lookup at first state's transition. diff -r 3dc381c90870 -r 68cefeb3bee1 pyrect/translator/grep_translator.py --- a/pyrect/translator/grep_translator.py Wed Nov 10 22:00:24 2010 +0900 +++ b/pyrect/translator/grep_translator.py Wed Nov 10 22:48:33 2010 +0900 @@ -43,21 +43,20 @@ def emit_initialization(self): self.emit("#include ") - self.emit("#define GREP grep") self.emit("#include ") self.emit("#include ") self.emit("#include ") self.emit("#include ") self.emit("#include ") self.emit("#include ") - self.emit("#include ") + self.emit("#include ", 2) self.emit("typedef unsigned char UCHAR;") - self.emit("typedef unsigned char *UCHARP;") + self.emit("typedef unsigned char *UCHARP;", 2) self.emit('void reject(%s);' % self.interface) - self.emit("void matcher(%s);" % self.interface, 2) - self.emit('void accept(%s);' % self.interface) + self.emit("void matcher(%s);" % self.interface) + self.emit('void accept(%s);' % self.interface, 2) key = None @@ -86,6 +85,15 @@ else: self.skip_boost = False + self.emiti("void (*first_state_tbl[256])(UCHARP, UCHARP, UCHARP) = {") + tbl = ["booster"] * 256 + for c, n in self.cg.map[self.cg.start].iteritems(): + if type(c) != Character: continue + else: tbl[c.char] = self.state_name(n) + tbl[0] = tbl[10] = tbl[13] = "reject" + self.emit(", ".join(tbl)) + self.emitd("};", 2) + grepsource = open(self.BASE_DIR + "/template/grep.c") self.emit(grepsource.read()) @@ -210,7 +218,7 @@ else: self.emit( "%s(%s);" % (self.state_name(self.cg.start), self.args)) self.emit( "return;") - self.emitd("}") + self.emitd("}", 2) return def emit_accept_state(self): @@ -258,6 +266,11 @@ self.emitd("}", 2) return + if cur_state == self.cg.start: + self.emit( "return first_state_tbl[*buf++](%s);" % self.args) + self.emitd("}", 2) + return + default = self.state_name(self.cg.start) for eol in self.eols: transition[eol] = "reject" diff -r 3dc381c90870 -r 68cefeb3bee1 pyrect/translator/template/grep.c --- a/pyrect/translator/template/grep.c Wed Nov 10 22:00:24 2010 +0900 +++ b/pyrect/translator/template/grep.c Wed Nov 10 22:48:33 2010 +0900 @@ -53,7 +53,7 @@ fprintf(stderr, "can't open %s:", argv[i]); continue; } - GREP(argv[1], fd, argc > 3 ? argv[i] : NULL); + grep(argv[1], fd, argc > 3 ? argv[i] : NULL); close(fd); } }