sdsykes-ferret 0.11.6.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/CHANGELOG +24 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +102 -0
  4. data/Rakefile +338 -0
  5. data/TODO +17 -0
  6. data/TUTORIAL +231 -0
  7. data/bin/ferret-browser +79 -0
  8. data/ext/analysis.c +1555 -0
  9. data/ext/analysis.h +219 -0
  10. data/ext/api.c +69 -0
  11. data/ext/api.h +27 -0
  12. data/ext/array.c +123 -0
  13. data/ext/array.h +53 -0
  14. data/ext/bitvector.c +540 -0
  15. data/ext/bitvector.h +272 -0
  16. data/ext/compound_io.c +383 -0
  17. data/ext/config.h +42 -0
  18. data/ext/document.c +156 -0
  19. data/ext/document.h +53 -0
  20. data/ext/except.c +120 -0
  21. data/ext/except.h +168 -0
  22. data/ext/extconf.rb +14 -0
  23. data/ext/ferret.c +402 -0
  24. data/ext/ferret.h +91 -0
  25. data/ext/filter.c +156 -0
  26. data/ext/fs_store.c +483 -0
  27. data/ext/global.c +418 -0
  28. data/ext/global.h +117 -0
  29. data/ext/hash.c +567 -0
  30. data/ext/hash.h +473 -0
  31. data/ext/hashset.c +170 -0
  32. data/ext/hashset.h +187 -0
  33. data/ext/header.h +58 -0
  34. data/ext/helper.c +62 -0
  35. data/ext/helper.h +13 -0
  36. data/ext/inc/lang.h +48 -0
  37. data/ext/inc/threading.h +31 -0
  38. data/ext/index.c +6425 -0
  39. data/ext/index.h +961 -0
  40. data/ext/lang.h +66 -0
  41. data/ext/libstemmer.c +92 -0
  42. data/ext/libstemmer.h +79 -0
  43. data/ext/mempool.c +87 -0
  44. data/ext/mempool.h +35 -0
  45. data/ext/modules.h +162 -0
  46. data/ext/multimapper.c +310 -0
  47. data/ext/multimapper.h +51 -0
  48. data/ext/posh.c +1006 -0
  49. data/ext/posh.h +1007 -0
  50. data/ext/priorityqueue.c +151 -0
  51. data/ext/priorityqueue.h +143 -0
  52. data/ext/q_boolean.c +1608 -0
  53. data/ext/q_const_score.c +161 -0
  54. data/ext/q_filtered_query.c +209 -0
  55. data/ext/q_fuzzy.c +268 -0
  56. data/ext/q_match_all.c +148 -0
  57. data/ext/q_multi_term.c +677 -0
  58. data/ext/q_parser.c +2825 -0
  59. data/ext/q_phrase.c +1126 -0
  60. data/ext/q_prefix.c +100 -0
  61. data/ext/q_range.c +350 -0
  62. data/ext/q_span.c +2402 -0
  63. data/ext/q_term.c +337 -0
  64. data/ext/q_wildcard.c +171 -0
  65. data/ext/r_analysis.c +2575 -0
  66. data/ext/r_index.c +3472 -0
  67. data/ext/r_qparser.c +585 -0
  68. data/ext/r_search.c +4105 -0
  69. data/ext/r_store.c +513 -0
  70. data/ext/r_utils.c +963 -0
  71. data/ext/ram_store.c +471 -0
  72. data/ext/search.c +1741 -0
  73. data/ext/search.h +885 -0
  74. data/ext/similarity.c +150 -0
  75. data/ext/similarity.h +82 -0
  76. data/ext/sort.c +983 -0
  77. data/ext/stem_ISO_8859_1_danish.c +338 -0
  78. data/ext/stem_ISO_8859_1_danish.h +16 -0
  79. data/ext/stem_ISO_8859_1_dutch.c +635 -0
  80. data/ext/stem_ISO_8859_1_dutch.h +16 -0
  81. data/ext/stem_ISO_8859_1_english.c +1156 -0
  82. data/ext/stem_ISO_8859_1_english.h +16 -0
  83. data/ext/stem_ISO_8859_1_finnish.c +792 -0
  84. data/ext/stem_ISO_8859_1_finnish.h +16 -0
  85. data/ext/stem_ISO_8859_1_french.c +1276 -0
  86. data/ext/stem_ISO_8859_1_french.h +16 -0
  87. data/ext/stem_ISO_8859_1_german.c +512 -0
  88. data/ext/stem_ISO_8859_1_german.h +16 -0
  89. data/ext/stem_ISO_8859_1_italian.c +1091 -0
  90. data/ext/stem_ISO_8859_1_italian.h +16 -0
  91. data/ext/stem_ISO_8859_1_norwegian.c +296 -0
  92. data/ext/stem_ISO_8859_1_norwegian.h +16 -0
  93. data/ext/stem_ISO_8859_1_porter.c +776 -0
  94. data/ext/stem_ISO_8859_1_porter.h +16 -0
  95. data/ext/stem_ISO_8859_1_portuguese.c +1035 -0
  96. data/ext/stem_ISO_8859_1_portuguese.h +16 -0
  97. data/ext/stem_ISO_8859_1_spanish.c +1119 -0
  98. data/ext/stem_ISO_8859_1_spanish.h +16 -0
  99. data/ext/stem_ISO_8859_1_swedish.c +307 -0
  100. data/ext/stem_ISO_8859_1_swedish.h +16 -0
  101. data/ext/stem_KOI8_R_russian.c +701 -0
  102. data/ext/stem_KOI8_R_russian.h +16 -0
  103. data/ext/stem_UTF_8_danish.c +344 -0
  104. data/ext/stem_UTF_8_danish.h +16 -0
  105. data/ext/stem_UTF_8_dutch.c +653 -0
  106. data/ext/stem_UTF_8_dutch.h +16 -0
  107. data/ext/stem_UTF_8_english.c +1176 -0
  108. data/ext/stem_UTF_8_english.h +16 -0
  109. data/ext/stem_UTF_8_finnish.c +808 -0
  110. data/ext/stem_UTF_8_finnish.h +16 -0
  111. data/ext/stem_UTF_8_french.c +1296 -0
  112. data/ext/stem_UTF_8_french.h +16 -0
  113. data/ext/stem_UTF_8_german.c +526 -0
  114. data/ext/stem_UTF_8_german.h +16 -0
  115. data/ext/stem_UTF_8_italian.c +1113 -0
  116. data/ext/stem_UTF_8_italian.h +16 -0
  117. data/ext/stem_UTF_8_norwegian.c +302 -0
  118. data/ext/stem_UTF_8_norwegian.h +16 -0
  119. data/ext/stem_UTF_8_porter.c +794 -0
  120. data/ext/stem_UTF_8_porter.h +16 -0
  121. data/ext/stem_UTF_8_portuguese.c +1055 -0
  122. data/ext/stem_UTF_8_portuguese.h +16 -0
  123. data/ext/stem_UTF_8_russian.c +709 -0
  124. data/ext/stem_UTF_8_russian.h +16 -0
  125. data/ext/stem_UTF_8_spanish.c +1137 -0
  126. data/ext/stem_UTF_8_spanish.h +16 -0
  127. data/ext/stem_UTF_8_swedish.c +313 -0
  128. data/ext/stem_UTF_8_swedish.h +16 -0
  129. data/ext/stopwords.c +401 -0
  130. data/ext/store.c +692 -0
  131. data/ext/store.h +777 -0
  132. data/ext/term_vectors.c +352 -0
  133. data/ext/threading.h +31 -0
  134. data/ext/utilities.c +446 -0
  135. data/ext/win32.h +54 -0
  136. data/lib/ferret.rb +29 -0
  137. data/lib/ferret/browser.rb +246 -0
  138. data/lib/ferret/browser/s/global.js +192 -0
  139. data/lib/ferret/browser/s/style.css +148 -0
  140. data/lib/ferret/browser/views/document/list.rhtml +49 -0
  141. data/lib/ferret/browser/views/document/show.rhtml +27 -0
  142. data/lib/ferret/browser/views/error/index.rhtml +7 -0
  143. data/lib/ferret/browser/views/help/index.rhtml +8 -0
  144. data/lib/ferret/browser/views/home/index.rhtml +29 -0
  145. data/lib/ferret/browser/views/layout.rhtml +22 -0
  146. data/lib/ferret/browser/views/term-vector/index.rhtml +4 -0
  147. data/lib/ferret/browser/views/term/index.rhtml +199 -0
  148. data/lib/ferret/browser/views/term/termdocs.rhtml +1 -0
  149. data/lib/ferret/browser/webrick.rb +14 -0
  150. data/lib/ferret/document.rb +130 -0
  151. data/lib/ferret/field_infos.rb +44 -0
  152. data/lib/ferret/index.rb +786 -0
  153. data/lib/ferret/number_tools.rb +157 -0
  154. data/lib/ferret_version.rb +3 -0
  155. data/setup.rb +1555 -0
  156. data/test/test_all.rb +5 -0
  157. data/test/test_helper.rb +24 -0
  158. data/test/threading/number_to_spoken.rb +132 -0
  159. data/test/threading/thread_safety_index_test.rb +79 -0
  160. data/test/threading/thread_safety_read_write_test.rb +76 -0
  161. data/test/threading/thread_safety_test.rb +133 -0
  162. data/test/unit/analysis/tc_analyzer.rb +548 -0
  163. data/test/unit/analysis/tc_token_stream.rb +646 -0
  164. data/test/unit/index/tc_index.rb +762 -0
  165. data/test/unit/index/tc_index_reader.rb +699 -0
  166. data/test/unit/index/tc_index_writer.rb +437 -0
  167. data/test/unit/index/th_doc.rb +315 -0
  168. data/test/unit/largefile/tc_largefile.rb +46 -0
  169. data/test/unit/query_parser/tc_query_parser.rb +238 -0
  170. data/test/unit/search/tc_filter.rb +135 -0
  171. data/test/unit/search/tc_fuzzy_query.rb +147 -0
  172. data/test/unit/search/tc_index_searcher.rb +61 -0
  173. data/test/unit/search/tc_multi_searcher.rb +128 -0
  174. data/test/unit/search/tc_multiple_search_requests.rb +58 -0
  175. data/test/unit/search/tc_search_and_sort.rb +179 -0
  176. data/test/unit/search/tc_sort.rb +49 -0
  177. data/test/unit/search/tc_sort_field.rb +27 -0
  178. data/test/unit/search/tc_spans.rb +190 -0
  179. data/test/unit/search/tm_searcher.rb +384 -0
  180. data/test/unit/store/tc_fs_store.rb +77 -0
  181. data/test/unit/store/tc_ram_store.rb +35 -0
  182. data/test/unit/store/tm_store.rb +34 -0
  183. data/test/unit/store/tm_store_lock.rb +68 -0
  184. data/test/unit/tc_document.rb +81 -0
  185. data/test/unit/ts_analysis.rb +2 -0
  186. data/test/unit/ts_index.rb +2 -0
  187. data/test/unit/ts_largefile.rb +4 -0
  188. data/test/unit/ts_query_parser.rb +2 -0
  189. data/test/unit/ts_search.rb +2 -0
  190. data/test/unit/ts_store.rb +2 -0
  191. data/test/unit/ts_utils.rb +2 -0
  192. data/test/unit/utils/tc_bit_vector.rb +295 -0
  193. data/test/unit/utils/tc_number_tools.rb +117 -0
  194. data/test/unit/utils/tc_priority_queue.rb +106 -0
  195. metadata +285 -0
