ferret 0.11.6 → 0.11.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. data/README +10 -22
  2. data/RELEASE_CHANGES +137 -0
  3. data/RELEASE_NOTES +60 -0
  4. data/Rakefile +379 -274
  5. data/TODO +100 -8
  6. data/bin/ferret-browser +0 -0
  7. data/ext/BZLIB_blocksort.c +1094 -0
  8. data/ext/BZLIB_bzlib.c +1578 -0
  9. data/ext/BZLIB_compress.c +672 -0
  10. data/ext/BZLIB_crctable.c +104 -0
  11. data/ext/BZLIB_decompress.c +626 -0
  12. data/ext/BZLIB_huffman.c +205 -0
  13. data/ext/BZLIB_randtable.c +84 -0
  14. data/ext/{api.c → STEMMER_api.c} +7 -10
  15. data/ext/{libstemmer.c → STEMMER_libstemmer.c} +3 -2
  16. data/ext/{stem_ISO_8859_1_danish.c → STEMMER_stem_ISO_8859_1_danish.c} +123 -124
  17. data/ext/{stem_ISO_8859_1_dutch.c → STEMMER_stem_ISO_8859_1_dutch.c} +177 -188
  18. data/ext/STEMMER_stem_ISO_8859_1_english.c +1117 -0
  19. data/ext/{stem_ISO_8859_1_finnish.c → STEMMER_stem_ISO_8859_1_finnish.c} +276 -306
  20. data/ext/STEMMER_stem_ISO_8859_1_french.c +1246 -0
  21. data/ext/{stem_ISO_8859_1_german.c → STEMMER_stem_ISO_8859_1_german.c} +161 -170
  22. data/ext/STEMMER_stem_ISO_8859_1_hungarian.c +1230 -0
  23. data/ext/STEMMER_stem_ISO_8859_1_italian.c +1065 -0
  24. data/ext/STEMMER_stem_ISO_8859_1_norwegian.c +297 -0
  25. data/ext/{stem_ISO_8859_1_porter.c → STEMMER_stem_ISO_8859_1_porter.c} +263 -290
  26. data/ext/{stem_ISO_8859_1_portuguese.c → STEMMER_stem_ISO_8859_1_portuguese.c} +362 -380
  27. data/ext/STEMMER_stem_ISO_8859_1_spanish.c +1093 -0
  28. data/ext/STEMMER_stem_ISO_8859_1_swedish.c +307 -0
  29. data/ext/STEMMER_stem_ISO_8859_2_romanian.c +998 -0
  30. data/ext/{stem_KOI8_R_russian.c → STEMMER_stem_KOI8_R_russian.c} +244 -245
  31. data/ext/STEMMER_stem_UTF_8_danish.c +339 -0
  32. data/ext/{stem_UTF_8_dutch.c → STEMMER_stem_UTF_8_dutch.c} +192 -211
  33. data/ext/STEMMER_stem_UTF_8_english.c +1125 -0
  34. data/ext/{stem_UTF_8_finnish.c → STEMMER_stem_UTF_8_finnish.c} +284 -324
  35. data/ext/STEMMER_stem_UTF_8_french.c +1256 -0
  36. data/ext/{stem_UTF_8_german.c → STEMMER_stem_UTF_8_german.c} +170 -187
  37. data/ext/STEMMER_stem_UTF_8_hungarian.c +1234 -0
  38. data/ext/STEMMER_stem_UTF_8_italian.c +1073 -0
  39. data/ext/STEMMER_stem_UTF_8_norwegian.c +299 -0
  40. data/ext/{stem_UTF_8_porter.c → STEMMER_stem_UTF_8_porter.c} +271 -310
  41. data/ext/STEMMER_stem_UTF_8_portuguese.c +1023 -0
  42. data/ext/STEMMER_stem_UTF_8_romanian.c +1004 -0
  43. data/ext/STEMMER_stem_UTF_8_russian.c +694 -0
  44. data/ext/STEMMER_stem_UTF_8_spanish.c +1097 -0
  45. data/ext/STEMMER_stem_UTF_8_swedish.c +309 -0
  46. data/ext/STEMMER_stem_UTF_8_turkish.c +2205 -0
  47. data/ext/{utilities.c → STEMMER_utilities.c} +100 -68
  48. data/ext/analysis.c +276 -121
  49. data/ext/analysis.h +190 -143
  50. data/ext/api.h +3 -4
  51. data/ext/array.c +5 -3
  52. data/ext/array.h +52 -43
  53. data/ext/bitvector.c +38 -482
  54. data/ext/bitvector.h +446 -124
  55. data/ext/bzlib.h +282 -0
  56. data/ext/bzlib_private.h +503 -0
  57. data/ext/compound_io.c +23 -22
  58. data/ext/config.h +21 -11
  59. data/ext/document.c +43 -40
  60. data/ext/document.h +31 -21
  61. data/ext/except.c +20 -38
  62. data/ext/except.h +89 -76
  63. data/ext/extconf.rb +3 -2
  64. data/ext/ferret.c +49 -35
  65. data/ext/ferret.h +14 -11
  66. data/ext/field_index.c +262 -0
  67. data/ext/field_index.h +52 -0
  68. data/ext/filter.c +11 -10
  69. data/ext/fs_store.c +65 -47
  70. data/ext/global.c +245 -165
  71. data/ext/global.h +252 -54
  72. data/ext/hash.c +200 -243
  73. data/ext/hash.h +205 -163
  74. data/ext/hashset.c +118 -96
  75. data/ext/hashset.h +110 -82
  76. data/ext/header.h +19 -19
  77. data/ext/helper.c +11 -10
  78. data/ext/helper.h +14 -6
  79. data/ext/index.c +745 -366
  80. data/ext/index.h +503 -529
  81. data/ext/internal.h +1020 -0
  82. data/ext/lang.c +10 -0
  83. data/ext/lang.h +35 -15
  84. data/ext/mempool.c +5 -4
  85. data/ext/mempool.h +30 -22
  86. data/ext/modules.h +35 -7
  87. data/ext/multimapper.c +43 -2
  88. data/ext/multimapper.h +32 -23
  89. data/ext/posh.c +0 -0
  90. data/ext/posh.h +4 -38
  91. data/ext/priorityqueue.c +10 -12
  92. data/ext/priorityqueue.h +33 -21
  93. data/ext/q_boolean.c +22 -9
  94. data/ext/q_const_score.c +3 -2
  95. data/ext/q_filtered_query.c +15 -12
  96. data/ext/q_fuzzy.c +147 -135
  97. data/ext/q_match_all.c +3 -2
  98. data/ext/q_multi_term.c +28 -32
  99. data/ext/q_parser.c +451 -173
  100. data/ext/q_phrase.c +158 -79
  101. data/ext/q_prefix.c +16 -18
  102. data/ext/q_range.c +363 -31
  103. data/ext/q_span.c +130 -141
  104. data/ext/q_term.c +21 -21
  105. data/ext/q_wildcard.c +19 -23
  106. data/ext/r_analysis.c +369 -242
  107. data/ext/r_index.c +421 -434
  108. data/ext/r_qparser.c +142 -92
  109. data/ext/r_search.c +790 -407
  110. data/ext/r_store.c +44 -44
  111. data/ext/r_utils.c +264 -96
  112. data/ext/ram_store.c +29 -23
  113. data/ext/scanner.c +895 -0
  114. data/ext/scanner.h +36 -0
  115. data/ext/scanner_mb.c +6701 -0
  116. data/ext/scanner_utf8.c +4415 -0
  117. data/ext/search.c +210 -87
  118. data/ext/search.h +556 -488
  119. data/ext/similarity.c +17 -16
  120. data/ext/similarity.h +51 -44
  121. data/ext/sort.c +157 -354
  122. data/ext/stem_ISO_8859_1_hungarian.h +16 -0
  123. data/ext/stem_ISO_8859_2_romanian.h +16 -0
  124. data/ext/stem_UTF_8_hungarian.h +16 -0
  125. data/ext/stem_UTF_8_romanian.h +16 -0
  126. data/ext/stem_UTF_8_turkish.h +16 -0
  127. data/ext/stopwords.c +287 -278
  128. data/ext/store.c +57 -51
  129. data/ext/store.h +308 -286
  130. data/ext/symbol.c +10 -0
  131. data/ext/symbol.h +23 -0
  132. data/ext/term_vectors.c +14 -293
  133. data/ext/threading.h +22 -22
  134. data/ext/win32.h +12 -4
  135. data/lib/ferret.rb +2 -1
  136. data/lib/ferret/browser.rb +1 -1
  137. data/lib/ferret/field_symbol.rb +94 -0
  138. data/lib/ferret/index.rb +221 -34
  139. data/lib/ferret/number_tools.rb +6 -6
  140. data/lib/ferret/version.rb +3 -0
  141. data/test/{unit → long_running}/largefile/tc_largefile.rb +1 -1
  142. data/test/test_helper.rb +7 -2
  143. data/test/test_installed.rb +1 -0
  144. data/test/threading/thread_safety_index_test.rb +10 -1
  145. data/test/threading/thread_safety_read_write_test.rb +4 -7
  146. data/test/threading/thread_safety_test.rb +0 -0
  147. data/test/unit/analysis/tc_analyzer.rb +29 -27
  148. data/test/unit/analysis/tc_token_stream.rb +23 -16
  149. data/test/unit/index/tc_index.rb +116 -11
  150. data/test/unit/index/tc_index_reader.rb +27 -27
  151. data/test/unit/index/tc_index_writer.rb +10 -0
  152. data/test/unit/index/th_doc.rb +38 -21
  153. data/test/unit/search/tc_filter.rb +31 -10
  154. data/test/unit/search/tc_index_searcher.rb +6 -0
  155. data/test/unit/search/tm_searcher.rb +53 -1
  156. data/test/unit/store/tc_fs_store.rb +40 -2
  157. data/test/unit/store/tc_ram_store.rb +0 -0
  158. data/test/unit/store/tm_store.rb +0 -0
  159. data/test/unit/store/tm_store_lock.rb +7 -6
  160. data/test/unit/tc_field_symbol.rb +26 -0
  161. data/test/unit/ts_analysis.rb +0 -0
  162. data/test/unit/ts_index.rb +0 -0
  163. data/test/unit/ts_store.rb +0 -0
  164. data/test/unit/ts_utils.rb +0 -0
  165. data/test/unit/utils/tc_number_tools.rb +0 -0
  166. data/test/utils/content_generator.rb +226 -0
  167. metadata +262 -221
  168. data/ext/inc/lang.h +0 -48
  169. data/ext/inc/threading.h +0 -31
  170. data/ext/stem_ISO_8859_1_english.c +0 -1156
  171. data/ext/stem_ISO_8859_1_french.c +0 -1276
  172. data/ext/stem_ISO_8859_1_italian.c +0 -1091
  173. data/ext/stem_ISO_8859_1_norwegian.c +0 -296
  174. data/ext/stem_ISO_8859_1_spanish.c +0 -1119
  175. data/ext/stem_ISO_8859_1_swedish.c +0 -307
  176. data/ext/stem_UTF_8_danish.c +0 -344
  177. data/ext/stem_UTF_8_english.c +0 -1176
  178. data/ext/stem_UTF_8_french.c +0 -1296
  179. data/ext/stem_UTF_8_italian.c +0 -1113
  180. data/ext/stem_UTF_8_norwegian.c +0 -302
  181. data/ext/stem_UTF_8_portuguese.c +0 -1055
  182. data/ext/stem_UTF_8_russian.c +0 -709
  183. data/ext/stem_UTF_8_spanish.c +0 -1137
  184. data/ext/stem_UTF_8_swedish.c +0 -313
  185. data/lib/ferret_version.rb +0 -3
