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);
}