# HG changeset patch # User Shinji KONO # Date 1454258112 -32400 # Node ID f2491681914e66dd26bf4aec09d5067fb1f02302 # Parent 2f3e7bba038edbd02a36234d083f23491f26cb2a special state for start search diff -r 2f3e7bba038e -r f2491681914e regexParser/cerium/CeriumMain.cc --- a/regexParser/cerium/CeriumMain.cc Sun Jan 31 22:59:59 2016 +0900 +++ b/regexParser/cerium/CeriumMain.cc Mon Feb 01 01:35:12 2016 +0900 @@ -29,7 +29,7 @@ static TSValue stateSkip(TSValue tsv) { - tsv.current = tsv.tg->stateList->tState; + tsv.current = tsv.tg->stateStart->tState; tsv.buff.matchBegin = tsv.buff.buffptr; return tsv; } @@ -43,7 +43,6 @@ *tsv.resultEnd = r; r->next = NULL; tsv.resultEnd = &r->next; - tsv.current = tsv.tg->stateList->tState; tsv.buff.buffptr--; tsv = stateSkip(tsv); return tsv; @@ -63,7 +62,8 @@ return prev; } -void ceriumCreateAnyState(TransitionGeneratorPtr tg) { +void +ceriumCreateAnyState(TransitionGeneratorPtr tg) { tg->stateSkip = stateSkip; tg->stateMatch = stateMatch; tg->stateNothing = stateNothing; @@ -71,6 +71,10 @@ generateTState(tg->anyState,tg); // generateTState for startState. It is used in stateMatch. generateTState(tg->stateList,tg); + tg->stateStart = NEW(State); + *tg->stateStart = *tg->stateList; + tg->stateStart->accept = false; // Start state never accept + generateTState(tg->stateStart,tg); } int diff -r 2f3e7bba038e -r f2491681914e regexParser/cerium/ppe/Exec.cc --- a/regexParser/cerium/ppe/Exec.cc Sun Jan 31 22:59:59 2016 +0900 +++ b/regexParser/cerium/ppe/Exec.cc Mon Feb 01 01:35:12 2016 +0900 @@ -15,7 +15,7 @@ tsv.buff = buff; tsv.tg = tg; if (task_spawned == 0) { - tsv.current = tg->stateList->tState; + tsv.current = tg->stateStart->tState; } else { tsv.current = tg->anyState->tState; } diff -r 2f3e7bba038e -r f2491681914e regexParser/generateSequentialSearch.cc --- a/regexParser/generateSequentialSearch.cc Sun Jan 31 22:59:59 2016 +0900 +++ b/regexParser/generateSequentialSearch.cc Mon Feb 01 01:35:12 2016 +0900 @@ -39,7 +39,7 @@ if (begin == end) { fprintf(fp,"if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer); } else { - if (state->bitState.bitContainer & 2) { + if (state->accept) { fprintf(fp,"if (c<'%c') stateMatch(buff);\n",(unsigned char)begin); } else { fprintf(fp,"if (c<'%c') stateSkip(buff);\n",(unsigned char)begin); diff -r 2f3e7bba038e -r f2491681914e regexParser/regexParser.h --- a/regexParser/regexParser.h Sun Jan 31 22:59:59 2016 +0900 +++ b/regexParser/regexParser.h Mon Feb 01 01:35:12 2016 +0900 @@ -94,6 +94,7 @@ long totalBasicState; StateStackPtr stack; StatePtr stateEnd; + StatePtr stateStart; // start state without accept flag StatePtr *stateArray; StatePtr stateList; StatePtr anyState; @@ -121,7 +122,7 @@ typedef struct tgValue { StatePtr asterisk; // last * state of the expression - StatePtr startState; + StatePtr startState; // startState of the expression StatePtr endState; TransitionGeneratorPtr tg; } TGValue, *TGValuePtr; diff -r 2f3e7bba038e -r f2491681914e regexParser/threadedSearch.cc --- a/regexParser/threadedSearch.cc Sun Jan 31 22:59:59 2016 +0900 +++ b/regexParser/threadedSearch.cc Mon Feb 01 01:35:12 2016 +0900 @@ -12,7 +12,7 @@ static TSValue stateSkip(TSValue tsv) { - tsv.current = tsv.tg->stateList->tState; + tsv.current = tsv.tg->stateStart->tState; tsv.buff.matchBegin = tsv.buff.buffptr; return tsv; } @@ -21,7 +21,6 @@ TSValue stateMatch(TSValue tsv) { fwrite(tsv.buff.matchBegin,tsv.buff.buffptr-tsv.buff.matchBegin-1,1,stdout); puts(""); - tsv.current = tsv.tg->stateList->tState; tsv.buff.buffptr--; tsv = stateSkip(tsv); return tsv; @@ -37,7 +36,7 @@ ccvSize++; } tState->ccvSize = ccvSize; - if (state->accept) { + if (state->accept && state != tg->stateList ) { tState->stateSkip = tg->stateMatch; tState->stateContinue = tg->stateNothing; } else { @@ -123,5 +122,10 @@ tsv.tg->stateMatch = stateMatch; tsv.tg->stateNothing = stateNothing; tsv.current = generateTState(tg->stateList,tg); + tg->stateStart = NEW(State); + *tg->stateStart = *tg->stateList; + tg->stateStart->accept = false; // Start state never accept + generateTState(tg->stateStart,tg); + tSearch(tsv); }