@@ -0,0 +1,10 @@
1
+ #include <stdlib.h>
2
+ #include "symbol.h"
3
+
4
+
5
+ FrtSymbol frt_intern_and_free(char *str)
6
+ {
7
+ FrtSymbol sym = (FrtSymbol)rb_intern(str);
8
+ free(str);
9
+ return sym;
10
+ }
@@ -0,0 +1,23 @@
1
+ #ifndef FRT_SYMBOL_H
2
+ #define FRT_SYMBOL_H
3
+
4
+ #include <ruby.h>
5
+
6
+ typedef void *FrtSymbol;
7
+
8
+ VALUE rb_id2str(ID id);
9
+ #define frt_symbol_init()
10
+ #define frt_intern(str) (FrtSymbol)rb_intern(str)
11
+ extern FrtSymbol frt_intern_and_free(char *str);
12
+
13
+ #define FRT_I frt_intern
14
+ #define FRT_InF frt_intern_and_free
15
+ #define FRT_S(_sym) rb_id2name((ID)_sym)
16
+
17
+ #define FSYM2SYM(_sym) ID2SYM((ID)_sym)
18
+ #define SYM2FSYM(_sym) (FrtSymbol)SYM2ID(_sym)
19
+
20
+ #define frt_sym_hash(sym) frt_str_hash(rb_id2name((ID)sym))
21
+ #define frt_sym_len(sym) strlen(rb_id2name((ID)sym))
22
+
23
+ #endif
@@ -2,6 +2,8 @@
2
2
  #include "index.h"
