(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / System / System.Text.RegularExpressions / quicksearch.cs
blob7f4e76aab871b0d1803962ff83bf20521c09e2e3
1 //
2 // assembly: System
3 // namespace: System.Text.RegularExpressions
4 // file: quicksearch.cs
5 //
6 // Authors: Dan Lewis (dlewis@gmx.co.uk)
7 // Juraj Skripsky (juraj@hotfeet.ch)
8 //
9 // (c) 2002 Dan Lewis
10 // (c) 2003 Juraj Skripsky
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 //
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 //
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System;
35 using System.Collections;
37 namespace System.Text.RegularExpressions {
38 internal class QuickSearch {
39 // simplified boyer-moore for fast substring matching
40 // (for short strings, we use simple scans)
41 public QuickSearch (string str, bool ignore)
42 : this(str, ignore, false)
46 public QuickSearch (string str, bool ignore, bool reverse) {
47 this.str = str;
48 this.len = str.Length;
49 this.ignore = ignore;
50 this.reverse = reverse;
52 if (ignore)
53 str = str.ToLower ();
55 // create the shift table only for "long" search strings
56 if(len > THRESHOLD)
57 SetupShiftTable ();
60 public string String {
61 get { return str; }
64 public int Length {
65 get { return len; }
68 public bool IgnoreCase {
69 get { return ignore; }
72 public int Search (string text, int start, int end) {
73 int ptr = start;
76 if ( reverse )
78 if (start < end)
79 return -1;
81 if ( ptr > text.Length)
83 ptr = text.Length;
86 // use simple scan for a single-character search string
87 if (len == 1)
89 while (--ptr >= end)
91 if(str[0] == GetChar(text[ptr]))
92 return ptr ;
95 return -1;
99 if ( end < len)
100 end = len - 1 ;
102 ptr--;
103 while (ptr >= end)
105 int i = len -1 ;
106 while (str[i] == GetChar(text[ptr - len +1 + i]))
108 if (-- i < 0)
109 return ptr - len + 1;
112 if (ptr > end)
114 ptr -= GetShiftDistance (text[ptr - len ]);
117 else
118 break;
122 else
124 // use simple scan for a single-character search string
125 if (len == 1)
127 while (ptr <= end)
129 if(str[0] == GetChar(text[ptr]))
130 return ptr;
131 else
132 ptr++;
134 return -1;
137 if (end > text.Length - len)
138 end = text.Length - len;
140 while (ptr <= end)
142 int i = len - 1;
143 while (str[i] == GetChar(text[ptr + i]))
145 if (-- i < 0)
146 return ptr;
149 if (ptr < end)
150 ptr += GetShiftDistance (text[ptr + len]);
151 else
152 break;
156 return -1;
160 // private
162 private void SetupShiftTable () {
163 shift = new Hashtable ();
164 if (reverse)
166 for (int i = len ; i > 0; -- i)
168 char c = str[i -1];
169 shift[GetChar(c)] = i;
172 else
174 for (int i = 0; i < len; ++ i)
176 char c = str[i];
177 shift[GetChar(c)] = len - i;
183 private int GetShiftDistance (char c) {
184 if(shift == null)
185 return 1;
187 object s = shift[c];
188 return (s != null ? (int)s : len + 1);
191 private char GetChar(char c) {
192 return (!ignore ? c : Char.ToLower(c));
195 private string str;
196 private int len;
197 private bool ignore;
198 private bool reverse;
200 private Hashtable shift;
201 private readonly static int THRESHOLD = 5;