annotate regexParser/bmSearch.cc @ 320:da02a7258d54

fix
author mir3636
date Sun, 08 May 2016 23:31:14 +0900
parents 7b8234c090f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
320
mir3636
parents: 319
diff changeset
1 #include <stdlib.h>
mir3636
parents: 319
diff changeset
2
mir3636
parents: 319
diff changeset
3 #include "regexParser.h"
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
4 #include "CharClass.h"
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
5
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
6 /**
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
7 * if start node contains only words, Boyer-Moore Search can be used.
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
8 * if so skip table is created for each word.
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
9 */
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
10
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
11 static void
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
12 create_BMskiptable(BMPtr bm,unsigned char *word,int len)
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
13 {
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
14 bm->skip_table = (int*)malloc(sizeof(int)*256);
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
15 for (int i = 0; i < 256; ++i) {
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
16 bm->skip_table[i] = len;
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
17 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
18
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
19 for (int j = 0; j < len - 1; ++j) {
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
20 bm->skip_table[word[j]] = len - j - 1;
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
21 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
22 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
23
320
mir3636
parents: 319
diff changeset
24 void checkBMSearch(CharClassPtr cc) {
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
25
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
26 // first check there is no Chareclass range
320
mir3636
parents: 319
diff changeset
27 CharClassWalkerPtr cw = createCharClassWalker(cc);
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
28 while (hasNext(cw)) {
320
mir3636
parents: 319
diff changeset
29 CharClassPtr cc1 = getNext(cw);
mir3636
parents: 319
diff changeset
30 if (cc1->cond.w.word == NULL) {
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
31 free(cw);
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
32 return;
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
33 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
34 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
35 free(cw);
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
36
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
37 // make skip table for each word
320
mir3636
parents: 319
diff changeset
38 cw = createCharClassWalker(cc);
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
39 while (hasNext(cw)) {
320
mir3636
parents: 319
diff changeset
40 CharClassPtr cc1 = getNext(cw);
mir3636
parents: 319
diff changeset
41 if (cc1->cond.w.word) {
mir3636
parents: 319
diff changeset
42 WordPtr w = &cc1->cond.w;
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
43 while (w) {
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
44 BMPtr bm = NEW(BM);
320
mir3636
parents: 319
diff changeset
45 cc1->cond.w.bm = bm;
mir3636
parents: 319
diff changeset
46 create_BMskiptable(bm,cc1->cond.w.word,cc1->cond.w.length);
319
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
47 w = w->next;
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
48 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
49 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
50 }
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
51 free(cw);
7b8234c090f7 bmSearch
mir3636
parents:
diff changeset
52 }