Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xamarin/macdoc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremie Laval <jeremie.laval@gmail.com>2012-02-16 00:43:12 +0400
committerJeremie Laval <jeremie.laval@gmail.com>2012-02-16 00:43:12 +0400
commit1b12047df873e08b5b962199e1bec430027593f7 (patch)
tree4a135b45d629869fb5418907526273f44fdd38b9 /IndexSearcher.cs
parent73e338c85cb92ed385ecb0e898280cfb99046da2 (diff)
[macdoc] Restore index tab
Diffstat (limited to 'IndexSearcher.cs')
-rw-r--r--IndexSearcher.cs108
1 files changed, 108 insertions, 0 deletions
diff --git a/IndexSearcher.cs b/IndexSearcher.cs
new file mode 100644
index 0000000..26aa374
--- /dev/null
+++ b/IndexSearcher.cs
@@ -0,0 +1,108 @@
+using System;
+using Monodoc;
+
+namespace macdoc
+{
+ public class IndexSearcher
+ {
+ IndexReader index_reader;
+
+ public IndexSearcher (IndexReader indexReader)
+ {
+ this.index_reader = indexReader;
+ }
+
+ public int FindClosest (string text)
+ {
+ if (index_reader == null)
+ return -1;
+
+ int low = 0;
+ int top = index_reader.Rows-1;
+ int high = top;
+ int best_rate_idx = Int32.MaxValue, best_rate = -1;
+
+ while (low < high){
+ int mid = (high+low)/2;
+ int p = mid;
+ string s;
+
+ for (s = index_reader.GetValue (mid); s [0] == ' ';){
+ if (p == high){
+ if (p == low){
+ if (best_rate_idx != Int32.MaxValue)
+ return best_rate_idx;
+ else
+ return p;
+ }
+ high = mid;
+ break;
+ }
+ if (p < 0)
+ return 0;
+ s = index_reader.GetValue (++p);
+ }
+ if (s [0] == ' ')
+ continue;
+ int c, rate;
+ c = Rate (text, s, out rate);
+ if (rate > best_rate){
+ best_rate = rate;
+ best_rate_idx = p;
+ }
+ if (c == 0)
+ return mid;
+ if (low == high){
+ if (best_rate_idx != Int32.MaxValue)
+ return best_rate_idx;
+ else
+ return low;
+ }
+ if (c < 0)
+ high = mid;
+ else {
+ if (low == mid)
+ low = high;
+ else
+ low = mid;
+ }
+ }
+ return high;
+ }
+
+ int Rate (string user_text, string db_text, out int rate)
+ {
+ int c = String.Compare (user_text, db_text, true);
+ if (c == 0){
+ rate = 0;
+ return 0;
+ }
+ int i;
+ for (i = 0; i < user_text.Length; i++){
+ if (db_text [i] != user_text [i]){
+ rate = i;
+ return c;
+ }
+ }
+ rate = i;
+ return c;
+ }
+
+ public IndexEntry GetIndexEntry (int idx)
+ {
+ if (index_reader == null || idx >= index_reader.Rows || idx < 0)
+ return null;
+ return index_reader.GetIndexEntry (idx);
+ }
+
+ public IndexReader Index {
+ get {
+ return index_reader;
+ }
+ set {
+ index_reader = value;
+ }
+ }
+ }
+}
+