view regexParser/bmSearch.cc @ 320:da02a7258d54

fix
author mir3636
date Sun, 08 May 2016 23:31:14 +0900
parents 7b8234c090f7
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);
}