3
3
  #include "array.h"
4
4
  #include "helper.h"
5
+ #include "symbol.h"
6
+ #include "internal.h"
5
7
 
6
8
  /****************************************************************************
7
9
  *
@@ -18,12 +20,11 @@ void tv_destroy(TermVector *tv)
18
20
  free(tv->terms[i].positions);
19
21
  }
20
22
  free(tv->offsets);
21
- free(tv->field);
22
23
  free(tv->terms);
23
24
  free(tv);
24
25
  }
25
26
 
26
- int tv_get_tv_term_index(TermVector *tv, const char *term)
27
+ int tv_scan_to_term_index(TermVector *tv, const char *term)
27
28
  {
28
29
  int lo = 0; /* search starts array */
29
30
  int hi = tv->term_cnt - 1; /* for 1st element < n, return its index */
@@ -45,18 +46,24 @@ int tv_get_tv_term_index(TermVector *tv, const char *term)
45
46
  return mid;
46
47
  }
47
48
  }
48
- if (hi >= 0 && strcmp(term, tv->terms[hi].text) == 0) {
49
- return hi;
49
+ return lo;
50
+ }
51
+
52
+ int tv_get_term_index(TermVector *tv, const char *term)
53
+ {
54
+ int index = tv_scan_to_term_index(tv, term);
55
+ if (index < tv->term_cnt && (0 == strcmp(term, tv->terms[index].text))) {
56
+ /* found term */
57
+ return index;
50
58
  }
51
59
  else {
52
60
  return -1;
53
61
  }
54
- return hi;
55
62
  }
