# HG changeset patch # User Masataka Kohagura # Date 1452847991 -32400 # Node ID b4022ba23de54e7647b731c69ea9b5519bba58dc # Parent 0c28ff35b4f042dc70883353ed26bc777fe2b712 add sequentialSearch diff -r 0c28ff35b4f0 -r b4022ba23de5 regexParser/generateSequentialSearch.cc --- a/regexParser/generateSequentialSearch.cc Fri Jan 15 16:47:03 2016 +0900 +++ b/regexParser/generateSequentialSearch.cc Fri Jan 15 17:53:11 2016 +0900 @@ -6,28 +6,29 @@ void exportState(TransitionGeneratorPtr tg) { StatePtr state = tg->stateList; FILE *fp = fopen("state.cc","w"); - fputs("unsigned char *buff, *buffptr, buffend;\n",fp); - fputs( -"void stateSkip() {\n" -" matchBegin = buffptr;\n" -" state1();\n" -"}\n" -"\n" -"void stateMatch() {\n" -" fwrite(matchBegin,buffptr-matchBegin,1,fp);\n" -" fputs(\"\\n\");\n" -" stateSkip();\n" -"}\n" - ,fp); for (;state;state = state->next) { fprintf(fp,"void state%lx();\n",state->bitState.bitContainer); } + + fputs( +"void stateSkip(BufferList buff) {\n" +" buff.matchBegin = buff.buffptr;\n" +" state1(buff);\n" +"}\n" +"\n" +"void stateMatch(BufferList buff) {\n" +" fwrite(buff.matchBegin,buff.buffptr-buff.matchBegin,1,stdout);\n" +" puts(\"\\n\");\n" +" stateSkip(buff);\n" +"}\n" + ,fp); fputs("\n",fp); - for (;state;state = state->next) { - fprintf(fp,"void state%lx() {\n",state->bitState.bitContainer); + for (state = tg->stateList;state;state = state->next) { + fprintf(fp,"void state%lx(BufferList buff) {\n",state->bitState.bitContainer); if (state->bitState.bitContainer == 2) { // Accept - fputs(" // Accept\n",fp); + fputs(" stateMatch(buff);\n",fp); } else { // not Accept + fputs(" if (buff.buffptr >= buff.buffend) return;\n",fp); fputs(" unsigned char c = *buffptr++;\n",fp); CharClassWalkerPtr ccw = createCharClassWalker(state->cc); bool flag = true; @@ -42,16 +43,16 @@ fputs(" else ",fp); } if (begin == end) { - fprintf(fp," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer); + fprintf(fp," if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer); } else { - fprintf(fp," if (c<'%c') state1();\n",(unsigned char)begin); - fprintf(fp," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer); + fprintf(fp," if (c<'%c') stateSkip(buff);\n",(unsigned char)begin); + fprintf(fp," else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer); } } if (state->bitState.bitContainer == 2) { - fprintf(fp," else stateMatch();\n"); + fprintf(fp," else stateMatch(buff);\n"); } else { - fprintf(fp," else stateSkip();\n"); + fprintf(fp," else stateSkip(buff);\n"); } } fputs("}\n\n",fp); diff -r 0c28ff35b4f0 -r b4022ba23de5 regexParser/sequentialSearch.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/sequentialSearch.cc Fri Jan 15 17:53:11 2016 +0900 @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef struct bufferList { + unsigned char buff; + unsigned char buffptr; + unsigned char buffend; + unsigned char matchBegin; +} BufferList, *BufferListPtr; + +typedef struct { + caddr_t file_mmap; + off_t size; +} st_mmap_t; + +#include "state.cc" +int main(int argc, char **argv) { + char *filename; + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i],"-file") == 0) { + filename = argv[i+1]; i++; + } + } + + int map = MAP_PRIVATE; + st_mmap_t st_mmap; + struct stat sb; + int fd; + if ((fd=open(filename,O_RDONLY,0666))==0) { + fprintf(stderr,"can't open %s\n",filename); + } + + if (fstat(fd,&sb)) { + fprintf(stderr,"can't fstat %s\n",filename); + } + st_mmap.size = sb.st_size; + unsigned char *file_mmap = mmap(NULL,st_mmap.size,PROT_WRITE|PROT_READ,map,fd,(off_t)0); + + BufferList buff; + buff.buff = buff.buffptr = buff.matchBegin = file_mmap; + buff.buffend = buff.buff + st_mmap.size; + stateSkip(buff); + close(fd); + return 0; +}