Mercurial > hg > Applications > Grep
view regexParser/bmSearch.cc @ 324:879dc5d1cb6a default tip
fix
author | mir3636 |
---|---|
date | Fri, 27 May 2016 21:21:09 +0900 |
parents | da02a7258d54 |
children |
line wrap: on
line source
#include <stdlib.h> #include "regexParser.h" #include "CharClass.h" /** * if start node contains only words, Boyer-Moore Search can be used. * if so skip table is created for each word. */ static void create_BMskiptable(BMPtr bm,unsigned char *word,int len) { bm->skip_table = (int*)malloc(sizeof(int)*256); for (int i = 0; i < 256; ++i) { bm->skip_table[i] = len; } for (int j = 0; j < len - 1; ++j) { bm->skip_table[word[j]] = len - j - 1; } } void checkBMSearch(CharClassPtr cc) { // first check there is no Chareclass range CharClassWalkerPtr cw = createCharClassWalker(cc); while (hasNext(cw)) { CharClassPtr cc1 = getNext(cw); if (cc1->cond.w.word == NULL) { free(cw); return; } } free(cw); // make skip table for each word cw = createCharClassWalker(cc); while (hasNext(cw)) { CharClassPtr cc1 = getNext(cw); if (cc1->cond.w.word) { WordPtr w = &cc1->cond.w; while (w) { BMPtr bm = NEW(BM); cc1->cond.w.bm = bm; create_BMskiptable(bm,cc1->cond.w.word,cc1->cond.w.length); w = w->next; } } } free(cw); }