ferret 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/ext/Makefile +2 -2
  2. data/ext/ferret.c +27 -2
  3. data/ext/ferret.h +59 -16
  4. data/ext/ferret_ext.so +0 -0
  5. data/ext/index_io.c +72 -77
  6. data/ext/priority_queue.c +150 -145
  7. data/ext/ram_directory.c +47 -42
  8. data/ext/segment_merge_queue.c +4 -8
  9. data/ext/segment_term_enum.c +324 -0
  10. data/ext/similarity.c +59 -0
  11. data/ext/string_helper.c +2 -2
  12. data/ext/tags +150 -46
  13. data/ext/term.c +107 -152
  14. data/ext/term_buffer.c +105 -174
  15. data/ext/term_infos_reader.c +54 -0
  16. data/ext/terminfo.c +160 -0
  17. data/ext/token.c +93 -0
  18. data/lib/ferret.rb +1 -1
  19. data/lib/ferret/analysis/analyzers.rb +18 -0
  20. data/lib/ferret/analysis/standard_tokenizer.rb +19 -14
  21. data/lib/ferret/analysis/token.rb +8 -1
  22. data/lib/ferret/analysis/tokenizers.rb +10 -5
  23. data/lib/ferret/document/field.rb +33 -11
  24. data/lib/ferret/index/document_writer.rb +3 -2
  25. data/lib/ferret/index/field_infos.rb +38 -12
  26. data/lib/ferret/index/fields_io.rb +10 -4
  27. data/lib/ferret/index/index.rb +20 -4
  28. data/lib/ferret/index/index_reader.rb +19 -4
  29. data/lib/ferret/index/index_writer.rb +1 -1
  30. data/lib/ferret/index/multi_reader.rb +21 -7
  31. data/lib/ferret/index/segment_merge_info.rb +24 -22
  32. data/lib/ferret/index/segment_merge_queue.rb +2 -2
  33. data/lib/ferret/index/segment_merger.rb +28 -11
  34. data/lib/ferret/index/segment_reader.rb +19 -4
  35. data/lib/ferret/index/segment_term_enum.rb +3 -11
  36. data/lib/ferret/index/term_buffer.rb +13 -16
  37. data/lib/ferret/index/term_doc_enum.rb +8 -5
  38. data/lib/ferret/index/term_enum.rb +2 -2
  39. data/lib/ferret/index/term_info.rb +1 -5
  40. data/lib/ferret/index/term_infos_io.rb +2 -0
  41. data/lib/ferret/query_parser/query_parser.tab.rb +7 -7
  42. data/lib/ferret/search/phrase_scorer.rb +0 -1
  43. data/lib/ferret/search/similarity.rb +2 -2
  44. data/lib/ferret/search/term_scorer.rb +2 -2
  45. data/lib/ferret/store/directory.rb +2 -0
  46. data/lib/ferret/store/fs_store.rb +16 -3
  47. data/lib/ferret/store/ram_store.rb +2 -2
  48. data/test/unit/document/tc_field.rb +9 -0
  49. data/test/unit/index/tc_field_infos.rb +29 -21
  50. data/test/unit/index/tc_index.rb +44 -7
  51. data/test/unit/index/tc_term_buffer.rb +3 -3
  52. data/test/unit/index/tc_term_info.rb +1 -1
  53. data/test/unit/query_parser/tc_query_parser.rb +1 -1
  54. data/test/unit/search/tc_index_searcher.rb +3 -0
  55. data/test/unit/store/tc_fs_store.rb +47 -16
  56. data/test/unit/store/tc_ram_store.rb +1 -1
  57. metadata +8 -3
data/ext/Makefile CHANGED
@@ -71,8 +71,8 @@ extout_prefix =
71
71
  target_prefix =
72
72
  LOCAL_LIBS =
73
73
  LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc
74
- SRCS = index_io.c term_buffer.c ram_directory.c priority_queue.c string_helper.c segment_merge_queue.c ferret.c term.c util.c
75
- OBJS = index_io.o term_buffer.o ram_directory.o priority_queue.o string_helper.o segment_merge_queue.o ferret.o term.o util.o
74
+ SRCS = index_io.c term_buffer.c ram_directory.c priority_queue.c string_helper.c segment_merge_queue.c ferret.c term.c util.c token.c segment_term_enum.c terminfo.c term_infos_reader.c similarity.c
75
+ OBJS = index_io.o term_buffer.o ram_directory.o priority_queue.o string_helper.o segment_merge_queue.o ferret.o term.o util.o token.o segment_term_enum.o terminfo.o term_infos_reader.o similarity.o
76
76
  TARGET = ferret_ext
77
77
  DLLIB = $(TARGET).so
78
78
  STATIC_LIB =
data/ext/ferret.c CHANGED
@@ -1,13 +1,18 @@
1
1
  #include "ferret.h"
2
2
 
3
3
  /* IDs */
4
- ID frt_newobj;
4
+ ID id_new;
5
+ ID id_close;
6
+ ID id_size;
7
+ ID id_iv_size;
5
8
 
6
9
  /* Modules */
7
10
  VALUE mFerret;
8
11
  VALUE mStore;
9
12
  VALUE mIndex;
10
13
  VALUE mUtils;
14
+ VALUE mAnalysis;
15
+ VALUE mSearch;
11
16
  VALUE mStringHelper;
12
17
 
13
18
  /* Classes */
@@ -22,27 +27,47 @@ VALUE cRAMIndexOut;
22
27
  VALUE cRAMIndexIn;
23
28
  VALUE cTerm;
24
29
  VALUE cTermBuffer;
30
+ VALUE cTermInfo;
31
+ VALUE cToken;
25
32
  VALUE cPriorityQueue;
26
33
  VALUE cSegmentMergeQueue;
34
+ VALUE cSegmentTermEnum;
35
+ VALUE cTermEnum;
36
+ VALUE cTermInfosReader;
37
+ VALUE cSimilarity;
38
+ VALUE cDefaultSimilarity;
27
39
 
28
40
  void
29
41
  Init_ferret_ext(void)
30
42
  {
31
43
  /* IDs */
32
- frt_newobj = rb_intern("new");
44
+ id_new = rb_intern("new");
45
+ id_close = rb_intern("close");
46
+ id_size = rb_intern("size");
47
+ id_iv_size = rb_intern("@size");
33
48
 
34
49
  /* Modules */
35
50
  mFerret = rb_define_module("Ferret");
36
51
  mStore = rb_define_module_under(mFerret, "Store");
37
52
  mIndex = rb_define_module_under(mFerret, "Index");
38
53
  mUtils = rb_define_module_under(mFerret, "Utils");
54
+ mAnalysis = rb_define_module_under(mFerret, "Analysis");
55
+ mSearch = rb_define_module_under(mFerret, "Search");
56
+
57
+ /* Classes */
58
+ cTermEnum = rb_define_class_under(mIndex, "TermEnum", rb_cObject);
39
59
 
40
60
  /* Inits */
41
61
  Init_indexio();
42
62
  Init_term();
43
63
  Init_term_buffer();
64
+ Init_term_info();
65
+ Init_term_infos_reader();
66
+ Init_token();
44
67
  Init_priority_queue();
45
68
  Init_segment_merge_queue();
69
+ Init_segment_term_enum();
46
70
  Init_ram_directory();
47
71
  Init_string_helper();
72
+ Init_similarity();
48
73
  }
data/ext/ferret.h CHANGED
@@ -15,24 +15,23 @@ typedef struct IndexBuffer {
15
15
  } IndexBuffer;
16
16
 
17
17
  typedef struct Term {
18
- char *field;
19
- char *text;
20
- int flen;
21
- int tlen;
18
+ VALUE field;
19
+ char *text;
20
+ int tlen;
22
21
  } Term;
23
22
 
24
23
  typedef struct PriorityQueue {
25
- VALUE *heap;
26
- int len;
27
- int size;
24
+ VALUE *heap;
25
+ int len;
26
+ int size;
28
27
  } PriorityQueue;