56
63
 
57
- extern TVTerm *tv_get_tv_term(TermVector *tv, const char *term)
64
+ TVTerm *tv_get_tv_term(TermVector *tv, const char *term)
58
65
  {
59
- int index = tv_get_tv_term_index(tv, term);
66
+ int index = tv_get_term_index(tv, term);
60
67
  if (index >= 0) {
61
68
  return &(tv->terms[index]);
62
69
  }
@@ -64,289 +71,3 @@ extern TVTerm *tv_get_tv_term(TermVector *tv, const char *term)
64
71
  return NULL;
65
72
  }
66
73
  }
67
-
68
- /****************************************************************************
69
- *
70
- * TermVectorsReader
71
- *
72
- ****************************************************************************/
73
-
74
- TermVectorsReader *tvr_open(Store *store,
75
- const char *segment,
76
- FieldInfos *fis)
77
- {
78
- TermVectorsReader *tvr = ALLOC(TermVectorsReader);
79
- char file_name[SEGMENT_NAME_MAX_LENGTH];
80
-
81
- tvr->fis = fis;
82
- sprintf(file_name, "%s.tvx", segment);
83
- tvr->tvx_in = store->open_input(store, file_name);
84
- tvr->size = is_length(tvr->tvx_in) / 12;
85
-
86
- sprintf(file_name, "%s.tvd", segment);
87
- tvr->tvd_in = store->open_input(store, file_name);
88
- return tvr;
89
- }
90
-
91
- TermVectorsReader *tvr_clone(TermVectorsReader *orig)
92
- {
93
- TermVectorsReader *tvr = ALLOC(TermVectorsReader);
94
-
95
- memcpy(tvr, orig, sizeof(TermVectorsReader));
96
- tvr->tvx_in = is_clone(orig->tvx_in);
97
- tvr->tvd_in = is_clone(orig->tvd_in);
98
-
99
- return tvr;
100
- }
101
-
102
- void tvr_close(TermVectorsReader *tvr)
103
- {
104
- is_close(tvr->tvx_in);
105
- is_close(tvr->tvd_in);
106
- free(tvr);
107
- }
108
-
109
- TermVector *tvr_read_term_vector(TermVectorsReader *tvr, int field_num)
110
- {
111
- TermVector *tv = ALLOC_AND_ZERO(TermVector);
112
- InStream *tvd_in = tvr->tvd_in;
113
- FieldInfo *fi = tvr->fis->fields[field_num];
114
- const int num_terms = is_read_vint(tvd_in);
115
-
116
- tv->field_num = field_num;
117
- tv->field = estrdup(fi->name);
118
-
119
- if (num_terms > 0) {
120
- int i, j, delta_start, delta_len, total_len, freq;
121
- int store_positions = fi_store_positions(fi);
122
- int store_offsets = fi_store_offsets(fi);
123
- uchar buffer[MAX_WORD_SIZE];
124
- TVTerm *term;
125
-
126
- tv->term_cnt = num_terms;
127
- tv->terms = ALLOC_AND_ZERO_N(TVTerm, num_terms);
128
-
129
- for (i = 0; i < num_terms; i++) {
130
- term = &(tv->terms[i]);
131
- /* read delta encoded term */
132
- delta_start = is_read_vint(tvd_in);
133
- delta_len = is_read_vint(tvd_in);
134
- total_len = delta_start + delta_len;
135
- is_read_bytes(tvd_in, buffer + delta_start, delta_len);
136
- buffer[total_len++] = '\0';
137
- term->text = memcpy(ALLOC_N(char, total_len), buffer, total_len);
138
-
139
- /* read freq */
140
- freq = term->freq = is_read_vint(tvd_in);
141
-
142
- /* read positions if necessary */
143
- if (store_positions) {
144
- int *positions = term->positions = ALLOC_N(int, freq);
145
- int pos = 0;
146
- for (j = 0; j < freq; j++) {
147
- positions[j] = pos += is_read_vint(tvd_in);
148
- }
149
- }
150
-
151
- /* read offsets if necessary */
152
- }
153
- if (store_offsets) {
154
- int num_positions = tv->offset_cnt = is_read_vint(tvd_in);
155
- Offset *offsets = tv->offsets = ALLOC_N(Offset, num_positions);
156
- int offset = 0;
157
- for (i = 0; i < num_positions; i++) {
158
- offsets[i].start = offset += is_read_vint(tvd_in);
159
- offsets[i].end = offset += is_read_vint(tvd_in);
160
- }
161
- }
162
- }
163
- return tv;
164
- }
165
-
166
- HashTable *tvr_get_tv(TermVectorsReader *tvr, int doc_num)
167
- {
168
- HashTable *term_vectors = h_new_str((free_ft)NULL, (free_ft)&tv_destroy);
169
- int i;
170
- InStream *tvx_in = tvr->tvx_in;
171
- InStream *tvd_in = tvr->tvd_in;
172
- off_t data_ptr, field_index_ptr;
173
- int field_cnt;
174
- int *field_nums;
175
-
176
- if (doc_num >= 0 && doc_num < tvr->size) {
177
- is_seek(tvx_in, 12 * doc_num);
178
-
179
- data_ptr = (off_t)is_read_u64(tvx_in);
180
- field_index_ptr = data_ptr + (off_t)is_read_u32(tvx_in);
181
-
182
- /* scan fields to get position of field_num's term vector */
183
- is_seek(tvd_in, field_index_ptr);
184
-
185
- field_cnt = is_read_vint(tvd_in);
186
- field_nums = ALLOC_N(int, field_cnt);
187
-
188
- for (i = 0; i < field_cnt; i++) {
189
- field_nums[i] = is_read_vint(tvd_in);
190
- is_read_vint(tvd_in); /* skip space, we don't need it */
191
- }
192
- is_seek(tvd_in, data_ptr);
193
-
194
- for (i = 0; i < field_cnt; i++) {
195
- TermVector *tv = tvr_read_term_vector(tvr, field_nums[i]);
196
- h_set(term_vectors, tv->field, tv);
197
- }
198
- free(field_nums);
199
- }
200
- return term_vectors;
201
- }
202
-
203
- TermVector *tvr_get_field_tv(TermVectorsReader *tvr,
204
- int doc_num,
205
- int field_num)
206
- {
207
- int i;
208
- InStream *tvx_in = tvr->tvx_in;
209
- InStream *tvd_in = tvr->tvd_in;
210
- off_t data_ptr, field_index_ptr;
211
- int field_cnt;
212
- int offset = 0;
213
- TermVector *tv = NULL;
214
-
215
- if (doc_num >= 0 && doc_num < tvr->size) {
216
- is_seek(tvx_in, 12 * doc_num);
217
-
218
- data_ptr = (off_t)is_read_u64(tvx_in);
219
- field_index_ptr = data_ptr + (off_t)is_read_u32(tvx_in);
220
-
221
- /* scan fields to get position of field_num's term vector */
222
- is_seek(tvd_in, field_index_ptr);
223
-
224
- field_cnt = is_read_vint(tvd_in);
225
- for (i = 0; i < field_cnt; i++) {
226
- if ((int)is_read_vint(tvd_in) == field_num) {
227
- break;
228
- }
229
- offset += is_read_vint(tvd_in); /* space taken by field */
230
- }
231
- if (i < field_cnt) {
232
- /* field was found */
233
- is_seek(tvd_in, data_ptr + offset);
234
- tv = tvr_read_term_vector(tvr, field_num);
235
- }
236
- }
237
- return tv;
238
- }
239
-
240
- /****************************************************************************
241
- *
242
- * TermVectorsWriter
243
- *
244
- ****************************************************************************/
245
-
246
- TermVectorsWriter *tvw_open(Store *store, const char *segment, FieldInfos *fis)
247
- {
248
- TermVectorsWriter *tvw = ALLOC(TermVectorsWriter);
249
- char file_name[SEGMENT_NAME_MAX_LENGTH];
250
- tvw->fis = fis;
251
- tvw->fields = ary_new_type_capa(TVField, TV_FIELD_INIT_CAPA);
252
-
253
- snprintf(file_name, SEGMENT_NAME_MAX_LENGTH, "%s.tvx", segment);
254
- tvw->tvx_out = store->new_output(store, file_name);
255
-
256
- snprintf(file_name, SEGMENT_NAME_MAX_LENGTH, "%s.tvd", segment);
257
- tvw->tvd_out = store->new_output(store, file_name);
258
-
259
- return tvw;
260
- }
261
-
262
- void tvw_close(TermVectorsWriter *tvw)
263
- {
264
- os_close(tvw->tvx_out);
265
- os_close(tvw->tvd_out);
266
- ary_free(tvw->fields);
267
- free(tvw);
268
- }
269
-
270
- void tvw_open_doc(TermVectorsWriter *tvw)
271
- {
272
- ary_size(tvw->fields) = 0;
273
- tvw->tvd_ptr = os_pos(tvw->tvd_out);
274
- os_write_u64(tvw->tvx_out, tvw->tvd_ptr);
275
- }
276
-
277
- void tvw_close_doc(TermVectorsWriter *tvw)
278
- {
279
- int i;
280
- OutStream *tvd_out = tvw->tvd_out;
281
- os_write_u32(tvw->tvx_out, (f_u32)(os_pos(tvw->tvd_out) - tvw->tvd_ptr));
282
- os_write_vint(tvd_out, ary_size(tvw->fields));
283
- for (i = 0; i < ary_size(tvw->fields); i++) {
284
- os_write_vint(tvd_out, tvw->fields[i].field_num);
285
- os_write_vint(tvd_out, tvw->fields[i].size);
286
- }
287
- }
288
-
289
- void tvw_add_postings(TermVectorsWriter *tvw,
290
- int field_num,
291
- PostingList **plists,
292
- int posting_count,
293
- Offset *offsets,
294
- int offset_count)
295
- {
296
- int i, delta_start, delta_length;
297
- const char *last_term = EMPTY_STRING;
298
- off_t tvd_start_pos = os_pos(tvw->tvd_out);
299
- OutStream *tvd_out = tvw->tvd_out;
300
- PostingList *plist;
301
- Posting *posting;
302
- Occurence *occ;
303
- FieldInfo *fi = tvw->fis->fields[field_num];
304
- int store_positions = fi_store_positions(fi);
305
-
306
- ary_grow(tvw->fields);
307
- ary_last(tvw->fields).field_num = field_num;
308
-
309
- os_write_vint(tvd_out, posting_count);
310
- for (i = 0; i < posting_count; i++) {
311
- plist = plists[i];
312
- posting = plist->last;
313
- delta_start = hlp_string_diff(last_term, plist->term);
314
- delta_length = plist->term_len - delta_start;
315
-
316
- os_write_vint(tvd_out, delta_start); /* write shared prefix length */
317
- os_write_vint(tvd_out, delta_length); /* write delta length */
318
- /* write delta chars */
319
- os_write_bytes(tvd_out,
320
- (uchar *)(plist->term + delta_start),
321
- delta_length);
322
- os_write_vint(tvd_out, posting->freq);
323
- last_term = plist->term;
324
-
325
- if (store_positions) {
326
- /* use delta encoding for positions */
327
- int last_pos = 0;
328
- for (occ = posting->first_occ; occ; occ = occ->next) {
329
- os_write_vint(tvd_out, occ->pos - last_pos);
330
- last_pos = occ->pos;
331
- }
332
- }
333
-
334
- }
335
-
336
- if (fi_store_offsets(fi)) {
337
- /* use delta encoding for offsets */
338
- int last_end = 0;
339
- os_write_vint(tvd_out, offset_count); /* write shared prefix length */
340
- for (i = 0; i < offset_count; i++) {
341
- int start = offsets[i].start;
342
- int end = offsets[i].end;
343
- os_write_vint(tvd_out, start - last_end);
344
- os_write_vint(tvd_out, end - start);
345
- last_end = end;
346
- }
347
- }
348
-
349
- ary_last(tvw->fields).size = os_pos(tvd_out) - tvd_start_pos;
350
- }
351
-
352
-
@@ -4,28 +4,28 @@
4
4
  #include "hash.h"
