ferret 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/README +6 -5
  2. data/Rakefile +34 -13
  3. data/TODO +1 -0
  4. data/TUTORIAL +1 -1
  5. data/ext/analysis.c +87 -70
  6. data/ext/analysis.h +18 -6
  7. data/ext/array.c +1 -2
  8. data/ext/array.h +1 -1
  9. data/ext/bitvector.c +10 -6
  10. data/ext/bitvector.h +2 -2
  11. data/ext/compound_io.c +30 -27
  12. data/ext/document.c +15 -15
  13. data/ext/document.h +5 -5
  14. data/ext/except.c +2 -0
  15. data/ext/except.h +25 -23
  16. data/ext/extconf.rb +1 -0
  17. data/ext/ferret.c +10 -8
  18. data/ext/ferret.h +9 -8
  19. data/ext/field.c +29 -25
  20. data/ext/filter.c +52 -14
  21. data/ext/frtio.h +13 -0
  22. data/ext/fs_store.c +115 -170
  23. data/ext/global.c +9 -8
  24. data/ext/global.h +17 -13
  25. data/ext/hash.c +13 -19
  26. data/ext/hash.h +11 -11
  27. data/ext/hashset.c +5 -7
  28. data/ext/hashset.h +9 -8
  29. data/ext/helper.c +1 -1
  30. data/ext/helper.h +2 -1
  31. data/ext/inc/except.h +25 -23
  32. data/ext/inc/lang.h +11 -1
  33. data/ext/ind.c +33 -21
  34. data/ext/index.h +44 -39
  35. data/ext/index_io.c +61 -57
  36. data/ext/index_rw.c +418 -361
  37. data/ext/lang.c +10 -0
  38. data/ext/lang.h +11 -1
  39. data/ext/nix_io.c +135 -0
  40. data/ext/priorityqueue.c +16 -16
  41. data/ext/priorityqueue.h +9 -6
  42. data/ext/q_boolean.c +128 -76
  43. data/ext/q_const_score.c +20 -20
  44. data/ext/q_filtered_query.c +20 -20
  45. data/ext/q_fuzzy.c +37 -23
  46. data/ext/q_match_all.c +15 -19
  47. data/ext/q_multi_phrase.c +87 -46
  48. data/ext/q_parser.c +247 -119
  49. data/ext/q_phrase.c +86 -52
  50. data/ext/q_prefix.c +25 -14
  51. data/ext/q_range.c +59 -14
  52. data/ext/q_span.c +263 -172
  53. data/ext/q_term.c +62 -51
  54. data/ext/q_wildcard.c +24 -13
  55. data/ext/r_analysis.c +328 -80
  56. data/ext/r_doc.c +11 -6
  57. data/ext/r_index_io.c +40 -32
  58. data/ext/r_qparser.c +15 -14
  59. data/ext/r_search.c +270 -152
  60. data/ext/r_store.c +32 -17
  61. data/ext/ram_store.c +38 -22
  62. data/ext/search.c +617 -87
  63. data/ext/search.h +227 -163
  64. data/ext/similarity.c +54 -45
  65. data/ext/similarity.h +3 -3
  66. data/ext/sort.c +132 -53
  67. data/ext/store.c +21 -2
  68. data/ext/store.h +14 -14
  69. data/ext/tags +4322 -232
  70. data/ext/term.c +140 -109
  71. data/ext/termdocs.c +74 -60
  72. data/ext/vector.c +181 -152
  73. data/ext/w32_io.c +150 -0
  74. data/lib/ferret.rb +1 -1
  75. data/lib/ferret/analysis/standard_tokenizer.rb +4 -3
  76. data/lib/ferret/document/field.rb +1 -1
  77. data/lib/ferret/index/field_infos.rb +1 -1
  78. data/lib/ferret/index/term.rb +1 -1
  79. data/lib/ferret/query_parser/query_parser.tab.rb +8 -24
  80. data/lib/ferret/search.rb +1 -0
  81. data/lib/ferret/search/boolean_query.rb +0 -4
  82. data/lib/ferret/search/index_searcher.rb +21 -8
  83. data/lib/ferret/search/multi_phrase_query.rb +7 -0
  84. data/lib/ferret/search/multi_searcher.rb +261 -0
  85. data/lib/ferret/search/phrase_query.rb +1 -1
  86. data/lib/ferret/search/query.rb +34 -5
  87. data/lib/ferret/search/sort.rb +7 -3
  88. data/lib/ferret/search/sort_field.rb +8 -4
  89. data/lib/ferret/store/fs_store.rb +13 -6
  90. data/lib/ferret/store/index_io.rb +0 -14
  91. data/lib/ferret/store/ram_store.rb +3 -2
  92. data/lib/rferret.rb +1 -1
  93. data/test/unit/analysis/ctc_analyzer.rb +131 -0
  94. data/test/unit/analysis/ctc_tokenstream.rb +98 -9
  95. data/test/unit/index/tc_index.rb +40 -1
  96. data/test/unit/index/tc_term.rb +7 -0
  97. data/test/unit/index/th_doc.rb +8 -0
  98. data/test/unit/query_parser/tc_query_parser.rb +6 -4
  99. data/test/unit/search/rtc_sort_field.rb +6 -6
  100. data/test/unit/search/tc_index_searcher.rb +8 -0
  101. data/test/unit/search/tc_multi_searcher.rb +275 -0
  102. data/test/unit/search/tc_multi_searcher2.rb +126 -0
  103. data/test/unit/search/tc_search_and_sort.rb +66 -0
  104. metadata +31 -26
  105. data/test/unit/query_parser/rtc_query_parser.rb +0 -138
