14 const static int _verbose = 0;
15 typedef uint16_t state_t;
21 static const uint16_t MATCHED = (uint16_t)-1;
27 typedef NextState StateSet;
32 for (
int i = 0; i < pattern.
length(); i++) {
33 if (c_pattern.
size() <= state)
34 c_pattern.
resize(state + 1);
36 if (i + 1 == pattern.
length())
39 next_state = state + 1;
40 if (pattern[i] ==
'\\') {
41 if (pattern[i + 1] ==
'\\') {
46 }
else if (pattern[i] ==
'*') {
47 for (
int j = 0; j < 256; j ++) {
48 if (next_state == MATCHED)
49 c_pattern[state].next[j] = MATCHED;
51 c_pattern[state].next[j] = state;
56 c_pattern[state].next[pattern[i]] = next_state;
64 int add_pattern(
String pattern) {
65 int prevsz = vector.
size();
68 click_chatter(
"Adding pattern %s",pattern.
c_str());
71 click_chatter(
"Compiled :");
75 if (c_pattern.
size() > 1) {
76 create_states(c_pattern,prevsz);
77 next_state = prevsz - 1;
81 for (
int j = 0; j < prevsz; j++) {
82 attach(c_pattern,j, c_pattern[0], next_state);
85 click_chatter(
"Final:");
91 void attach(
Vector<StateSet> c_pattern, state_t state, NextState nt,
int pos) {
92 for (
int j = 0; j < 256; j++) {
93 state_t p = nt.next[j];
95 state_t n = vector[state].next[j];
99 vector[state].next[j] = MATCHED;
107 attach(c_pattern, n, c_pattern[nt.next[j]], pos);
109 vector[state].next[j] = nt.next[j] + pos;
116 for (
int i = 1; i < c_pattern.
size(); i++) {
117 if (vector.
size() <= state)
119 for (
int j = 0; j < 256; j++) {
120 if (c_pattern[i].next[j]) {
121 if (c_pattern[i].next[j] == MATCHED) {
122 vector[state].next[j] = MATCHED;
124 vector[state].next[j] = place - 1 + c_pattern[i].next[j];
132 inline void next(
const unsigned char& c, state_t &state) {
133 state = vector[state].next[c];
136 inline void next_chunk(
const unsigned char*& c,
const int& size, state_t &state) {
137 for (
int i = 0; i < size; i++) {
138 state = vector[state].next[*(c + i)];
139 if (state == MATCHED)
145 for (
int i = 0; i < v.
size(); i ++) {
146 click_chatter(
"S%d",i);
147 for (
int j = 0 ; j < 256; j ++) {
149 click_chatter(
" %d - %c : %d",j,(
char)j, v[i].next[j]);