@@ -0,0 +1,14 @@
1
+ # extconf.rb for Ferret extensions
2
+ if (/mswin/ =~ RUBY_PLATFORM) and ENV['make'].nil?
3
+ require 'mkmf'
4
+ $LIBS += " msvcprt.lib"
5
+ create_makefile("ferret_ext")
6
+ elsif ENV['FERRET_DEV']
7
+ require 'mkmf'
8
+ $CFLAGS += " -fno-stack-protector -fno-common -D_FILE_OFFSET_BITS=64"
9
+ create_makefile("ferret_ext")
10
+ else
11
+ require 'mkmf'
12
+ $CFLAGS += " -D_FILE_OFFSET_BITS=64"
13
+ create_makefile("ferret_ext")
14
+ end
@@ -0,0 +1,402 @@
1
+ #include <errno.h>
2
+ #include "ferret.h"
3
+ #include "except.h"
4
+ #include "hash.h"
5
+ #include "hashset.h"
6
+ #include "threading.h"
7
+
8
+ /* Object Map */
9
+ static HashTable *object_map;
10
+
11
+ /* IDs */
12
+ ID id_new;
13
+ ID id_call;
14
+ ID id_eql;
15
+ ID id_hash;
16
+ ID id_capacity;
17
+ ID id_less_than;
18
+ ID id_lt;
19
+ ID id_is_directory;
20
+ ID id_close;
21
+ ID id_cclass;
22
+ ID id_data;
23
+
24
+ static ID id_mkdir_p;
25
+
26
+ /* Symbols */
27
+ VALUE sym_yes;
28
+ VALUE sym_no;
29
+ VALUE sym_true;
30
+ VALUE sym_false;
31
+ VALUE sym_path;
32
+ VALUE sym_dir;
33
+
34
+ /* Modules */
35
+ VALUE mFerret;
36
+ VALUE mStore;
37
+ VALUE mStringHelper;
38
+ VALUE mSpans;
39
+
40
+ /* Classes */
41
+ VALUE cTerm;
42
+ /*
43
+ */
44
+
45
+ unsigned long value_hash(const void *key)
46
+ {
47
+ return (unsigned long)key;
48
+ }
49
+
50
+ int value_eq(const void *key1, const void *key2)
51
+ {
52
+ return key1 == key2;
53
+ }
54
+
55
+ VALUE object_get(void *key)
56
+ {
57
+ VALUE val = (VALUE)h_get(object_map, key);
58
+ if (!val) val = Qnil;
59
+ return val;
60
+ }
61
+
62
+ //static int hash_cnt = 0;
63
+ void
64
+ //object_add(void *key, VALUE obj)
65
+ object_add2(void *key, VALUE obj, const char *file, int line)
66
+ {
67
+ if (h_get(object_map, key))
68
+ printf("failed adding %lx to %ld; already contains %lx. %s:%d\n",
69
+ (long)obj, (long)key, (long)h_get(object_map, key), file, line);
70
+ //printf("adding %ld. now contains %d %s:%d\n", (long)key, ++hash_cnt, file, line);
71
+ h_set(object_map, key, (void *)obj);
72
+ }
73
+
74
+ void
75
+ //object_set(void *key, VALUE obj)
76
+ object_set2(void *key, VALUE obj, const char *file, int line)
77
+ {
78
+ //if (!h_get(object_map, key))
79
+ //printf("adding %ld. now contains %d %s:%d\n", (long)key, ++hash_cnt, file, line);
80
+ h_set(object_map, key, (void *)obj);
81
+ }
82
+
83
+ void
84
+ //object_del(void *key)
85
+ object_del2(void *key, const char *file, int line)
86
+ {
87
+ if (object_get(key) == Qnil)
88
+ printf("failed deleting %ld. %s:%d\n", (long)key, file, line);
89
+ //printf("deleting %ld. now contains %ld, %s:%d\n", (long)key, --hash_cnt, file, line);
90
+ h_del(object_map, key);
91
+ }
92
+
93
+ void frt_gc_mark(void *key)
94
+ {
95
+ VALUE val = (VALUE)h_get(object_map, key);
96
+ if (val)
97
+ rb_gc_mark(val);
98
+ }
99
+
100
+ VALUE frt_data_alloc(VALUE klass)
101
+ {
102
+ return Frt_Make_Struct(klass);
103
+ }
104
+
105
+ void frt_deref_free(void *p)
106
+ {
107
+ object_del(p);
108
+ }
109
+
110
+ void frt_thread_once(int *once_control, void (*init_routine) (void))
111
+ {
112
+ if (*once_control) {
113
+ init_routine();
114
+ *once_control = 0;
115
+ }
116
+ }
117
+
118
+ void frt_thread_key_create(thread_key_t *key, void (*destr_function)(void *))
119
+ {
120
+ *key = h_new(&value_hash, &value_eq, NULL, destr_function);
121
+ }
122
+
123
+ void frt_thread_key_delete(thread_key_t key)
124
+ {
125
+ h_destroy(key);
126
+ }
127
+
128
+ void frt_thread_setspecific(thread_key_t key, const void *pointer)
129
+ {
130
+ h_set(key, (void *)rb_thread_current(), (void *)pointer);
131
+ }
132
+
133
+ void *frt_thread_getspecific(thread_key_t key)
134
+ {
135
+ return h_get(key, (void *)rb_thread_current());
136
+ }
137
+
138
+ void frt_create_dir(VALUE rpath)
139
+ {
140
+ VALUE mFileUtils;
141
+ rb_require("fileutils");
142
+ mFileUtils = rb_define_module("FileUtils");
143
+ rb_funcall(mFileUtils, id_mkdir_p, 1, rpath);
144
+ }
145
+
146
+ VALUE frt_hs_to_rb_ary(HashSet *hs)
147
+ {
148
+ int i;
149
+ VALUE ary = rb_ary_new();
150
+ for (i = 0; i < hs->size; i++) {
151
+ rb_ary_push(ary, rb_str_new2(hs->elems[i]));
152
+ }
153
+ return ary;
154
+ }
155
+
156
+ void *frt_rb_data_ptr(VALUE val)
157
+ {
158
+ Check_Type(val, T_DATA);
159
+ return DATA_PTR(val);
160
+ }
161
+
162
+ char *
163
+ rs2s(VALUE rstr)
164
+ {
165
+ return (char *)(RSTRING_PTR(rstr) ? RSTRING_PTR(rstr) : EMPTY_STRING);
166
+ }
167
+
168
+ char *
169
+ nstrdup(VALUE rstr)
170
+ {
171
+ char *old = rs2s(rstr);
172
+ int len = RSTRING_LEN(rstr);
173
+ char *new = ALLOC_N(char, len + 1);
174
+ memcpy(new, old, len + 1);
175
+ return new;
176
+ }
177
+
178
+ char *
179
+ frt_field(VALUE rfield)
180
+ {
181
+ switch (TYPE(rfield)) {
182
+ case T_SYMBOL:
183
+ return rb_id2name(SYM2ID(rfield));
184
+ case T_STRING:
185
+ return rs2s(rfield);
186
+ default:
187
+ rb_raise(rb_eArgError, "field name must be a symbol");
188
+ }
189
+ return NULL;
190
+ }
191
+
192
+ /*
193
+ * Json Exportation - Loading each LazyDoc and formatting them into json
194
+ * This code is designed to get a VERY FAST json string, the goal was speed,
195
+ * not sexiness.
196
+ * Jeremie 'ahFeel' BORDIER
197
+ * ahFeel@rift.Fr
198
+ */
199
+ char *
200
+ json_concat_string(char *s, char *field)
201
+ {
202
+ *(s++) = '"';
203
+ while (*field) {
204
+ if (*field == '"') {
205
+ *(s++) = '\'';
206
+ *(s++) = *(field++);
207
+ *(s++) = '\'';
208
+ }
209
+ else {
210
+ *(s++) = *(field++);
211
+ }
212
+ }
213
+ *(s++) = '"';
214
+ return s;
215
+ }
216
+
217
+ static VALUE error_map;
218
+
219
+ VALUE frt_get_error(const char *err_type)
220
+ {
221
+ VALUE error_class;
222
+ if (Qnil != (error_class = rb_hash_aref(error_map, rb_intern(err_type)))) {
223
+ return error_class;
224
+ }
225
+ return rb_eStandardError;
226
+ }
227
+
228
+ #define FRT_BUF_SIZ 2046
229
+ #ifdef FRT_HAS_VARARGS
230
+ void vfrt_rb_raise(const char *file, int line_num, const char *func,
231
+ const char *err_type, const char *fmt, va_list args)
232
+ #else
233
+ void V_FRT_EXIT(const char *err_type, const char *fmt, va_list args)
234
+ #endif
235
+ {
236
+ char buf[FRT_BUF_SIZ];
237
+ size_t so_far = 0;
238
+ #ifdef FRT_HAS_VARARGS
239
+ snprintf(buf, FRT_BUF_SIZ, "%s occured at <%s>:%d in %s\n",
240
+ err_type, file, line_num, func);
241
+ #else
242
+ snprintf(buf, FRT_BUF_SIZ, "%s occured:\n", err_type);
243
+ #endif
244
+ so_far = strlen(buf);
245
+ vsnprintf(buf + so_far, FRT_BUF_SIZ - so_far, fmt, args);
246
+
247
+ so_far = strlen(buf);
248
+ if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':') {
249
+ snprintf(buf + so_far, FRT_BUF_SIZ - so_far, " %s", strerror(errno));
250
+ so_far = strlen(buf);
251
+ }
252
+
253
+ snprintf(buf + so_far, FRT_BUF_SIZ - so_far, "\n");
254
+ rb_raise(frt_get_error(err_type), buf);
255
+ }
256
+
257
+ #ifdef FRT_HAS_VARARGS
258
+ void frt_rb_raise(const char *file, int line_num, const char *func,
259
+ const char *err_type, const char *fmt, ...)
260
+ #else
261
+ void FRT_EXIT(const char *err_type, const char *fmt, ...)
262
+ #endif
263
+ {
264
+ va_list args;
265
+ va_start(args, fmt);
266
+ #ifdef FRT_HAS_VARARGS
267
+ vfrt_rb_raise(file, line_num, func, err_type, fmt, args);
268
+ #else
269
+ V_FRT_EXIT(err_type, fmt, args);
270
+ #endif
271
+ va_end(args);
272
+ }
273
+
274
+ /****************************************************************************
275
+ *
276
+ * Term Methods
277
+ *
278
+ ****************************************************************************/
279
+ static ID id_field;
280
+ static ID id_text;
281
+
282
+ VALUE frt_get_term(const char *field, const char *text)
283
+ {
284
+ return rb_struct_new(cTerm,
285
+ ID2SYM(rb_intern(field)),
286
+ rb_str_new2(text),
287
+ NULL);
288
+ }
289
+
290
+ static VALUE frt_term_to_s(VALUE self)
291
+ {
292
+ VALUE rstr;
293
+ VALUE rfield = rb_funcall(self, id_field, 0);
294
+ VALUE rtext = rb_funcall(self, id_text, 0);
295
+ char *field = StringValuePtr(rfield);
296
+ char *text = StringValuePtr(rtext);
297
+ char *term_str = ALLOC_N(char,
298
+ 5 + RSTRING_LEN(rfield) + RSTRING_LEN(rtext));
299
+ sprintf(term_str, "%s:%s", field, text);
300
+ rstr = rb_str_new2(term_str);
301
+ free(term_str);
302
+ return rstr;
303
+ }
304
+ /*
305
+ * Document-class: Ferret::Term
306
+ *
307
+ * == Summary
308
+ *
309
+ * A Term holds a term from a document and its field name (as a Symbol).
310
+ */
311
+ void Init_Term(void)
312
+ {
313
+ const char *term_class = "Term";
314
+ cTerm = rb_struct_define(term_class, "field", "text", NULL);
315
+ rb_set_class_path(cTerm, mFerret, term_class);
316
+ rb_const_set(mFerret, rb_intern(term_class), cTerm);
317
+ rb_define_method(cTerm, "to_s", frt_term_to_s, 0);
318
+ id_field = rb_intern("field");
319
+ id_text = rb_intern("text");
320
+ }
321
+
322
+ /*
323
+ * Document-module: Ferret
324
+ *
325
+ * See the README
326
+ */
327
+ void Init_Ferret(void)
328
+ {
329
+ mFerret = rb_define_module("Ferret");
330
+ Init_Term();
331
+ }
332
+
333
+ void Init_ferret_ext(void)
334
+ {
335
+ VALUE cParseError;
336
+ VALUE cStateError;
337
+ VALUE cFileNotFoundError;
338
+
339
+ /* initialize object map */
340
+ object_map = h_new(&value_hash, &value_eq, NULL, NULL);
341
+
342
+ /* IDs */
343
+ id_new = rb_intern("new");
344
+ id_call = rb_intern("call");
345
+ id_eql = rb_intern("eql?");
346
+ id_hash = rb_intern("hash");
347
+
348
+ id_capacity = rb_intern("capacity");
349
+ id_less_than = rb_intern("less_than");
350
+ id_lt = rb_intern("<");
351
+
352
+ id_mkdir_p = rb_intern("mkdir_p");
353
+ id_is_directory = rb_intern("directory?");
354
+ id_close = rb_intern("close");
355
+
356
+ id_cclass = rb_intern("cclass");
357
+
358
+ id_data = rb_intern("@data");
359
+
360
+ /* Symbols */
361
+ sym_yes = ID2SYM(rb_intern("yes"));;
362
+ sym_no = ID2SYM(rb_intern("no"));;
363
+ sym_true = ID2SYM(rb_intern("true"));;
364
+ sym_false = ID2SYM(rb_intern("false"));;
365
+ sym_path = ID2SYM(rb_intern("path"));;
366
+ sym_dir = ID2SYM(rb_intern("dir"));;
367
+
368
+ /* Inits */
369
+ Init_Ferret();
370
+ Init_Utils();
371
+ Init_Analysis();
372
+ Init_Store();
373
+ Init_Index();
374
+ Init_Search();
375
+ Init_QueryParser();
376
+
377
+ /* Error Classes */
378
+ cParseError =
379
+ rb_define_class_under(mFerret, "ParseError", rb_eStandardError);
380
+ cStateError =
381
+ rb_define_class_under(mFerret, "StateError", rb_eStandardError);
382
+ cFileNotFoundError =
383
+ rb_define_class_under(mFerret, "FileNotFoundError", rb_eIOError);
384
+
385
+ error_map = rb_hash_new();
386
+ rb_hash_aset(error_map, rb_intern("Exception"), rb_eStandardError);
387
+ rb_hash_aset(error_map, rb_intern("IO Error"), rb_eIOError);
388
+ rb_hash_aset(error_map, rb_intern("File Not Found Error"),
389
+ cFileNotFoundError);
390
+ rb_hash_aset(error_map, rb_intern("Argument Error"), rb_eArgError);
391
+ rb_hash_aset(error_map, rb_intern("End-of-File Error"), rb_eEOFError);
392
+ rb_hash_aset(error_map, rb_intern("Unsupported Function Error"),
393
+ rb_eNotImpError);
394
+ rb_hash_aset(error_map, rb_intern("State Error"), cStateError);
395
+ rb_hash_aset(error_map, rb_intern("ParseError"), cParseError);
396
+ rb_hash_aset(error_map, rb_intern("Memory Error"), rb_eNoMemError);
397
+ rb_hash_aset(error_map, rb_intern("Index Error"), rb_eIndexError);
398
+ rb_hash_aset(error_map, rb_intern("Lock Error"), cLockError);
399
+
400
+ rb_define_const(mFerret, "EXCEPTION_MAP", error_map);
401
+ rb_define_const(mFerret, "FIX_INT_MAX", INT2FIX(INT_MAX >> 1));
402
+ }
@@ -0,0 +1,91 @@
1
+ #ifndef __FERRET_H_
2
+ #define __FERRET_H_
3
+
4
+ #include "global.h"
5
+ #include "hashset.h"
6
+ #include "document.h"
7
+
8
+ /* IDs */
9
+ extern ID id_new;
10
+ extern ID id_call;
11
+ extern ID id_hash;
12
+ extern ID id_eql;
13
+ extern ID id_capacity;
14
+ extern ID id_less_than;
15
+ extern ID id_lt;
16
+ extern ID id_is_directory;
17
+ extern ID id_close;
18
+ extern ID id_cclass;
19
+ extern ID id_data;
20
+
21
+ /* Symbols */
22
+ extern VALUE sym_yes;
23
+ extern VALUE sym_no;
24
+ extern VALUE sym_true;
25
+ extern VALUE sym_false;
26
+ extern VALUE sym_path;
27
+ extern VALUE sym_dir;
28
+
29
+ /* Modules */
30
+ extern VALUE mFerret;
31
+ extern VALUE mIndex;
32
+ extern VALUE mSearch;
33
+ extern VALUE mStore;
34
+ extern VALUE mStringHelper;
35
+ extern VALUE mSpans;
36
+
37
+ /* Classes */
38
+ extern VALUE cDirectory;
39
+ extern VALUE cLockError;
40
+ extern VALUE cTerm;
41
+
42
+ /* Ferret Inits */
43
+ extern void Init_Utils();
44
+ extern void Init_Analysis();
45
+ extern void Init_Store();
46
+ extern void Init_Index();
47
+ extern void Init_Search();
48
+ extern void Init_QueryParser();
49
+
50
+ //extern void object_add(void *key, VALUE obj);
51
+ #define object_add(key, obj) object_add2(key, obj, __FILE__, __LINE__)
52
+ extern void object_add2(void *key, VALUE obj, const char *file, int line);
53
+ //extern void object_set(void *key, VALUE obj);
54
+ #define object_set(key, obj) object_set2(key, obj, __FILE__, __LINE__)
55
+ extern void object_set2(void *key, VALUE obj, const char *file, int line);
56
+ //extern void object_del(void *key);
57
+ #define object_del(key) object_del2(key, __FILE__, __LINE__)
58
+ extern void object_del2(void *key, const char *file, int line);
59
+ extern void frt_gc_mark(void *key);
60
+ extern VALUE object_get(void *key);
61
+ extern VALUE frt_data_alloc(VALUE klass);
62
+ extern void frt_deref_free(void *p);
63
+ extern void frt_create_dir(VALUE rpath);
64
+ extern VALUE frt_hs_to_rb_ary(HashSet *hs);
65
+ extern void *frt_rb_data_ptr(VALUE val);
66
+ extern char * frt_field(VALUE rfield);
67
+ extern VALUE frt_get_term(const char *field, const char *term);
68
+ extern char *json_concat_string(char *s, char *field);
69
+ extern char *rs2s(VALUE rstr);
70
+ extern char *nstrdup(VALUE rstr);
71
+ #define Frt_Make_Struct(klass)\
72
+ rb_data_object_alloc(klass,NULL,(RUBY_DATA_FUNC)NULL,(RUBY_DATA_FUNC)NULL)
73
+
74
+ #define Frt_Wrap_Struct(self,mmark,mfree,mdata)\
75
+ do {\
76
+ ((struct RData *)(self))->data = mdata;\
77
+ ((struct RData *)(self))->dmark = (RUBY_DATA_FUNC)mmark;\
78
+ ((struct RData *)(self))->dfree = (RUBY_DATA_FUNC)mfree;\
79
+ } while (0)
80
+
81
+ #define Frt_Unwrap_Struct(self)\
82
+ do {\
83
+ ((struct RData *)(self))->data = NULL;\
84
+ ((struct RData *)(self))->dmark = NULL;\
85
+ ((struct RData *)(self))->dfree = NULL;\
86
+ } while (0)
87
+
88
+ #endif
89
+
90
+ #define frt_mark_cclass(klass) rb_ivar_set(klass, id_cclass, Qtrue)
91
+ #define frt_is_cclass(obj) (rb_ivar_get(CLASS_OF(obj), id_cclass) == Qtrue)