data/ext/analysis.h CHANGED
@@ -40,13 +40,14 @@ struct TokenStream {
40
40
  Token *(*next)(TokenStream *ts);
41
41
  void (*reset)(TokenStream *ts, char *text);
42
42
  void (*clone_i)(TokenStream *orig_ts, TokenStream *new_ts);
43
- void (*destroy)(void *p);
43
+ void (*destroy)(TokenStream *ts);
44
44
  TokenStream *sub_ts; /* used by filters */
45
- bool destroy_sub : 1;
45
+ int ref_cnt;
46
46
  };
47
47
 
48
48
  #define ts_next(mts) mts->next(mts)
49
- #define ts_destroy(mts) mts->destroy(mts)
49
+
50
+ void ts_deref(void *p);
50
51
 
51
52
  TokenStream *whitespace_tokenizer_create();
52
53
  TokenStream *mb_whitespace_tokenizer_create(bool lowercase);
@@ -93,13 +94,19 @@ typedef struct Analyzer {
93
94
  void *data;
94
95
  TokenStream *current_ts;
95
96
  TokenStream *(*get_ts)(struct Analyzer *a, char *field, char *text);
96
- void (*destroy)(void *p);
97
+ void (*destroy)(struct Analyzer *a);
98
+ int ref_cnt;
97
99
  } Analyzer;
98
100
 
99
- #define a_destroy(ma) ma->destroy(ma)
101
+ void a_deref(void *p);
102
+
100
103
  #define a_get_ts(ma, field, text) ma->get_ts(ma, field, text)
101
104
  #define a_get_new_ts(ma, field, text) ts_clone(ma->get_ts(ma, field, text))
102
105
 
106
+ Analyzer *analyzer_create(void *data, TokenStream *ts,
107
+ void (*destroy)(Analyzer *),
108
+ TokenStream *(*get_ts)(Analyzer *a, char *field, char *text));
109
+ void a_standard_destroy(Analyzer *a);
103
110
  Analyzer *whitespace_analyzer_create(bool lowercase);
104
111
  Analyzer *mb_whitespace_analyzer_create(bool lowercase);
105
112
 
