Mercurial > hg > Members > masakoha > testcode
view regexParser/bmSearch.cc @ 319:7b8234c090f7
bmSearch
author | mir3636 |
---|---|
date | Sun, 08 May 2016 22:53:20 +0900 |
parents | |
children | da02a7258d54 |
line wrap: on
line source
#include "regexPaser.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(CharaClassPtr cc) { // first check there is no Chareclass range CharClassWalkerPtr cw = createCharClassWalker(st->cc); while (hasNext(cw)) { CharClassPtr cc = getNext(cw); if (cc->cond.w.word == NULL) { free(cw); return; } } free(cw); // make skip table for each word cw = createCharClassWalker(st->cc); while (hasNext(cw)) { CharClassPtr cc = getNext(cw); if (cc->cond.w.word) { WordPtr w = &cc->cond.w; while (w) { BMPtr bm = NEW(BM); cc->cond.w.bm = bm; create_BMskiptable(bm,cc->cond.w.word,cc->cond.length); w = w->next; } } } free(cw); }