protected void Insert (string text, int pattern_no) { if ( idx.Count == 0 ) { State prev = null; for (int i=0; i < text.Length; i++) { State s = new State (text[i]); idx.Add (s); list.Add (s); if (prev != null) prev.next = s.id; prev = s; } prev.final = true; prev.next = -pattern_no; return; } int state = 0; int y = 0; while ( y < text.Length ) { int next = GetNext ((State) idx[state], text[y]); if ( next < 0 ) { AppendSuffix (state, text.Substring(y), pattern_no); return; } else if ( y == text.Length - 1 ) { State s = new State ( ((State) idx[state]).id, text[y]); s.final = true; s.next = -pattern_no; list.Insert ( list.IndexOf(idx[state]), s); return; } state = next; y++; } Console.WriteLine("here we go, not matched: pat {0}", text); }
protected void AppendSuffix (int state, string text, int pattern_no) { State prev = new State(state, text[0]); list.Insert ( list.IndexOf(idx[state]) + 1, prev ); for (int i=1; i<text.Length; i++) { State s = new State(text[i]); list.Add(s); if ( s.id >= idx.Count ) idx.Add (s); prev.next = s.id; prev = s; } prev.final = true; prev.next = -pattern_no; }
protected int GetNext (State state, char value) { int i = list.IndexOf(state); while ( i < list.Count && state.id == ((State) list[i]).id ) if ( value != ((State) list[i]).value || ((State) list[i]).next < 0 ) i++; else return ((State) list[i]).next; return -1; }