# HG changeset patch # User Masataka Kohagura # Date 1453455424 -32400 # Node ID 96c2507fd22dfb5f30eaa0c8fe8446c384818b81 # Parent 58de1744d7a9c530a98476956bacbdc7b494a1a7 fix diff -r 58de1744d7a9 -r 96c2507fd22d regexParser/threadedSearch.cc --- a/regexParser/threadedSearch.cc Thu Jan 21 19:57:48 2016 +0900 +++ b/regexParser/threadedSearch.cc Fri Jan 22 18:37:04 2016 +0900 @@ -1,18 +1,25 @@ +#include +#include + #include "regexParser.h" #include "subsetConstruction.h" struct tsValue; -typedef struct tState { - State *state; - void stateSkip(struct tsValue); - int ccvSize; - struct ccv{ +typedef struct ccv { unsigned long begin; unsigned long end; BitVector state; struct tState *tState; - } *ccv; +} *CCV; + +void stateSkip(TSValue tsv); + +typedef struct tState { + State *state; + void stateSkip(tsValue); + int ccvSize; + CCV ccv; } TState, *TStatePtr; typedef struct result { @@ -24,6 +31,7 @@ typedef struct tsValue { Buffer buff; ResultPtr result; + State *stateArray; TState *current; TState *blockBegin; TState *blockEnd; @@ -34,9 +42,35 @@ tsv.current->stateSkip(tsv); } +TStatePtr generateTState(State state) { + TStatePtr tState = NEW(TState); + int ccvSize = 0; + CharClassWalkerPtr ccw = createCharClassWalker(state.cc); + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + ccvSize++; + } + if (ccvSize == 0) return tState; + else tState->ccv = (ccv*)malloc(sizeof(ccv)*ccvSize); + ccw = createCharClassWalker(state.cc); + int i = 0; + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + unsigned long begin = cc->cond.range.begin; + unsigned long end = cc->cond.range.end; + struct ccv *ccv = &tState->ccv[i++]; + ccv->begin = begin; + ccv->end = end; + ccv->tState = NULL; + ccv->state = cc->nextState; + } + free(ccw); + return tState; +} + void tSearch(TSValue tsv) { - next: while (buff.buffptr < buff.buffend) { - unsigned char c = *buff.buffptr++; + next: while (tsv.buff.buffptr < tsv.buff.buffend) { + unsigned char c = *tsv.buff.buffptr++; for (int i = 0; i < tsv.current->ccvSize; i++) { if (cccv[i].begin) tsv.current->stateSkip(tsv); else if (c<=tsv.current->ccv[i].end) { @@ -52,28 +86,3 @@ tsv.current->stateSkip(tsv); } } - -TStatePtr generateTState(StatePtr state) { - TState tState = NEW(TState); - int ccvSize = 0; - CharClassWalkerPtr ccw = createCharClassWalker(state->cc); - while (hasNext(ccw)) { - CharClassPtr cc = getNext(ccw); - ccvSize++; - } - if (ccvSize == 0) return tState; - else tState->ccv = (struct ccv*)malloc(sizeof(struct ccv)*ccvSize); - CharClassWalkerPtr ccw = createCharClassWalker(state->cc); - while (hasNext(ccw)) { - CharClassPtr cc = getNext(ccw); - unsigned long begin = cc->cond.range.begin; - unsigned long end = cc->cond.range.end; - struct ccv *ccv = &tState->ccv[i++]; - ccv->begin = begin; - ccv->end = end; - ccv->tState = NULL; - ccv->state = cc->nextState; - } - free(ccw); - return tState; -}