29
28
 
30
- typedef struct TermBuffer {
31
- char *field;
32
- char *text;
33
- int flen;
34
- int tlen;
35
- } TermBuffer;
29
+ typedef struct TermInfo {
30
+ int doc_freq;
31
+ long freq_pointer;
32
+ long prox_pointer;
33
+ int skip_offset;
34
+ } TermInfo;
36
35
 
37
36
  typedef struct RAMFile {
38
37
  void **buffers;
@@ -42,14 +41,38 @@ typedef struct RAMFile {
42
41
  int length;
43
42
  } RAMFile;
44
43
 
44
+ typedef struct SegmentTermEnum {
45
+ VALUE input;
46
+ IndexBuffer *buf;
47
+ VALUE field_infos;
48
+ VALUE rtb_curr;
49
+ Term *tb_curr;
50
+ VALUE rtb_prev;
51
+ Term *tb_prev;
52
+ TermInfo *ti;
53
+ int is_index;
54
+ int size;
55
+ int position;
56
+ int index_pointer;
57
+ int index_interval;
58
+ int skip_interval;
59
+ int format;
60
+ int format_m1skip_interval;
61
+ } SegmentTermEnum;
62
+
45
63
  /* IDs */
46
- extern ID frt_newobj;
64
+ extern ID id_new;
65
+ extern ID id_close;
66
+ extern ID id_size;
67
+ extern ID id_iv_size;
47
68
 
48
69
  /* Modules */
49
70
  extern VALUE mFerret;
50
71
  extern VALUE mStore;
51
72
  extern VALUE mIndex;
52
73
  extern VALUE mUtils;
74
+ extern VALUE mAnalysis;
75
+ extern VALUE mSearch;
53
76
  extern VALUE mStringHelper;
54
77
 
55
78
  /* Classes */
@@ -64,22 +87,42 @@ extern VALUE cRAMIndexOut;
64
87
  extern VALUE cRAMIndexIn;
65
88
  extern VALUE cTerm;
66
89
  extern VALUE cTermBuffer;
90
+ extern VALUE cTermInfo;
91
+ extern VALUE cToken;
67
92
  extern VALUE cPriorityQueue;
68
93
  extern VALUE cSegmentMergeQueue;
94
+ extern VALUE cTermEnum;
95
+ extern VALUE cTermInfosReader;
96
+ extern VALUE cSegmentTermEnum;
97
+ extern VALUE cSimilarity;
98
+ extern VALUE cDefaultSimilarity;
69
99
 
70
100
  /* Ferret Inits */
71
101
  extern void Init_indexio();
72
102
  extern void Init_term();
73
- extern void Init_priority_queue();
103
+ extern void Init_term_info();
104
+ extern void Init_term_infos_reader();
74
105
  extern void Init_term_buffer();
106
+ extern void Init_priority_queue();
107
+ extern void Init_token();
75
108
  extern void Init_segment_merge_queue();
109
+ extern void Init_segment_term_enum();
76
110
  extern void Init_ram_directory();
77
111
  extern void Init_string_helper();
112
+ extern void Init_similarity();
78
113
 
79
114
  /* External functions */
80
115
  extern int frt_hash(register char *p, register int len);
81
- extern unsigned long long frt_read_vint(VALUE self);
116
+ extern unsigned long long frt_read_vint(VALUE self, IndexBuffer *my_buf);
117
+ extern VALUE frt_indexin_read_long(VALUE self);
118
+ extern VALUE frt_indexin_read_int(VALUE self);
119
+ extern VALUE frt_indexin_seek(VALUE self, VALUE pos);
120
+ extern VALUE frt_termbuffer_to_term(VALUE self);
82
121
  extern void frt_read_chars(VALUE self, char *buf, int offset, int len);
83
122
  extern void frt_write_bytes(VALUE self, byte_t *buf, int len);
84
123
  extern int frt_term_compare_to_int(VALUE self, VALUE rother);
124
+ extern VALUE frt_termbuffer_init_copy(VALUE self, VALUE rother);
125
+ extern VALUE frt_termbuffer_read(VALUE self, VALUE input, VALUE info);
126
+ extern inline int frt_term_cmp(Term *t1, Term *t2);
127
+
85
128
  #endif
data/ext/ferret_ext.so CHANGED
Binary file
data/ext/index_io.c CHANGED
@@ -12,43 +12,37 @@ void
12
12
  frt_indexbuffer_free(void *p)
13
13
  {
14
14
  IndexBuffer *my_buf = (IndexBuffer *)p;
15
- free((void *)my_buf->buffer);
15
+ free(my_buf->buffer);
16
16
  free(p);
17
17
  }
18
18
 
19
19
  static VALUE
20
20
  frt_indexbuffer_alloc(VALUE klass)
21
21
  {
22
- byte_t *buffer;
23
22
  IndexBuffer *my_buf;
24
23
 
25
- my_buf = (IndexBuffer *)ALLOC(IndexBuffer);
26
- buffer = (byte_t *)ALLOC_N(byte_t, BUFFER_SIZE);
27
-
28
- my_buf->start = 0;
29
- my_buf->pos = 0;
30
- my_buf->len = 0;
31
- my_buf->buffer = buffer;
24
+ my_buf = ALLOC(IndexBuffer);
25
+ MEMZERO(my_buf, IndexBuffer, 1);
26
+ my_buf->buffer = ALLOC_N(byte_t, BUFFER_SIZE);
32
27
 
33
28
  return Data_Wrap_Struct(klass, NULL, frt_indexbuffer_free, my_buf);
34
29
  }
35
30
 
31
+ #define GET_MY_BUF IndexBuffer *my_buf; Data_Get_Struct(self, IndexBuffer, my_buf)
36
32
  static VALUE
37
33
  frt_indexin_init_copy(VALUE self, VALUE orig)
38
34
  {
39
35
  IndexBuffer *orig_buf;
40
- IndexBuffer *my_buf;
41
36
  int len;
37
+ GET_MY_BUF;
42
38
  if (self == orig)
43
39
  return self;
44
40
 
45
- Data_Get_Struct(self, IndexBuffer, my_buf);
46
41
  Data_Get_Struct(orig, IndexBuffer, orig_buf);
47
42
 
48
43
  len = orig_buf->len;
49
44
  my_buf->len = len;
50
45
  my_buf->pos = orig_buf->pos;
51
- my_buf->len = orig_buf->len;
52
46
  my_buf->start = orig_buf->start;
53
47
 
54
48
  MEMCPY(my_buf->buffer, orig_buf->buffer, byte_t, len);
@@ -59,12 +53,11 @@ frt_indexin_init_copy(VALUE self, VALUE orig)
59
53
  static VALUE
60
54
  frt_indexin_refill(VALUE self)
61
55
  {
62
- IndexBuffer *my_buf;
63
56
  long start;
57
+ VALUE rStr;
64
58
  int stop, len_to_read;
65
59
  int input_len = FIX2INT(rb_funcall(self, frt_length, 0, NULL));
66
-
67
- Data_Get_Struct(self, IndexBuffer, my_buf);
60
+ GET_MY_BUF;
68
61
 
69
62
  start = my_buf->start + my_buf->pos;
70
63
  stop = start + BUFFER_SIZE;
@@ -77,7 +70,7 @@ frt_indexin_refill(VALUE self)
77
70
  rb_raise(rb_eEOFError, "IndexInput: Read past End of File");
78
71
  }
79
72
 
80
- VALUE rStr = rb_str_new((char *)my_buf->buffer, BUFFER_SIZE);
73
+ rStr = rb_str_new((char *)my_buf->buffer, BUFFER_SIZE);
81
74
  rb_funcall(self, frt_read_internal, 3,
82
75
  rStr, INT2FIX(0), INT2FIX(len_to_read));
83
76
 
@@ -91,23 +84,19 @@ frt_indexin_refill(VALUE self)
91
84
  return Qnil;
92
85
  }
93
86
 
94
- byte_t
95
- frt_read_byte(VALUE self)
87
+ static inline byte_t
88
+ frt_read_byte(VALUE self, IndexBuffer *my_buf)
96
89
  {
97
- IndexBuffer *my_buf;
98
- Data_Get_Struct(self, IndexBuffer, my_buf);
99
-
100
90
  if (my_buf->pos >= my_buf->len)
101
91
  frt_indexin_refill(self);
102
-
103
- byte_t res = my_buf->buffer[my_buf->pos++];
104
- return res;
92
+ return my_buf->buffer[my_buf->pos++];
105
93
  }
106
94
 
107
95
  static VALUE
108
96
  frt_indexin_read_byte(VALUE self)
109
97
  {
110
- return INT2FIX(frt_read_byte(self));
98
+ GET_MY_BUF;
99
+ return INT2FIX(frt_read_byte(self, my_buf));
111
100
  }
112
101
 
113
102
  static VALUE
@@ -122,16 +111,17 @@ static VALUE
122
111
  frt_read_bytes(VALUE self, VALUE rbuffer, int offset, int len)
123
112
  {
124
113
  int i;
125
- IndexBuffer *my_buf;
126
114
  VALUE rbuf = StringValue(rbuffer);
127
115
 
116
+ GET_MY_BUF;
117
+
128
118
  if (RSTRING(rbuf)->len < (offset + len)) {
129
119
  rb_str_resize(rbuf, offset + len);
130
120
  }
131
121
  if ((len + offset) < BUFFER_SIZE) {
132
122
  rb_str_modify(rbuf);
133
123
  for (i = offset; i < offset + len; i++) {
134
- RSTRING(rbuf)->ptr[i] = frt_read_byte(self);
124
+ RSTRING(rbuf)->ptr[i] = frt_read_byte(self, my_buf);
135
125
  }
136
126
  } else {
137
127
  VALUE start = frt_indexin_pos(self);
@@ -139,8 +129,6 @@ frt_read_bytes(VALUE self, VALUE rbuffer, int offset, int len)
139
129
  rb_funcall(self, frt_read_internal, 3,
140
130
  rbuf, INT2FIX(offset), INT2FIX(len));
141
131
 
142
- Data_Get_Struct(self, IndexBuffer, my_buf);
143
-
144
132
  my_buf->start = my_buf->start + len;
145
133
  my_buf->pos = 0;
146
134
  my_buf->len = 0; /* trigger refill() on read() */
@@ -160,12 +148,12 @@ frt_indexin_read_bytes(VALUE self, VALUE rbuf, VALUE roffset, VALUE rlen)
160
148
  return frt_read_bytes(self, rbuf, offset, len);
161
149
  }
162
150
 
163
- static VALUE
151
+ VALUE
164
152
  frt_indexin_seek(VALUE self, VALUE rpos)
165
153
  {
166
154
  int pos = FIX2INT(rpos);
167
- IndexBuffer *my_buf;
168
- Data_Get_Struct(self, IndexBuffer, my_buf);
155
+
156
+ GET_MY_BUF;
169
157
 
170
158
  if ((pos >= my_buf->start) && (pos < (my_buf->start + my_buf->len))) {
171
159
  my_buf->pos = pos - my_buf->start; /* seek within buffer */
@@ -178,61 +166,65 @@ frt_indexin_seek(VALUE self, VALUE rpos)
178
166
  return Qnil;
179
167
  }
180
168
 
181
- static VALUE
169
+ VALUE
182
170
  frt_indexin_read_int(VALUE self)
183
171
  {
184
- return LONG2NUM(((long)frt_read_byte(self) << 24) |
185
- ((long)frt_read_byte(self) << 16) |
186
- ((long)frt_read_byte(self) << 8) |
187
- (long)frt_read_byte(self));
172
+ GET_MY_BUF;
173
+ return LONG2NUM(((long)frt_read_byte(self, my_buf) << 24) |
174
+ ((long)frt_read_byte(self, my_buf) << 16) |
175
+ ((long)frt_read_byte(self, my_buf) << 8) |
176
+ (long)frt_read_byte(self, my_buf));
188
177
  }
189
178
 
190
- static VALUE
179
+ VALUE
191
180
  frt_indexin_read_long(VALUE self)
192
181
  {
193
- return LL2NUM(((long long)frt_read_byte(self) << 56) |
194
- ((long long)frt_read_byte(self) << 48) |
195
- ((long long)frt_read_byte(self) << 40) |
196
- ((long long)frt_read_byte(self) << 32) |
197
- ((long long)frt_read_byte(self) << 24) |
198
- ((long long)frt_read_byte(self) << 16) |
199
- ((long long)frt_read_byte(self) << 8) |
200
- (long long)frt_read_byte(self));
182
+ GET_MY_BUF;
183
+ return LL2NUM(((long long)frt_read_byte(self, my_buf) << 56) |
184
+ ((long long)frt_read_byte(self, my_buf) << 48) |
185
+ ((long long)frt_read_byte(self, my_buf) << 40) |
186
+ ((long long)frt_read_byte(self, my_buf) << 32) |
187
+ ((long long)frt_read_byte(self, my_buf) << 24) |
188
+ ((long long)frt_read_byte(self, my_buf) << 16) |
189
+ ((long long)frt_read_byte(self, my_buf) << 8) |
190
+ (long long)frt_read_byte(self, my_buf));
201
191
  }
202
192
 
203
193
  static VALUE
204
194
  frt_indexin_read_uint(VALUE self)
205
195
  {
206
- return ULONG2NUM(((unsigned long)frt_read_byte(self) << 24) |
207
- ((unsigned long)frt_read_byte(self) << 16) |
208
- ((unsigned long)frt_read_byte(self) << 8) |
209
- (unsigned long)frt_read_byte(self));
196
+ GET_MY_BUF;
197
+ return ULONG2NUM(((unsigned long)frt_read_byte(self, my_buf) << 24) |
198
+ ((unsigned long)frt_read_byte(self, my_buf) << 16) |
199
+ ((unsigned long)frt_read_byte(self, my_buf) << 8) |
200
+ (unsigned long)frt_read_byte(self, my_buf));
210
201
  }
211
202
 
212
203
  static VALUE
213
204
  frt_indexin_read_ulong(VALUE self)
214
205
  {
215
- return ULL2NUM(((unsigned long long)frt_read_byte(self) << 56) |
216
- ((unsigned long long)frt_read_byte(self) << 48) |
217
- ((unsigned long long)frt_read_byte(self) << 40) |
218
- ((unsigned long long)frt_read_byte(self) << 32) |
219
- ((unsigned long long)frt_read_byte(self) << 24) |
220
- ((unsigned long long)frt_read_byte(self) << 16) |
221
- ((unsigned long long)frt_read_byte(self) << 8) |
222
- (unsigned long long)frt_read_byte(self));
206
+ GET_MY_BUF;
207
+ return ULL2NUM(((unsigned long long)frt_read_byte(self, my_buf) << 56) |
208
+ ((unsigned long long)frt_read_byte(self, my_buf) << 48) |
209
+ ((unsigned long long)frt_read_byte(self, my_buf) << 40) |
210
+ ((unsigned long long)frt_read_byte(self, my_buf) << 32) |
211
+ ((unsigned long long)frt_read_byte(self, my_buf) << 24) |
212
+ ((unsigned long long)frt_read_byte(self, my_buf) << 16) |
213
+ ((unsigned long long)frt_read_byte(self, my_buf) << 8) |
214
+ (unsigned long long)frt_read_byte(self, my_buf));
223
215
  }
224
216
 
225
217
  unsigned long long
226
- frt_read_vint(VALUE self)
218
+ frt_read_vint(VALUE self, IndexBuffer *my_buf)
227
219
  {
228
220
  register unsigned long long i, b;
229
221
  register int shift = 7;
230
222
 
231
- b = frt_read_byte(self);
223
+ b = frt_read_byte(self, my_buf);
232
224
  i = b & 0x7F; /* 0x7F = 0b01111111 */
233
225
 
234
226
  while ((b & 0x80) != 0) {/* 0x80 = 0b10000000 */
235
- b = frt_read_byte(self);
227
+ b = frt_read_byte(self, my_buf);
236
228
  i |= (b & 0x7F) << shift;
237
229
  shift += 7;
238
230
  }
@@ -243,27 +235,34 @@ frt_read_vint(VALUE self)
243
235
  static VALUE
244
236
  frt_indexin_read_vint(VALUE self)
245
237
  {
246
- return ULL2NUM(frt_read_vint(self));
238
+ GET_MY_BUF;
239
+ return ULL2NUM(frt_read_vint(self, my_buf));
247
240
  }
248
241
 
249
242
  void
250
243
  frt_read_chars(VALUE self, char* buffer, int off, int len)
251
244
  {
252
- /* byte_t b, b1, b2; */
253
- int end, i;
245
+ /* byte_t b, b1, b2; */
246
+ int end, i;
247
+
248
+ GET_MY_BUF;
254
249
 
255
- end = off + len;
250
+ end = off + len;
256
251
 
257
- for(i = off; i < end; i++) {
258
- buffer[i] = frt_read_byte(self);
252
+
253
+ for(i = off; i < end; i++) {
254
+ buffer[i] = frt_read_byte(self, my_buf);
259
255
  }
260
256
  }
261
257
 
262
258
  static VALUE
263
259
  frt_indexin_read_string(VALUE self)
264
260
  {
265
- int length = (int)frt_read_vint(self);
266
- char *str = (char *)ALLOC_N(char, length);
261
+ int length;
262
+ char *str;
263
+ GET_MY_BUF;
264
+ length = (int)frt_read_vint(self, my_buf);
265
+ str = ALLOC_N(char, length);
267
266
 
268
267
  frt_read_chars(self, str, 0, length);
269
268
 
@@ -279,8 +278,7 @@ frt_indexin_read_string(VALUE self)
279
278
  static VALUE
280
279
  frt_indexout_flush(VALUE self)
281
280
  {
282
- IndexBuffer *my_buf;
283
- Data_Get_Struct(self, IndexBuffer, my_buf);
281
+ GET_MY_BUF;
284
282
 
285
283
  rb_funcall(self, frt_flush_buffer, 2,
286
284
  rb_str_new((char *)my_buf->buffer, BUFFER_SIZE), INT2FIX(my_buf->pos));
@@ -294,8 +292,7 @@ frt_indexout_flush(VALUE self)
294
292
  static VALUE
295
293
  frt_write_byte(VALUE self, byte_t b)
296
294
  {
297
- IndexBuffer *my_buf;
298
- Data_Get_Struct(self, IndexBuffer, my_buf);
295
+ GET_MY_BUF;
299
296
 
300
297
  my_buf->buffer[my_buf->pos++] = b;
301
298
 
@@ -336,16 +333,14 @@ frt_indexout_write_bytes(VALUE self, VALUE rbuffer, VALUE rlen)
336
333
  static VALUE
337
334
  frt_indexout_pos(VALUE self)
338
335
  {
339
- IndexBuffer *my_buf;
340
- Data_Get_Struct(self, IndexBuffer, my_buf);
336
+ GET_MY_BUF;
341
337
  return INT2FIX(my_buf->start + my_buf->pos);
342
338
  }
343
339
 
344
340
  static VALUE
345
341
  frt_indexout_seek(VALUE self, VALUE pos)
346
342
  {
347
- IndexBuffer *my_buf;
348
- Data_Get_Struct(self, IndexBuffer, my_buf);
343
+ GET_MY_BUF;
349
344
 
350
345
  frt_indexout_flush(self);
351
346
  my_buf->start = FIX2INT(pos);