5
5
  #define UNTHREADED 1
6
6
 
7
- typedef void * mutex_t;
8
- typedef struct HashTable *thread_key_t;
9
- typedef int thread_once_t;
10
- #define MUTEX_INITIALIZER NULL
11
- #define MUTEX_RECURSIVE_INITIALIZER NULL
12
- #define THREAD_ONCE_INIT 1;
13
- #define mutex_init(a, b)
14
- #define mutex_lock(a)
15
- #define mutex_trylock(a)
16
- #define mutex_unlock(a)
17
- #define mutex_destroy(a)
18
- #define thread_key_create(a, b) frt_thread_key_create(a, b)
19
- #define thread_key_delete(a) frt_thread_key_delete(a)
20
- #define thread_setspecific(a, b) frt_thread_setspecific(a, b)
21
- #define thread_getspecific(a) frt_thread_getspecific(a)
22
- #define thread_exit(a)
23
- #define thread_once(a, b) frt_thread_once(a, b)
7
+ typedef void * frt_mutex_t;
8
+ typedef struct FrtHash *frt_thread_key_t;
9
+ typedef int frt_thread_once_t;
10
+ #define FRT_MUTEX_INITIALIZER NULL
11
+ #define FRT_MUTEX_RECURSIVE_INITIALIZER NULL
12
+ #define FRT_THREAD_ONCE_INIT 1;
13
+ #define frt_mutex_init(a, b)
14
+ #define frt_mutex_lock(a)
15
+ #define frt_mutex_trylock(a)
16
+ #define frt_mutex_unlock(a)
17
+ #define frt_mutex_destroy(a)
18
+ #define frt_thread_key_create(a, b) frb_thread_key_create(a, b)
19
+ #define frt_thread_key_delete(a) frb_thread_key_delete(a)
20
+ #define frt_thread_setspecific(a, b) frb_thread_setspecific(a, b)
21
+ #define frt_thread_getspecific(a) frb_thread_getspecific(a)
22
+ #define frt_thread_exit(a)
23
+ #define frt_thread_once(a, b) frb_thread_once(a, b)
24
24
 
