# HG changeset patch # User Shinji KONO # Date 1454475361 -32400 # Node ID 3e78631a6222324f3cb88dd2c639484574d58195 # Parent bdfe0a32c48f870c210714c5fa5a44525f4ad64b remove ragne list diff -r bdfe0a32c48f -r 3e78631a6222 regexParser/node.cc --- a/regexParser/node.cc Wed Feb 03 13:11:10 2016 +0900 +++ b/regexParser/node.cc Wed Feb 03 13:56:01 2016 +0900 @@ -9,14 +9,8 @@ printCharacterClass(cc->left,nodeNumber,d+1); } printf("%*c",d*4, ' '); - for (RangeList range = cc->cond.range; range.begin != 0;) { - printf("[%c-%c] ",(unsigned char)range.begin,(unsigned char)range.end); - if (range.next != NULL) { - range = *range.next; - } else { - break; - } - } + RangeList range = cc->cond.range; + printf("[%c-%c] ",(unsigned char)range.begin,(unsigned char)range.end); printf("(%lx)\n",cc->nextState.bitContainer); if (cc->right) { printCharacterClass(cc->right,nodeNumber,d+1); diff -r bdfe0a32c48f -r 3e78631a6222 regexParser/regexParser.cc --- a/regexParser/regexParser.cc Wed Feb 03 13:11:10 2016 +0900 +++ b/regexParser/regexParser.cc Wed Feb 03 13:56:01 2016 +0900 @@ -45,7 +45,6 @@ cc->cond.w.word = ri->tokenValue; cc->cond.w.length = ri->ptr - ri->tokenValue; cc->cond.range.begin = cc->cond.range.end = *ri->tokenValue; - cc->cond.range.next = NULL; return cc; } @@ -76,8 +75,11 @@ */ CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) { + if (begin>end) { + unsigned long tmp = begin; begin = end; end = tmp; + } if (cc == NULL) { - createCharClassRange(begin,end,0,0,0); + return createCharClassRange(begin,end,0,0,0); } if (end < cc->cond.range.begin ) { // 1 if (cc->left) { @@ -122,38 +124,25 @@ // ::= '[''-'']' static NodePtr charClass(RegexInfoPtr ri) { - CharClassPtr cc = NEW(CharClass); + CharClassPtr cc = NULL; NodePtr n = createNode(ri,'c',cc,0,0); - cc->type = 'r'; - cc->nextState.bitContainer = 0; - cc->left = NULL; - cc->right = NULL; - cc->stateNum = 0; - RangeListPtr rangeList = &cc->cond.range; - rangeList->begin = *ri->ptr; - rangeList->end = *ri->ptr; - rangeList->next = NULL; + unsigned char begin = *ri->ptr; + unsigned char end = *ri->ptr; for (ri->ptr++; *ri->ptr && *ri->ptr != ']'; ri->ptr++) { if (*ri->ptr == '-') { - rangeList->end = *(ri->ptr + 1); + end = *(ri->ptr + 1); + cc = insertCharClass(cc, begin, end); ri->ptr++; continue; + } else { + cc = insertCharClass(cc, begin, end); } if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break; - rangeList->next = NEW(RangeList); - rangeList = rangeList->next; - rangeList->begin = *ri->ptr; - rangeList->end = *ri->ptr; - rangeList->next = NULL; + begin = *ri->ptr; + end = *ri->ptr; } - - RangeListPtr r = cc->cond.range.next; - cc->cond.range.next = 0; - for (; r; r = r->next) { - cc = insertCharClass(cc, r->begin, r->end); - } - cc->cond.range.next = 0; + n->cc = insertCharClass(cc, begin, end); // TODO literal support // merge rangeList here if (*ri->ptr) ri->ptr++; diff -r bdfe0a32c48f -r 3e78631a6222 regexParser/regexParser.h --- a/regexParser/regexParser.h Wed Feb 03 13:11:10 2016 +0900 +++ b/regexParser/regexParser.h Wed Feb 03 13:56:01 2016 +0900 @@ -19,7 +19,6 @@ typedef struct utf8Range { unsigned long begin; unsigned long end; - struct utf8Range *next; // only used in the parser. } RangeList , *RangeListPtr; typedef struct condition { diff -r bdfe0a32c48f -r 3e78631a6222 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Wed Feb 03 13:11:10 2016 +0900 +++ b/regexParser/subsetConstruction.cc Wed Feb 03 13:56:01 2016 +0900 @@ -15,7 +15,6 @@ cc->type = 'r'; cc->cond.range.begin = begin; cc->cond.range.end = end; - cc->cond.range.next = NULL; cc->cond.w.word = NULL; cc->cond.w.length = 0; cc->left = left;