ferret 0.2.2 → 0.3.0
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.
- 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
|
}
|