ferret 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/Makefile +2 -2
- data/ext/ferret.c +27 -2
- data/ext/ferret.h +59 -16
- data/ext/ferret_ext.so +0 -0
- data/ext/index_io.c +72 -77
- data/ext/priority_queue.c +150 -145
- data/ext/ram_directory.c +47 -42
- data/ext/segment_merge_queue.c +4 -8
- data/ext/segment_term_enum.c +324 -0
- data/ext/similarity.c +59 -0
- data/ext/string_helper.c +2 -2
- data/ext/tags +150 -46
- data/ext/term.c +107 -152
- data/ext/term_buffer.c +105 -174
- data/ext/term_infos_reader.c +54 -0
- data/ext/terminfo.c +160 -0
- data/ext/token.c +93 -0
- data/lib/ferret.rb +1 -1
- data/lib/ferret/analysis/analyzers.rb +18 -0
- data/lib/ferret/analysis/standard_tokenizer.rb +19 -14
- data/lib/ferret/analysis/token.rb +8 -1
- data/lib/ferret/analysis/tokenizers.rb +10 -5
- data/lib/ferret/document/field.rb +33 -11
- data/lib/ferret/index/document_writer.rb +3 -2
- data/lib/ferret/index/field_infos.rb +38 -12
- data/lib/ferret/index/fields_io.rb +10 -4
- data/lib/ferret/index/index.rb +20 -4
- data/lib/ferret/index/index_reader.rb +19 -4
- data/lib/ferret/index/index_writer.rb +1 -1
- data/lib/ferret/index/multi_reader.rb +21 -7
- data/lib/ferret/index/segment_merge_info.rb +24 -22
- data/lib/ferret/index/segment_merge_queue.rb +2 -2
- data/lib/ferret/index/segment_merger.rb +28 -11
- data/lib/ferret/index/segment_reader.rb +19 -4
- data/lib/ferret/index/segment_term_enum.rb +3 -11
- data/lib/ferret/index/term_buffer.rb +13 -16
- data/lib/ferret/index/term_doc_enum.rb +8 -5
- data/lib/ferret/index/term_enum.rb +2 -2
- data/lib/ferret/index/term_info.rb +1 -5
- data/lib/ferret/index/term_infos_io.rb +2 -0
- data/lib/ferret/query_parser/query_parser.tab.rb +7 -7
- data/lib/ferret/search/phrase_scorer.rb +0 -1
- data/lib/ferret/search/similarity.rb +2 -2
- data/lib/ferret/search/term_scorer.rb +2 -2
- data/lib/ferret/store/directory.rb +2 -0
- data/lib/ferret/store/fs_store.rb +16 -3
- data/lib/ferret/store/ram_store.rb +2 -2
- data/test/unit/document/tc_field.rb +9 -0
- data/test/unit/index/tc_field_infos.rb +29 -21
- data/test/unit/index/tc_index.rb +44 -7
- data/test/unit/index/tc_term_buffer.rb +3 -3
- data/test/unit/index/tc_term_info.rb +1 -1
- data/test/unit/query_parser/tc_query_parser.rb +1 -1
- data/test/unit/search/tc_index_searcher.rb +3 -0
- data/test/unit/store/tc_fs_store.rb +47 -16
- data/test/unit/store/tc_ram_store.rb +1 -1
- metadata +8 -3
data/ext/term.c
CHANGED
@@ -10,179 +10,137 @@
|
|
10
10
|
void
|
11
11
|
frt_term_free(void *p)
|
12
12
|
{
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
Term *term = (Term *)p;
|
14
|
+
free(term->text);
|
15
|
+
free(p);
|
16
|
+
}
|
17
|
+
|
18
|
+
void
|
19
|
+
frt_term_mark(void *p)
|
20
|
+
{
|
21
|
+
Term *term = (Term *)p;
|
22
|
+
rb_gc_mark(term->field);
|
18
23
|
}
|
19
24
|
|
20
25
|
static VALUE
|
21
26
|
frt_term_alloc(VALUE klass)
|
22
27
|
{
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
VALUE rbuffer = Data_Wrap_Struct(klass, NULL, frt_term_free, term);
|
29
|
-
return rbuffer;
|
28
|
+
Term *term = ALLOC(Term);
|
29
|
+
MEMZERO(term, Term, 1);
|
30
|
+
term->field = Qnil;
|
31
|
+
return Data_Wrap_Struct(klass, frt_term_mark, frt_term_free, term);
|
30
32
|
}
|
31
33
|
|
34
|
+
#define GET_TERM Term *term; Data_Get_Struct(self, Term, term)
|
32
35
|
VALUE
|
33
36
|
frt_term_set(VALUE self, VALUE rfield, VALUE rtext)
|
34
37
|
{
|
35
|
-
|
36
|
-
|
37
|
-
int tlen = RSTRING(rtext)->len;
|
38
|
-
char *field = RSTRING(rfield)->ptr;
|
39
|
-
char *text = RSTRING(rtext)->ptr;
|
40
|
-
Data_Get_Struct(self, Term, term);
|
38
|
+
int tlen;
|
39
|
+
GET_TERM;
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return Qnil;
|
41
|
+
tlen = RSTRING(rtext)->len;
|
42
|
+
term->field = rfield;
|
43
|
+
REALLOC_N(term->text, char, tlen + 1);
|
44
|
+
MEMCPY(term->text, RSTRING(rtext)->ptr, char, tlen);
|
45
|
+
term->tlen = tlen;
|
46
|
+
|
47
|
+
return Qnil;
|
51
48
|
}
|
52
49
|
|
53
50
|
static VALUE
|
54
51
|
frt_term_init(VALUE self, VALUE rfield, VALUE rtext)
|
55
52
|
{
|
56
|
-
|
57
|
-
|
53
|
+
frt_term_set(self, rfield, rtext);
|
54
|
+
return self;
|
58
55
|
}
|
59
56
|
|
60
57
|
static VALUE
|
61
58
|
frt_term_get_text(VALUE self)
|
62
59
|
{
|
63
|
-
|
64
|
-
|
65
|
-
return rb_str_new(term->text, term->tlen);
|
60
|
+
GET_TERM;
|
61
|
+
return rb_str_new(term->text, term->tlen);
|
66
62
|
}
|
67
63
|
|
68
64
|
static VALUE
|
69
65
|
frt_term_set_text(VALUE self, VALUE rtext)
|
70
66
|
{
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
67
|
+
int tlen;
|
68
|
+
char *text;
|
69
|
+
GET_TERM;
|
70
|
+
tlen = RSTRING(rtext)->len;
|
71
|
+
text = RSTRING(rtext)->ptr;
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
73
|
+
REALLOC_N(term->text, char, tlen + 1);
|
74
|
+
|
75
|
+
MEMCPY(term->text, text, char, tlen);
|
76
|
+
term->tlen = tlen;
|
77
|
+
|
78
|
+
return Qnil;
|
82
79
|
}
|
83
80
|
|
84
81
|
static VALUE
|
85
82
|
frt_term_get_field(VALUE self)
|
86
83
|
{
|
87
|
-
|
88
|
-
|
89
|
-
return rb_str_new(term->field, term->flen);
|
84
|
+
GET_TERM;
|
85
|
+
return term->field;
|
90
86
|
}
|
91
87
|
|
92
88
|
static VALUE
|
93
89
|
frt_term_set_field(VALUE self, VALUE rfield)
|
94
90
|
{
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
Data_Get_Struct(self, Term, term);
|
99
|
-
|
100
|
-
REALLOC_N(term->field, char, flen + 1);
|
101
|
-
|
102
|
-
MEMCPY(term->field, field, char, flen);
|
103
|
-
term->flen = flen;
|
104
|
-
|
105
|
-
return Qnil;
|
91
|
+
GET_TERM;
|
92
|
+
term->field = rfield;
|
93
|
+
return Qnil;
|
106
94
|
}
|
107
95
|
|
108
96
|
VALUE
|
109
97
|
frt_term_to_s(VALUE self)
|
110
98
|
{
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
99
|
+
int tlen, flen;
|
100
|
+
char delim[] = ":";
|
101
|
+
char *res;
|
102
|
+
GET_TERM;
|
103
|
+
tlen = term->tlen;
|
104
|
+
flen = RSTRING(term->field)->len;
|
105
|
+
res = alloca(flen + tlen + 1);
|
106
|
+
|
107
|
+
MEMCPY(res, StringValuePtr(term->field), char, flen);
|
108
|
+
MEMCPY(res + flen, delim, char, 1);
|
109
|
+
MEMCPY(res + flen + 1, term->text, char, tlen);
|
110
|
+
return rb_str_new(res, tlen + flen + 1 );
|
111
|
+
}
|
112
|
+
|
113
|
+
inline int
|
114
|
+
frt_term_cmp(Term *t1, Term *t2)
|
115
|
+
{
|
116
|
+
int comp, size, my_len, o_len;
|
117
|
+
|
118
|
+
my_len = RSTRING(t1->field)->len;
|
119
|
+
o_len = RSTRING(t2->field)->len;
|
120
|
+
size = my_len >= o_len ? o_len : my_len;
|
121
|
+
comp = memcmp(RSTRING(t1->field)->ptr, RSTRING(t2->field)->ptr, size);
|
122
|
+
if (comp == 0) {
|
123
|
+
if (my_len == o_len) {
|
124
|
+
my_len = t1->tlen;
|
125
|
+
o_len = t2->tlen;
|
126
|
+
size = my_len >= o_len ? o_len : my_len;
|
127
|
+
comp = memcmp(t1->text, t2->text, size);
|
128
|
+
if(comp == 0 && my_len != o_len)
|
129
|
+
comp = my_len > o_len ? 1 : -1;
|
130
|
+
} else {
|
131
|
+
comp = my_len > o_len ? 1 : -1;
|
132
|
+
}
|
133
|
+
}
|
134
|
+
return comp;
|
123
135
|
}
|
124
136
|
|
125
|
-
VALUE
|
126
|
-
frt_term_compare_to(VALUE self, VALUE rother)
|
127
|
-
{
|
128
|
-
int comp, size, mylen, olen;
|
129
|
-
Term *term, *other;
|
130
|
-
Data_Get_Struct(self, Term, term);
|
131
|
-
Data_Get_Struct(rother, Term, other);
|
132
|
-
|
133
|
-
mylen = term->flen;
|
134
|
-
olen = other->flen;
|
135
|
-
size = mylen >= olen ? olen : mylen;
|
136
|
-
comp = memcmp(term->field, other->field, size);
|
137
|
-
if(comp == 0){
|
138
|
-
if(mylen == olen){
|
139
|
-
mylen = term->tlen;
|
140
|
-
olen = other->tlen;
|
141
|
-
size = mylen >= olen ? olen : mylen;
|
142
|
-
comp = memcmp(term->text, other->text, size);
|
143
|
-
if(comp == 0 && mylen != olen)
|
144
|
-
comp = mylen > olen ? 1 : -1;
|
145
|
-
} else
|
146
|
-
comp = mylen > olen ? 1 : -1;
|
147
|
-
}
|
148
|
-
/*
|
149
|
-
comp = strcmp(term->field, other->field);
|
150
|
-
if(comp == 0)
|
151
|
-
comp = strcmp(term->text, other->text);
|
152
|
-
*/
|
153
|
-
return INT2FIX(comp);
|
154
|
-
}
|
155
|
-
|
156
|
-
/* keep in synch with fuction above */
|
157
137
|
int
|
158
138
|
frt_term_compare_to_int(VALUE self, VALUE rother)
|
159
139
|
{
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
mylen = term->flen;
|
166
|
-
olen = other->flen;
|
167
|
-
size = mylen >= olen ? olen : mylen;
|
168
|
-
comp = memcmp(term->field, other->field, size);
|
169
|
-
if(comp == 0){
|
170
|
-
if(mylen == olen){
|
171
|
-
mylen = term->tlen;
|
172
|
-
olen = other->tlen;
|
173
|
-
size = mylen >= olen ? olen : mylen;
|
174
|
-
comp = memcmp(term->text, other->text, size);
|
175
|
-
if(comp == 0 && mylen != olen)
|
176
|
-
comp = mylen > olen ? 1 : -1;
|
177
|
-
} else
|
178
|
-
comp = mylen > olen ? 1 : -1;
|
179
|
-
}
|
180
|
-
/*
|
181
|
-
comp = strcmp(term->field, other->field);
|
182
|
-
if(comp == 0)
|
183
|
-
comp = strcmp(term->text, other->text);
|
184
|
-
*/
|
185
|
-
return comp;
|
140
|
+
Term *other;
|
141
|
+
GET_TERM;
|
142
|
+
Data_Get_Struct(rother, Term, other);
|
143
|
+
return frt_term_cmp(term, other);
|
186
144
|
}
|
187
145
|
|
188
146
|
VALUE
|
@@ -218,21 +176,18 @@ frt_term_eq(VALUE self, VALUE rother)
|
|
218
176
|
}
|
219
177
|
|
220
178
|
|
221
|
-
/*
|
222
179
|
static VALUE
|
223
180
|
frt_term_compare_to(VALUE self, VALUE other)
|
224
181
|
{
|
225
|
-
|
182
|
+
return INT2FIX(frt_term_compare_to_int(self, other));
|
226
183
|
}
|
227
|
-
*/
|
228
184
|
|
229
185
|
static VALUE
|
230
186
|
frt_term_hash(VALUE self)
|
231
187
|
{
|
232
|
-
|
233
|
-
Data_Get_Struct(self, Term, term);
|
188
|
+
GET_TERM;
|
234
189
|
return INT2FIX(frt_hash(term->text, term->tlen) +
|
235
|
-
frt_hash(term->field, term->
|
190
|
+
frt_hash(RSTRING(term->field)->ptr, RSTRING(term->field)->len));
|
236
191
|
}
|
237
192
|
|
238
193
|
/****************************************************************************
|
@@ -244,24 +199,24 @@ frt_term_hash(VALUE self)
|
|
244
199
|
void
|
245
200
|
Init_term(void)
|
246
201
|
{
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
202
|
+
/* Term */
|
203
|
+
cTerm = rb_define_class_under(mIndex, "Term", rb_cObject);
|
204
|
+
rb_define_alloc_func(cTerm, frt_term_alloc);
|
205
|
+
rb_include_module(cTerm, rb_mComparable);
|
206
|
+
|
207
|
+
rb_define_method(cTerm, "initialize", frt_term_init, 2);
|
208
|
+
rb_define_method(cTerm, "set!", frt_term_set, 2);
|
209
|
+
rb_define_method(cTerm, "to_s", frt_term_to_s, 0);
|
210
|
+
rb_define_method(cTerm, "<=>", frt_term_compare_to, 1);
|
211
|
+
rb_define_method(cTerm, "<", frt_term_lt, 1);
|
212
|
+
rb_define_method(cTerm, ">", frt_term_gt, 1);
|
213
|
+
rb_define_method(cTerm, "<=", frt_term_le, 1);
|
214
|
+
rb_define_method(cTerm, ">=", frt_term_ge, 1);
|
215
|
+
rb_define_method(cTerm, "eql?", frt_term_eq, 1);
|
216
|
+
rb_define_method(cTerm, "==", frt_term_eq, 1);
|
217
|
+
rb_define_method(cTerm, "text", frt_term_get_text, 0);
|
218
|
+
rb_define_method(cTerm, "text=", frt_term_set_text, 1);
|
219
|
+
rb_define_method(cTerm, "field", frt_term_get_field, 0);
|
220
|
+
rb_define_method(cTerm, "field=", frt_term_set_field, 1);
|
221
|
+
rb_define_method(cTerm, "hash", frt_term_hash, 0);
|
267
222
|
}
|
data/ext/term_buffer.c
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "ferret.h"
|
2
2
|
|
3
|
-
ID
|
3
|
+
ID id_field_name;
|
4
|
+
ID id_field_array;
|
4
5
|
|
5
6
|
/****************************************************************************
|
6
7
|
*
|
@@ -11,115 +12,90 @@ ID field_name;
|
|
11
12
|
void
|
12
13
|
frt_termbuffer_free(void *p)
|
13
14
|
{
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
Term *tb = (Term *)p;
|
16
|
+
free(tb->text);
|
17
|
+
free(p);
|
18
|
+
}
|
19
|
+
|
20
|
+
void
|
21
|
+
frt_termbuffer_mark(void *p)
|
22
|
+
{
|
23
|
+
Term *tb = (Term *)p;
|
24
|
+
rb_gc_mark(tb->field);
|
19
25
|
}
|
20
26
|
|
21
27
|
static VALUE
|
22
28
|
frt_termbuffer_alloc(VALUE klass)
|
23
29
|
{
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
tb->tlen = 0;
|
29
|
-
tb->flen = 0;
|
30
|
-
|
31
|
-
VALUE rbuffer = Data_Wrap_Struct(klass, NULL, frt_termbuffer_free, tb);
|
32
|
-
return rbuffer;
|
30
|
+
Term *tb = ALLOC(Term);
|
31
|
+
MEMZERO(tb, Term, 1);
|
32
|
+
tb->field = Qnil;
|
33
|
+
return Data_Wrap_Struct(klass, frt_termbuffer_mark, frt_termbuffer_free, tb);
|
33
34
|
}
|
34
35
|
|
35
36
|
static VALUE
|
36
37
|
frt_termbuffer_init(VALUE self)
|
37
38
|
{
|
38
|
-
|
39
|
+
rb_iv_set(self, "@term", Qnil);
|
39
40
|
return Qnil;
|
40
41
|
}
|
41
42
|
|
43
|
+
#define GET_TB Term *tb; Data_Get_Struct(self, Term, tb)
|
42
44
|
static VALUE
|
43
45
|
frt_termbuffer_get_text_length(VALUE self)
|
44
46
|
{
|
45
|
-
|
46
|
-
TermBuffer *tb;
|
47
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
47
|
+
GET_TB;
|
48
48
|
return INT2FIX(tb->tlen);
|
49
49
|
}
|
50
50
|
|
51
51
|
static VALUE
|
52
52
|
frt_termbuffer_get_text(VALUE self)
|
53
53
|
{
|
54
|
-
|
55
|
-
TermBuffer *tb;
|
56
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
54
|
+
GET_TB;
|
57
55
|
return rb_str_new(tb->text, tb->tlen);
|
58
56
|
}
|
59
57
|
|
60
58
|
static VALUE
|
61
59
|
frt_termbuffer_get_field_name(VALUE self)
|
62
60
|
{
|
63
|
-
|
64
|
-
|
65
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
66
|
-
return rb_str_new(tb->field, tb->flen);
|
61
|
+
GET_TB;
|
62
|
+
return tb->field;
|
67
63
|
}
|
68
64
|
|
69
65
|
static VALUE
|
70
66
|
frt_termbuffer_reset(VALUE self)
|
71
67
|
{
|
72
|
-
|
73
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
68
|
+
GET_TB;
|
74
69
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
tb->flen = 0;
|
70
|
+
free(tb->text);
|
71
|
+
MEMZERO(tb, Term, 1);
|
72
|
+
tb->field = Qnil;
|
79
73
|
|
80
|
-
|
74
|
+
return Qnil;
|
81
75
|
}
|
82
76
|
|
83
|
-
|
77
|
+
VALUE
|
84
78
|
frt_termbuffer_to_term(VALUE self)
|
85
79
|
{
|
86
|
-
|
87
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
80
|
+
GET_TB;
|
88
81
|
|
89
|
-
|
90
|
-
|
82
|
+
if(NIL_P(tb->field)) {
|
83
|
+
return Qnil;
|
91
84
|
} else {
|
92
|
-
VALUE
|
93
|
-
|
94
|
-
|
95
|
-
|
85
|
+
VALUE args[2];
|
86
|
+
args[0] = tb->field;
|
87
|
+
args[1] = rb_str_new(tb->text, tb->tlen);
|
88
|
+
return rb_class_new_instance(2, args, cTerm);
|
89
|
+
}
|
96
90
|
}
|
97
91
|
|
98
92
|
int
|
99
93
|
frt_termbuffer_compare_to_int(VALUE self, VALUE rother)
|
100
94
|
{
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
my_len = tb->flen;
|
107
|
-
o_len = other->flen;
|
108
|
-
size = my_len >= o_len ? o_len : my_len;
|
109
|
-
comp = memcmp(tb->field, other->field, size);
|
110
|
-
if(comp == 0){
|
111
|
-
if(my_len == o_len) {
|
112
|
-
my_len = tb->tlen;
|
113
|
-
o_len = other->tlen;
|
114
|
-
size = my_len >= o_len ? o_len : my_len;
|
115
|
-
comp = memcmp(tb->text, other->text, size);
|
116
|
-
if(comp == 0 && my_len != o_len)
|
117
|
-
comp = my_len > o_len ? 1 : -1;
|
118
|
-
} else {
|
119
|
-
comp = my_len > o_len ? 1 : -1;
|
120
|
-
}
|
121
|
-
}
|
122
|
-
return comp;
|
95
|
+
Term *other;
|
96
|
+
GET_TB;
|
97
|
+
Data_Get_Struct(rother, Term, other);
|
98
|
+
return frt_term_cmp(tb, other);
|
123
99
|
}
|
124
100
|
|
125
101
|
VALUE
|
@@ -157,105 +133,60 @@ frt_termbuffer_eq(VALUE self, VALUE rother)
|
|
157
133
|
static VALUE
|
158
134
|
frt_termbuffer_compare_to(VALUE self, VALUE rother)
|
159
135
|
{
|
160
|
-
|
161
|
-
}
|
162
|
-
|
163
|
-
static VALUE
|
164
|
-
frt_termbuffer_set_term(VALUE self, VALUE rterm)
|
165
|
-
{
|
166
|
-
TermBuffer *tb;
|
167
|
-
Term *term;
|
168
|
-
int tlen, flen;
|
169
|
-
|
170
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
171
|
-
Data_Get_Struct(rterm, Term, term);
|
172
|
-
|
173
|
-
tlen = term->tlen;
|
174
|
-
flen = term->flen;
|
175
|
-
|
176
|
-
if(tb->field == NULL){
|
177
|
-
tb->field = (char *)ALLOC_N(char, flen+1);
|
178
|
-
tb->text = (char *)ALLOC_N(char, tlen+1);
|
179
|
-
} else {
|
180
|
-
REALLOC_N(tb->text, char, tlen+1);
|
181
|
-
REALLOC_N(tb->field, char, flen+1);
|
182
|
-
}
|
183
|
-
|
184
|
-
tb->flen = flen;
|
185
|
-
tb->tlen = tlen;
|
186
|
-
MEMCPY(tb->text, term->text, char, tlen);
|
187
|
-
MEMCPY(tb->field, term->field, char, flen);
|
188
|
-
|
189
|
-
return Qnil;
|
136
|
+
return INT2FIX(frt_termbuffer_compare_to_int(self, rother));
|
190
137
|
}
|
191
138
|
|
192
|
-
|
139
|
+
VALUE
|
193
140
|
frt_termbuffer_init_copy(VALUE self, VALUE rother)
|
194
141
|
{
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
REALLOC_N(tb->text, char, tlen+1);
|
209
|
-
REALLOC_N(tb->field, char, flen+1);
|
210
|
-
}
|
211
|
-
|
212
|
-
tb->flen = flen;
|
213
|
-
tb->tlen = tlen;
|
214
|
-
MEMCPY(tb->text, other->text, char, tlen);
|
215
|
-
MEMCPY(tb->field, other->field, char, flen);
|
216
|
-
|
217
|
-
return Qnil;
|
142
|
+
Term *tb_other;
|
143
|
+
int tlen;
|
144
|
+
GET_TB;
|
145
|
+
Data_Get_Struct(rother, Term, tb_other);
|
146
|
+
|
147
|
+
tlen = tb_other->tlen;
|
148
|
+
REALLOC_N(tb->text, char, tlen+1);
|
149
|
+
tb->tlen = tlen;
|
150
|
+
MEMCPY(tb->text, tb_other->text, char, tlen);
|
151
|
+
|
152
|
+
tb->field = tb_other->field;
|
153
|
+
|
154
|
+
return Qnil;
|
218
155
|
}
|
219
156
|
|
220
|
-
|
221
|
-
frt_termbuffer_read(VALUE self, VALUE
|
222
|
-
{
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
REALLOC_N(tb->field, char, flen+1);
|
157
|
+
VALUE
|
158
|
+
frt_termbuffer_read(VALUE self, VALUE rinput, VALUE rfield_infos)
|
159
|
+
{
|
160
|
+
IndexBuffer *input;
|
161
|
+
int tlen, start, length, fnum;
|
162
|
+
GET_TB;
|
163
|
+
Data_Get_Struct(rinput, IndexBuffer, input);
|
164
|
+
|
165
|
+
start = frt_read_vint(rinput, input);
|
166
|
+
length = frt_read_vint(rinput, input);
|
167
|
+
tlen = start + length;
|
168
|
+
REALLOC_N(tb->text, char, tlen+1);
|
169
|
+
|
170
|
+
frt_read_chars(rinput, tb->text, start, length);
|
171
|
+
fnum = frt_read_vint(rinput, input);
|
172
|
+
if (fnum < 0) {
|
173
|
+
tb->field = rb_str_new("", 0);
|
174
|
+
} else {
|
175
|
+
tb->field = rb_ivar_get(
|
176
|
+
rb_ary_entry(rb_ivar_get(rfield_infos, id_field_array), fnum),
|
177
|
+
id_field_name);
|
178
|
+
}
|
244
179
|
|
245
|
-
MEMCPY(tb->field, RSTRING(field)->ptr, char, flen);
|
246
|
-
|
247
|
-
tb->flen = flen;
|
248
180
|
tb->tlen = tlen;
|
249
|
-
|
181
|
+
return Qnil;
|
250
182
|
}
|
251
183
|
|
252
184
|
static VALUE
|
253
185
|
frt_termbuffer_hash(VALUE self)
|
254
186
|
{
|
255
|
-
|
256
|
-
Data_Get_Struct(self, TermBuffer, tb);
|
187
|
+
GET_TB;
|
257
188
|
return INT2FIX(frt_hash(tb->text, tb->tlen) +
|
258
|
-
frt_hash(tb->field, tb->
|
189
|
+
frt_hash(RSTRING(tb->field)->ptr, RSTRING(tb->field)->len));
|
259
190
|
}
|
260
191
|
|
261
192
|
/****************************************************************************
|
@@ -268,32 +199,32 @@ frt_termbuffer_hash(VALUE self)
|
|
268
199
|
void
|
269
200
|
Init_term_buffer(void) {
|
270
201
|
/* IDs */
|
271
|
-
|
202
|
+
id_field_name = rb_intern("@name");
|
203
|
+
id_field_array = rb_intern("@fi_array");
|
272
204
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
205
|
+
/* TermBuffer */
|
206
|
+
cTermBuffer = rb_define_class_under(mIndex, "TermBuffer", rb_cObject);
|
207
|
+
rb_define_alloc_func(cTermBuffer, frt_termbuffer_alloc);
|
208
|
+
rb_include_module(cTermBuffer, rb_mComparable);
|
277
209
|
|
278
210
|
/* Methods */
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
rb_define_method(cTermBuffer, "text_str", frt_termbuffer_get_text, 0);
|
211
|
+
rb_define_method(cTermBuffer, "initialize", frt_termbuffer_init, 0);
|
212
|
+
rb_define_method(cTermBuffer, "initialize_copy", frt_termbuffer_init_copy, 1);
|
213
|
+
rb_define_method(cTermBuffer, "text", frt_termbuffer_get_text, 0);
|
214
|
+
rb_define_method(cTermBuffer, "field", frt_termbuffer_get_field_name, 0);
|
215
|
+
rb_define_method(cTermBuffer, "text_length", frt_termbuffer_get_text_length, 0);
|
216
|
+
rb_define_method(cTermBuffer, "<=>", frt_termbuffer_compare_to, 1);
|
217
|
+
rb_define_method(cTermBuffer, "<", frt_termbuffer_lt, 1);
|
218
|
+
rb_define_method(cTermBuffer, ">", frt_termbuffer_gt, 1);
|
219
|
+
rb_define_method(cTermBuffer, "<=", frt_termbuffer_le, 1);
|
220
|
+
rb_define_method(cTermBuffer, ">=", frt_termbuffer_ge, 1);
|
221
|
+
rb_define_method(cTermBuffer, "eql?", frt_termbuffer_eq, 1);
|
222
|
+
rb_define_method(cTermBuffer, "==", frt_termbuffer_eq, 1);
|
223
|
+
rb_define_method(cTermBuffer, "hash", frt_termbuffer_hash, 0);
|
224
|
+
rb_define_method(cTermBuffer, "read", frt_termbuffer_read, 2);
|
225
|
+
rb_define_method(cTermBuffer, "reset", frt_termbuffer_reset, 0);
|
226
|
+
rb_define_method(cTermBuffer, "to_term", frt_termbuffer_to_term, 0);
|
227
|
+
rb_define_method(cTermBuffer, "term", frt_termbuffer_to_term, 0);
|
228
|
+
rb_define_method(cTermBuffer, "term=", frt_termbuffer_init_copy, 1);
|
229
|
+
rb_define_method(cTermBuffer, "set!", frt_termbuffer_init_copy, 1);
|
299
230
|
}
|