ferret 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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