@@ -118,7 +125,12 @@ Analyzer *mb_standard_analyzer_create_with_words(
118
125
  Analyzer *mb_standard_analyzer_create_with_words_len(
119
126
  const char **words, int len, bool lowercase);
120
127
 
121
- Analyzer *per_field_analyzer_create(Analyzer *def, bool destroy_subs);
128
+ typedef struct PerFieldAnalyzer {
129
+ HshTable *dict;
130
+ Analyzer *def;
131
+ } PerFieldAnalyzer;
132
+
133
+ Analyzer *per_field_analyzer_create(Analyzer *def);
122
134
  void pfa_add_field(Analyzer *self, char *field, Analyzer *analyzer);
123
135
 
124
136
  #endif
data/ext/array.c CHANGED
@@ -18,9 +18,8 @@ Array *ary_create(int allocate, void (*free_elem)(void *p))
18
18
  return ary;
19
19
  }
20
20
 
21
- void ary_destroy(void *p)
21
+ void ary_destroy(Array *ary)
22
22
  {
23
- Array *ary = (Array *)p;
24
23
  int i;
25
24
  if (ary->free_elem) {
26
25
  for (i = 0; i < ary->size; i++) {
data/ext/array.h CHANGED
@@ -9,7 +9,7 @@ typedef struct Array {
9
9
  } Array;
10
10
 
11
11
  Array *ary_create(int size, void (*free_elem)(void *p));
12
- void ary_destroy(void *p);
12
+ void ary_destroy(Array *ary);
13
13
  void ary_set(Array *ary, int index, void *value);
14
14
  void ary_append(Array *ary, void *value);
15
15
  void *ary_get(Array *ary, int index);
data/ext/bitvector.c CHANGED
@@ -20,15 +20,15 @@ BitVector *bv_create()
20
20
  return bv_create_size(BV_INIT_CAPA);
21
21
  }
22
22
 
23
- void bv_destroy(void *p)
23
+ void bv_destroy(BitVector *bv)
24
24
  {
25
- BitVector *bv = (BitVector *)p;
26
25
  free(bv->bits);
27
26
  free(bv);
28
27
  }
29
28
 
30
29
  void bv_set(BitVector *bv, int bit)
31
30
  {
31
+ uchar *byte_p;
32
32
  int byte = bit>>3;
33
33
  uchar bitmask = 1<<(bit&7);
34
34
  if (bv->size <= byte) {
@@ -41,7 +41,7 @@ void bv_set(BitVector *bv, int bit)
41
41
  bv->capa = capa;
42
42
  }
43
43
  }
44
- uchar *byte_p = &(bv->bits[byte]);
44
+ byte_p = &(bv->bits[byte]);
45
45
  if ((bitmask & *byte_p) == 0) {
46
46
  bv->count++;
47
47
  *byte_p |= bitmask;
@@ -63,10 +63,14 @@ void bv_clear(BitVector *bv)
63
63
 
64
64
  void bv_unset(BitVector *bv, int bit)
65
65
  {
66
+ uchar *byte_p;
67
+ uchar bitmask;
66
68
  int byte = bit>>3;
69
+
67
70
  if (byte >= bv->size) return;
68
- uchar *byte_p = &(bv->bits[byte]);
69
- uchar bitmask = 1<<(bit&7);
71
+
72
+ byte_p = &(bv->bits[byte]);
73
+ bitmask = 1<<(bit&7);
70
74
  if ((bitmask & *byte_p) > 0) {
71
75
  bv->count--;
72
76
  *byte_p &= ~bitmask;
@@ -115,7 +119,7 @@ BitVector *bv_read(Store *store, char *name)
115
119
  {
116
120
  BitVector *bv = ALLOC(BitVector);
117
121
  InStream *is = store->open_input(store, name);
118
- bv->capa = bv->size = is_read_vint(is);
122
+ bv->capa = bv->size = (int)is_read_vint(is);
119
123
  bv->bits = ALLOC_N(uchar, bv->capa);
120
124
  is_read_bytes(is, bv->bits, 0, bv->size);
121
125
  is_close(is);
data/ext/bitvector.h CHANGED
@@ -15,7 +15,7 @@ typedef struct BitVector {
15
15
 
16
16
  BitVector *bv_create();;
17
17
  BitVector *bv_create_size(int size);
18
- void bv_destroy(void *bv);
18
+ void bv_destroy(BitVector *bv);
19
19
  void bv_set(BitVector *bv, int bit);
20
20
  int bv_get(BitVector *bv, int bit);
21
21
  void bv_clear(BitVector *bv);
@@ -24,6 +24,6 @@ void bv_write(BitVector *bv, Store *store, char *name);
24
24
  BitVector *bv_read(Store *store, char *name);
25
25
  void bv_scan_reset(BitVector *bv);
26
26
  int bv_scan_next(BitVector *bv);
27
- int bv_scan_next_from(BitVector *bv, int from);
27
+ int bv_scan_next_from(BitVector *bv, register const int from);
28
28
 
29
29
  #endif
data/ext/compound_io.c CHANGED
@@ -1,4 +1,5 @@
1
1
  #include "index.h"
2
+
2
3
  static char * const ALREADY_CLOSED_MSG = "Already closed";
3
4
  static char * const STREAM_CLOSED_MSG = "Stream closed";
4
5
  static char * const MISSING_FILE_MSG = "No sub-file found";
@@ -8,6 +9,8 @@ static char * const FILE_OFFSET_MSG = "Difference in the output file offsets"
8
9
  " does not match the original file length";
9
10
  static char * const NO_FILES_TO_MERGE_MSG = "No Files to merge into the compound file";
10
11
 
12
+ extern void store_destroy(Store *store);
13
+
11
14
  /****************************************************************************
12
15
  *
13
16
  * CompoundStore
@@ -26,10 +29,11 @@ void cmpd_touch(Store *store, char *filename)
26
29
 
27
30
  int cmpd_exists(Store *store, char *filename)
28
31
  {
29
- if (h_get(store->dir.cmpd->entries, filename) != NULL)
32
+ if (h_get(store->dir.cmpd->entries, filename) != NULL) {
30
33
  return true;
31
- else
34
+ } else {
32
35
  return false;
36
+ }
33
37
  }
34
38
 
35
39
  /**
@@ -63,9 +67,8 @@ void cmpd_clear(Store *store)
63
67
  RAISE(UNSUPPORTED_ERROR, UNSUPPORTED_ERROR_MSG);
64
68
  }
65
69
 
66
- void cmpd_close(Store *store)
70
+ void cmpd_close_i(Store *store)
67
71
  {
68
- mutex_lock(&store->mutex);
69
72
  CompoundStore *cmpd = store->dir.cmpd;
70
73
  if (cmpd->stream == NULL)
71
74
  RAISE(IO_ERROR, ALREADY_CLOSED_MSG);
@@ -143,6 +146,7 @@ InStream *cmpd_create_input(InStream *sub_is, int offset, int length)
143
146
 
144
147
  InStream *cmpd_open_input(Store *store, const char *filename)
145
148
  {
149
+ FileEntry *entry;
146
150
  CompoundStore *cmpd = store->dir.cmpd;
147
151
  InStream *is;
148
152
 
@@ -152,7 +156,7 @@ InStream *cmpd_open_input(Store *store, const char *filename)
152
156
  RAISE(IO_ERROR, STREAM_CLOSED_MSG);
153
157
  }
154
158
 
155
- FileEntry *entry = (FileEntry *)h_get(cmpd->entries, filename);
159
+ entry = (FileEntry *)h_get(cmpd->entries, filename);
156
160
  if (entry == NULL) {
157
161
  mutex_unlock(&store->mutex);
158
162
  RAISE(IO_ERROR, MISSING_FILE_MSG);
@@ -183,6 +187,9 @@ void cmpd_close_lock(Lock *lock)
183
187
 
184
188
  Store *open_cmpd_store(Store *store, const char *name)
185
189
  {
190
+ int count, i, offset;
191
+ char *fname;
192
+ FileEntry *entry;
186
193
  Store * volatile new_store = NULL;
187
194
  CompoundStore * volatile cmpd = NULL;
188
195
  InStream * volatile is = NULL;
@@ -193,16 +200,14 @@ Store *open_cmpd_store(Store *store, const char *name)
193
200
 
194
201
  cmpd->store = store;
195
202
  cmpd->name = name;
196
- cmpd->entries = h_new_str(&efree, &efree);
203
+ cmpd->entries = h_new_str(&free, &free);
197
204
  is = cmpd->stream = store->open_input(store, cmpd->name);
198
205
 
199
206
  // read the directory and init files
200
- int count = is_read_vint(is);
201
- FileEntry *entry = NULL;
202
- int i, offset;
203
- char *fname;
207
+ count = (int)is_read_vint(is);
208
+ entry = NULL;
204
209
  for (i = 0; i < count; i++) {
205
- offset = is_read_long(is);
210
+ offset = (int)is_read_long(is);
206
211
  fname = is_read_string(is);
207
212
 
208
213
  if (entry != NULL) {
@@ -231,9 +236,9 @@ Store *open_cmpd_store(Store *store, const char *name)
231
236
  new_store->remove = &cmpd_remove;
232
237
  new_store->rename = &cmpd_rename;
233
238
  new_store->count = &cmpd_count;
234
- new_store->close = &cmpd_close;
235
239
  new_store->clear = &cmpd_clear;
236
240
  new_store->length = &cmpd_length;
241
+ new_store->close_i = &cmpd_close_i;
237
242
  new_store->create_output = &cmpd_create_output;
238
243
  new_store->open_input = &cmpd_open_input;
239
244
  new_store->open_lock = &cmpd_open_lock;
@@ -260,19 +265,13 @@ WFileEntry *wfe_create(char *name)
260
265
  return wfe;
261
266
  }
262
267
 
263
- void wfe_destroy(void *p)
264
- {
265
- WFileEntry *wfe = (WFileEntry *)p;
266
- efree(wfe);
267
- }
268
-
269
268
  CompoundWriter *open_cw(Store *store, char *name)
270
269
  {
271
270
  CompoundWriter *cw = ALLOC(CompoundWriter);
272
271
  cw->store = store;
273
272
  cw->name = name;
274
273
  cw->ids = hs_str_create(NULL);
275
- cw->file_entries = ary_create(1, &wfe_destroy);
274
+ cw->file_entries = ary_create(1, &free);
276
275
  cw->merged = false;
277
276
  return cw;
278
277
  }
@@ -290,14 +289,16 @@ void cw_add_file(CompoundWriter *cw, char *id)
290
289
  void cw_copy_file(CompoundWriter *cw, WFileEntry *src, OutStream *os)
291
290
  {
292
291
  int start_ptr = os_pos(os);
292
+ int end_ptr;
293
293
  int remainder, length, len;
294
-
294
+ uchar buffer[BUFFER_SIZE];
295
+
295
296
  InStream *is = cw->store->open_input(cw->store, src->name);
296
297
 
297
298
  TRY
298
299
  remainder = length = is_length(is);
299
300
 
300
- uchar buffer[BUFFER_SIZE];
301
+
301
302
  while (remainder > 0) {
302
303
  len = MIN(remainder, BUFFER_SIZE);
303
304
  is_read_bytes(is, buffer, 0, len);
@@ -310,9 +311,9 @@ void cw_copy_file(CompoundWriter *cw, WFileEntry *src, OutStream *os)
310
311
  RAISE(IO_ERROR, REMAINDER_ERROR_MSG);
311
312
 
312
313
  // Verify that the output length diff is equal to original file
313
- int end_ptr = os_pos(os);
314
- int diff = end_ptr - start_ptr;
315
- if (diff != length)
314
+ end_ptr = os_pos(os);
315
+ len = end_ptr - start_ptr;
316
+ if (len != length)
316
317
  RAISE(IO_ERROR, FILE_OFFSET_MSG);
317
318
 
318
319
  XFINALLY
@@ -322,13 +323,16 @@ void cw_copy_file(CompoundWriter *cw, WFileEntry *src, OutStream *os)
322
323
 
323
324
  void cw_close(CompoundWriter *cw)
324
325
  {
326
+ OutStream * volatile os = NULL;
327
+ int i;
328
+ WFileEntry *wfe;
329
+
325
330
  if (cw->merged) RAISE(STATE_ERROR, ALREADY_MERGED_MSG);
326
331
  if (cw->ids->size <= 0)
327
332
  RAISE(STATE_ERROR, NO_FILES_TO_MERGE_MSG);
328
333
 
329
334
  cw->merged = true;
330
335
 
331
- OutStream * volatile os = NULL;
332
336
  TRY
333
337
  os = cw->store->create_output(cw->store, cw->name);
334
338
  os_write_vint(os, cw->file_entries->size);
@@ -336,8 +340,7 @@ void cw_close(CompoundWriter *cw)
336
340
  /* Write the directory with all offsets at 0.
337
341
  * Remember the positions of directory entries so that we can adjust the
338
342
  * offsets later */
339
- int i;
340
- WFileEntry *wfe;
343
+
341
344
  for (i = 0; i < cw->file_entries->size; i++) {
342
345
  wfe = (WFileEntry *)cw->file_entries->elems[i];
343
346
  wfe->dir_offset = os_pos(os);
data/ext/document.c CHANGED
@@ -1,4 +1,4 @@
1
- #include <document.h>
1
+ #include "document.h"
2
2
  #include <string.h>
3
3
 
4
4
  /****************************************************************************
@@ -26,7 +26,7 @@ inline void df_set(DocField *df, const char *name,
26
26
  RAISE(ARG_ERROR, INDEX_NO_TV_YES_MSG);
27
27
  df->name = estrdup(name);
28
28
  df->data = data;
29
- df->blen = strlen(data);
29
+ df->blen = (int)strlen(data);
30
30
  df_set_store(df, store);
31
31
  df_set_index(df, index);
32
32
  df_set_term_vector(df, tv);
@@ -53,19 +53,17 @@ DocField *df_clone(DocField *self)
53
53
  return clone;
54
54
  }
55
55
 
56
- void df_destroy(void *p)
56
+ void df_destroy(DocField *df)
57
57
  {
58
- DocField *df = (DocField *)p;
59
58
  free(df->name);
60
- free(p);
59
+ free(df);
61
60
  }
62
61
 
63
- void df_destroy_data(void *p)
62
+ void df_destroy_data(DocField *df)
64
63
  {
65
- DocField *df = (DocField *)p;
66
64
  free(df->data);
67
65
  free(df->name);
68
- free(p);
66
+ free(df);
69
67
  }
70
68
 
71
69
  /*
@@ -161,10 +159,13 @@ void df_set_term_vector(DocField *df, int tv)
161
159
  */
162
160
  DocField *df_create_binary(char *name, char *data, int blen, int store)
163
161
  {
162
+ DocField *df;
163
+
164
164
  if (store == DF_STORE_NO) {
165
165
  RAISE(ARG_ERROR, BIN_FIELD_STORE_NO_MSG);
166
166
  }
167
- DocField *df = df_create(name, data, store, DF_INDEX_NO, DF_TERM_VECTOR_NO);
167
+
168
+ df = df_create(name, data, store, DF_INDEX_NO, DF_TERM_VECTOR_NO);
168
169
  df->is_binary = true;
169
170
  df->blen = blen;
170
171
  return df;
@@ -203,27 +204,26 @@ char *df_to_s(DocField *self)
203
204
  Document *doc_create()
204
205
  {
205
206
  Document *doc = ALLOC(Document);
206
- doc->fields = h_new_str(&free, &ary_destroy);
207
+ doc->fields = h_new_str(&free, (free_ft)&ary_destroy);
207
208
  doc->fcnt = 0;
208
209
  doc->dfcnt = 0;
209
210
  doc->field_arr = NULL;
210
211
  doc->df_arr = NULL;
211
212
  doc->boost = 1.0;
212
- doc->free_data = &df_destroy_data;
213
+ doc->free_data = (free_ft)&df_destroy_data;
213
214
  return doc;
214
215
  }
215
216
 
216
217
  Document *doc_create_keep_data()
217
218
  {
218
219
  Document *doc = doc_create();
219
- doc->free_data = df_destroy;
220
+ doc->free_data = (free_ft)&df_destroy;
220
221
  return doc;
221
222
  }
222
223
 
223
- void doc_destroy(void *p)
224
+ void doc_destroy(Document *doc)
224
225
  {
225
226
  int i;
226
- Document *doc = (Document *)p;
227
227
  if (doc->free_data) {
228
228
  for (i = 0; i < doc->dfcnt; i++) {
229
229
  doc->free_data(doc->df_arr[i]);
@@ -349,7 +349,7 @@ char *doc_to_s(Document *doc)
349
349
  char **df_strs = ALLOC_N(char *, doc->dfcnt);
350
350
  for (i = 0; i < doc->dfcnt; i++) {
351
351
  df_strs[i] = df_to_s(doc->df_arr[i]);
352
- len += strlen(df_strs[i]) + 3;
352
+ len += (int)strlen(df_strs[i]) + 3;
353
353
  }
354
354
  str_ptr = str = ALLOC_N(char, len);
355
355
  sprintf(str_ptr, "Document {\n");
data/ext/document.h CHANGED
@@ -34,7 +34,7 @@ enum {
34
34
  typedef struct DocField {
35
35
  char *name;
36
36
  char *data;
37
- int blen; // This is used for binary fields only to store the data length
37
+ int blen; /* used for binary fields to store data length */
38
38
  float boost;
39
39
  bool is_stored : 1;
40
40
  bool is_compressed : 1;
@@ -50,8 +50,8 @@ typedef struct DocField {
50
50
  DocField *df_create(const char *name, char *data, int store, int index, int tv);
51
51
  DocField *df_clone(DocField *self);
52
52
  void df_set(DocField *df, const char *name, char *data, int store, int index, int tv);
53
- void df_destroy(void *p);
54
- void df_destroy_data(void *p);
53
+ void df_destroy(DocField *df);
54
+ void df_destroy_data(DocField *df);
55
55
  void df_set_store(DocField *df, int store);
56
56
  void df_set_index(DocField *df, int index);
57
57
  void df_set_term_vector(DocField *df, int tv);
@@ -71,12 +71,12 @@ typedef struct Document {
71
71
  DocField **df_arr;
72
72
  int dfcnt;
73
73
  float boost;
74
- void (*free_data)(void *p);
74
+ free_ft free_data;
75
75
  } Document;
76
76
 
77
77
  Document *doc_create();
78
78
  Document *doc_create_keep_data();
79
- void doc_destroy(void *p);
79
+ void doc_destroy(Document *doc);
80
80
  void doc_add_field(Document *doc, DocField *df);
81
81
  DocField *doc_get_field(Document *doc, const char *fname);
82
82
  Array *doc_get_fields(Document *doc, const char *fname);
data/ext/except.c CHANGED
@@ -1,6 +1,8 @@
1
1
  #include "global.h"
2
2
  #include "except.h"
3
3
 
4
+ bool except_show_pos = true;
5
+
4
6
  char * const UNSUPPORTED_ERROR_MSG = "Unsupported operation";
5
7
  char * const EOF_ERROR_MSG = "Read past end of file";
6
8