# HG changeset patch # User Shinji KONO # Date 1454983162 -32400 # Node ID c9ac6f06e7066f1c9d65cce714ddb460d136b34c # Parent 1d79e61a9365cd8cb2520c33f003bfd368072757 add loop diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/CeriumGrep.cc --- a/regexParser/CeriumGrep.cc Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/CeriumGrep.cc Tue Feb 09 10:59:22 2016 +0900 @@ -8,12 +8,13 @@ #include "grepWalk.h" #include "fileread.h" #include "threadedSearch.h" +#include "generateSequentialSearch.h" Search grep(int argc,char **argv,bool parallel) { bool generate = true; bool subset = false; - bool generateSequentialSearch = false; + void (*generateSequentialSearch)(TransitionGeneratorPtr) = NULL; bool ts = false; char *filename = NULL; Search s; @@ -30,7 +31,11 @@ } else if (strcmp(argv[i],"-subset") == 0) { subset = true; } else if (strcmp(argv[i],"-seq") == 0) { - generateSequentialSearch = true; + generateSequentialSearch = exportState; + } else if (strcmp(argv[i],"-loop") == 0) { + generateSequentialSearch = exportStateLoop; + } else if (strcmp(argv[i],"-cbc") == 0) { + generateSequentialSearch = exportStateCbC; } else if (strcmp(argv[i],"-file") == 0) { s.filename = filename = argv[i+1]; i++; } else if (strcmp(argv[i],"-ts") == 0) { @@ -56,7 +61,7 @@ subsetConstruction(tgv.tg); // Determinization printState(tgv.tg); if (generateSequentialSearch) { - exportState(tgv.tg); + generateSequentialSearch(tgv.tg); } } diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/Makefile --- a/regexParser/Makefile Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/Makefile Tue Feb 09 10:59:22 2016 +0900 @@ -7,7 +7,7 @@ AR= libCeriumGrep.a SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = sequentialSearch.cc state.cc parallelSearch.cc taskInit.cc searchTask.cc main.cc stateCbC.cc sequentialSearchCbC.cc generateSequentialSearchCbC.cc sequentialSearch.cc generateSequentialSearch.cc +SRCS_EXCLUDE = sequentialSearch.cc state.cc parallelSearch.cc taskInit.cc searchTask.cc main.cc stateCbC.cc sequentialSearchCbC.cc SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) @@ -26,11 +26,8 @@ all: $(TARGET) -regexParser: $(OBJS) main.o sequentialSearch.o generateSequentialSearch.o - $(CC) $(CFLAGS) -o $@ $(OBJS) main.o generateSequentialSearch.o - -regexParserCbC: $(OBJS) main.o generateSequentialSearchCbC.o - $(CbC) $(CFLAGS) -o $@ $(OBJS) main.o generateSequentialSearchCbC.o +regexParser: $(OBJS) main.o $(AR) + $(CC) $(CFLAGS) -o $@ $(AR) main.o test/searchBit: test/searchBit.cc $(CC) $(CFLAGS) $< bitVector.cc -o $@ @@ -55,7 +52,7 @@ clean: rm -f $(TARGET) $(OBJS) $(AR) - rm -rf *~ \#* *.gcda *.gcno *.gcov state.cc sequentialSearch *.dSYM *.o stateCbC.cc sequentialSearchCbC + rm -rf *~ \#* *.gcda *.gcno *.gcov state.cc sequentialSearch *.dSYM *.o stateCbC.cc sequentialCbC cd test; rm -rf *.o *~ \#* *.gcda *.gcno *.gcov *.dSYM cd cerium; make clean touch state.cc stateCbC.cc @@ -71,23 +68,27 @@ test2: regexParser $(TESTFILE) ./regexParser $(SUBSET) -regex $(REGEX)-file $(TESTFILE) $(WC) -seqtest: sequentialSearch $(TESTFILE) - ./sequentialSearch -file $(TESTFILE) $(WC) - grepWalk: regexParser $(TESTFILE) ./regexParser $(SUBSET) -regex $(REGEX) -file $(TESTFILE) $(WC) -sequentialSearch: sequentialSearch.cc regexParser fileread.o +sequentialSearch: sequentialSearch.cc regexParser $(AR) $(TESTFILE) ./regexParser -seq -subset -regex $(REGEX) $(CC) $(SEQCFLAGS) -c sequentialSearch.cc - $(CC) $(SEQDFLAGS) sequentialSearch.o generateSequentialSearch.o $(OBJS) -o $@ - - ./$@ -file $(TESTFILE) + $(CC) $(SEQDFLAGS) sequentialSearch.o $(AR) -o $@ + - ./$@ -file $(TESTFILE) $(WC) -sequentialSearchCbC: sequentialSearchCbC.cc regexParserCbC fileread.o $(TESTFILE) - ./regexParserCbC -seq -subset -regex $(REGEX) +sequentialLoop: sequentialSearch.cc regexParser $(AR) $(TESTFILE) + ./regexParser -loop -subset -regex $(REGEX) + $(CC) $(SEQCFLAGS) -c sequentialSearch.cc + $(CC) $(SEQDFLAGS) sequentialSearch.o $(AR) -o $@ + - ./$@ -file $(TESTFILE) $(WC) + + +sequentialCbC: sequentialSearchCbC.cc regexParser $(AR) $(TESTFILE) + ./regexParserCbC -cbc -subset -regex $(REGEX) $(CbC) $(SEQCFLAGS) -O1 -c sequentialSearchCbC.cc - $(CbC) $(SEQDFLAGS) sequentialSearchCbC.o generateSequentialSearchCbC.o $(OBJS) -o $@ - - ./$@ -file $(TESTFILE) + $(CbC) $(SEQDFLAGS) sequentialSearchCbC.o $(AR) -o $@ + - ./$@ -file $(TESTFILE) $(WC) test1: regexParser ./regexParser -regex 'a' diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/cerium/Makefile.def --- a/regexParser/cerium/Makefile.def Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/cerium/Makefile.def Tue Feb 09 10:59:22 2016 +0900 @@ -4,7 +4,7 @@ # ex linux/ps3 -OPT = -g -O0 +OPT = -g -O CC = clang++ CFLAGS = -I.. -m64 -Wall $(OPT) diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/generateLoop.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/generateLoop.cc Tue Feb 09 10:59:22 2016 +0900 @@ -0,0 +1,75 @@ +#include +#include + +#include "generateSequentialSearch.h" +#include "CharClass.h" +#include "subsetConstruction.h" + + +static void +generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { + + fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum); + if (accept && state->accept) { + fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp); + } + fputs(" if (tsv.buff.buffptr >= tsv.buff.buffend) return tsv;\n",fp); + CharClassWalkerPtr ccw = createCharClassWalker(state->cc); + if (hasNext(ccw)) fputs(" unsigned char c = *tsv.buff.buffptr++;\n",fp); + fputs(" if (0) ;\n",fp); + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + unsigned long begin = cc->cond.range.begin; + unsigned long end = cc->cond.range.end; + BitVector bi = cc->nextState; + if (begin == end) { + fprintf(fp," else if (c=='%c') { tsv.current=(TState*)state%lx;}\n",(unsigned char)begin, bi.bitContainer); + } else { + fprintf(fp," else if (c<'%c') { tsv=tsv.tg->stateSkip(tsv);tsv.current=(TState*) state0;}\n",(unsigned char)begin); + fprintf(fp," else if (c<='%c') { tsv.current=(TState*) state%lx;} \n",(unsigned char)end, bi.bitContainer); + } + } + free(ccw); + fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); tsv.current=(TState*)state0; }\n return tsv;\n"); + fputs("}\n\n",fp); +} + +void +exportStateLoop(TransitionGeneratorPtr tg) { + StatePtr state = tg->stateList; + FILE *fp = fopen("state.cc","w"); + if (fp==NULL) { + perror(""); + fprintf(stderr,"cannot write state.cc\n"); + exit(1); + } + fprintf(fp,"static TSValue state%lx(TSValue tsv) ;\n",0); + for (;state;state = state->next) { + if (state->bitState.bitContainer!=1) // state1 always unused but state0 + fprintf(fp,"static TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer); + } + fputs("\n",fp); + + fprintf(fp, +"\n" +"static TSValue \n" +"stateLoop(TSValue tsv) {\n" +" tsv.current = (TState*)state0;\n" +" while(tsv.buff.buffptr < tsv.buff.buffend) {\n" +" TSValue (*next)(TSValue) = (TSValue (*)(TSValue))tsv.current;\n" +" tsv = next(tsv);\n" +" }\n" +" return tsv;\n" +"}\n\n" ); + + + // initial state must not accept empty string + generateState1(tg->stateList,0L,false,fp,tg); + for (state = tg->stateList;state;state = state->next) { + if (state->bitState.bitContainer!=1) // state1 always unused but state0 + generateState1(state,state->bitState.bitContainer,true,fp,tg); + } + fprintf(fp,"#define state0 stateLoop\n"); + fclose(fp); +} + diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/generateSequentialSearch.cc --- a/regexParser/generateSequentialSearch.cc Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/generateSequentialSearch.cc Tue Feb 09 10:59:22 2016 +0900 @@ -5,9 +5,9 @@ #include "CharClass.h" #include "subsetConstruction.h" -void +static void generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { - fprintf(fp,"TSValue state%lx(TSValue tsv) {\n",stateNum); + fprintf(fp,"static TSValue state%lx(TSValue tsv) {\n",stateNum); if (accept && state->accept) { fputs(" tsv=tsv.tg->stateMatch(tsv);\n",fp); } @@ -30,7 +30,7 @@ free(ccw); fprintf(fp," else { tsv=tsv.tg->stateSkip(tsv); return state0(tsv);}\n"); fputs("}\n\n",fp); -} +} void exportState(TransitionGeneratorPtr tg) { @@ -42,13 +42,17 @@ exit(1); } for (;state;state = state->next) { - fprintf(fp,"TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer); + if (state->bitState.bitContainer!=1) // state1 always unused but state0 + fprintf(fp,"static TSValue state%lx(TSValue tsv);\n",state->bitState.bitContainer); } fputs("\n",fp); // initial state must not accept empty string generateState1(tg->stateList,0L,false,fp,tg); for (state = tg->stateList;state;state = state->next) { - generateState1(state,state->bitState.bitContainer,true,fp,tg); + if (state->bitState.bitContainer!=1) // state1 always unused but state0 + generateState1(state,state->bitState.bitContainer,true,fp,tg); } fclose(fp); } + + diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/generateSequentialSearch.h --- a/regexParser/generateSequentialSearch.h Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/generateSequentialSearch.h Tue Feb 09 10:59:22 2016 +0900 @@ -1,3 +1,5 @@ #include "regexParser.h" extern void exportState(TransitionGeneratorPtr tg); +extern void exportStateLoop(TransitionGeneratorPtr tg); +extern void exportStateCbC(TransitionGeneratorPtr tg); diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/generateSequentialSearchCbC.cc --- a/regexParser/generateSequentialSearchCbC.cc Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/generateSequentialSearchCbC.cc Tue Feb 09 10:59:22 2016 +0900 @@ -5,7 +5,7 @@ #include "subsetConstruction.h" #include "CharClass.h" -void +static void generateState1(StatePtr state,long stateNum, bool accept, FILE *fp, TransitionGeneratorPtr tg) { fprintf(fp,"__code state%lx(TSValue tsv) {\n",stateNum); if (accept && state->accept) { @@ -33,7 +33,7 @@ } void -exportState(TransitionGeneratorPtr tg) { +exportStateCbC(TransitionGeneratorPtr tg) { StatePtr state = tg->stateList; FILE *fp = fopen("stateCbC.cc","w"); if (fp==NULL) { diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/sequentialSearch.cc --- a/regexParser/sequentialSearch.cc Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/sequentialSearch.cc Tue Feb 09 10:59:22 2016 +0900 @@ -7,10 +7,8 @@ #include "fileread.h" #include "threadedSearch.h" +#include "state.cc" -TSValue state0(TSValue ts); - -#include "state.cc" int main(int argc, char **argv) { char *filename; for (int i = 1; i < argc; i++) { diff -r 1d79e61a9365 -r c9ac6f06e706 regexParser/subsetConstruction.h --- a/regexParser/subsetConstruction.h Mon Feb 08 22:12:14 2016 +0900 +++ b/regexParser/subsetConstruction.h Tue Feb 09 10:59:22 2016 +0900 @@ -1,5 +1,4 @@ extern TGValue createTGValue(); -extern void exportState(TransitionGeneratorPtr tg); extern void setState(CharClassPtr cc, BitVector bi); extern StatePtr createState(TGValue tgv,NodePtr n); extern StatePtr createState(TransitionGeneratorPtr tg,BitVector bi);