25
- void frt_thread_once(int *once_control, void (*init_routine)(void));
26
- void frt_thread_key_create(thread_key_t *key, void (*destr_function)(void *));
27
- void frt_thread_key_delete(thread_key_t key);
28
- void frt_thread_setspecific(thread_key_t key, const void *pointer);
29
- void *frt_thread_getspecific(thread_key_t key);
25
+ void frb_thread_once(int *once_control, void (*init_routine)(void));
26
+ void frb_thread_key_create(frt_thread_key_t *key, frt_free_ft destroy);
27
+ void frb_thread_key_delete(frt_thread_key_t key);
28
+ void frb_thread_setspecific(frt_thread_key_t key, const void *pointer);
29
+ void *frb_thread_getspecific(frt_thread_key_t key);
30
30
 
31
31
  #endif
@@ -1,8 +1,11 @@
1
- #include "global.h"
2
-
3
1
  #ifndef FRT_WIN32_H
4
2
  #define FRT_WIN32_H
5
3
 
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "global.h"
6
9
  #include <io.h>
7
10
 
8
11
  struct dirent
@@ -19,8 +22,8 @@ typedef struct DIR
19
22
 
20
23
  DIR *opendir(const char *dirname)
21
24
  {
22
- DIR *d = ALLOC_AND_ZERO(DIR);
23
- char dirname_buf[MAX_FILE_PATH];
25
+ DIR *d = FRT_ALLOC_AND_ZERO(DIR);
26
+ char dirname_buf[FRT_MAX_FILE_PATH];
24
27
  long ff_res;
25
28
  sprintf(dirname_buf, "%s\\*", dirname);
26
29
  ff_res = _findfirst(dirname_buf, &d->find_data);
@@ -51,4 +54,9 @@ void closedir(DIR *d)
51
54
  _findclose(d->handle);
52
55
  free(d);
53
56
  }
57
+
58
+ #ifdef __cplusplus
59
+ } // extern "C"
60
+ #endif
61
+
54
62
  #endif