ferret 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README +109 -0
- data/Rakefile +275 -0
- data/TODO +9 -0
- data/TUTORIAL +197 -0
- data/ext/extconf.rb +3 -0
- data/ext/ferret.c +23 -0
- data/ext/ferret.h +85 -0
- data/ext/index_io.c +543 -0
- data/ext/priority_queue.c +227 -0
- data/ext/ram_directory.c +316 -0
- data/ext/segment_merge_queue.c +41 -0
- data/ext/string_helper.c +42 -0
- data/ext/tags +240 -0
- data/ext/term.c +261 -0
- data/ext/term_buffer.c +299 -0
- data/ext/util.c +12 -0
- data/lib/ferret.rb +41 -0
- data/lib/ferret/analysis.rb +11 -0
- data/lib/ferret/analysis/analyzers.rb +93 -0
- data/lib/ferret/analysis/standard_tokenizer.rb +65 -0
- data/lib/ferret/analysis/token.rb +79 -0
- data/lib/ferret/analysis/token_filters.rb +86 -0
- data/lib/ferret/analysis/token_stream.rb +26 -0
- data/lib/ferret/analysis/tokenizers.rb +107 -0
- data/lib/ferret/analysis/word_list_loader.rb +27 -0
- data/lib/ferret/document.rb +2 -0
- data/lib/ferret/document/document.rb +152 -0
- data/lib/ferret/document/field.rb +304 -0
- data/lib/ferret/index.rb +26 -0
- data/lib/ferret/index/compound_file_io.rb +343 -0
- data/lib/ferret/index/document_writer.rb +288 -0
- data/lib/ferret/index/field_infos.rb +259 -0
- data/lib/ferret/index/fields_io.rb +175 -0
- data/lib/ferret/index/index.rb +228 -0
- data/lib/ferret/index/index_file_names.rb +33 -0
- data/lib/ferret/index/index_reader.rb +462 -0
- data/lib/ferret/index/index_writer.rb +488 -0
- data/lib/ferret/index/multi_reader.rb +363 -0
- data/lib/ferret/index/multiple_term_doc_pos_enum.rb +105 -0
- data/lib/ferret/index/segment_infos.rb +130 -0
- data/lib/ferret/index/segment_merge_info.rb +47 -0
- data/lib/ferret/index/segment_merge_queue.rb +16 -0
- data/lib/ferret/index/segment_merger.rb +337 -0
- data/lib/ferret/index/segment_reader.rb +380 -0
- data/lib/ferret/index/segment_term_enum.rb +178 -0
- data/lib/ferret/index/segment_term_vector.rb +58 -0
- data/lib/ferret/index/term.rb +49 -0
- data/lib/ferret/index/term_buffer.rb +88 -0
- data/lib/ferret/index/term_doc_enum.rb +283 -0
- data/lib/ferret/index/term_enum.rb +52 -0
- data/lib/ferret/index/term_info.rb +41 -0
- data/lib/ferret/index/term_infos_io.rb +312 -0
- data/lib/ferret/index/term_vector_offset_info.rb +20 -0
- data/lib/ferret/index/term_vectors_io.rb +552 -0
- data/lib/ferret/query_parser.rb +274 -0
- data/lib/ferret/query_parser/query_parser.tab.rb +819 -0
- data/lib/ferret/search.rb +49 -0
- data/lib/ferret/search/boolean_clause.rb +100 -0
- data/lib/ferret/search/boolean_query.rb +303 -0
- data/lib/ferret/search/boolean_scorer.rb +294 -0
- data/lib/ferret/search/caching_wrapper_filter.rb +40 -0
- data/lib/ferret/search/conjunction_scorer.rb +99 -0
- data/lib/ferret/search/disjunction_sum_scorer.rb +203 -0
- data/lib/ferret/search/exact_phrase_scorer.rb +32 -0
- data/lib/ferret/search/explanation.rb +41 -0
- data/lib/ferret/search/field_cache.rb +216 -0
- data/lib/ferret/search/field_doc.rb +31 -0
- data/lib/ferret/search/field_sorted_hit_queue.rb +184 -0
- data/lib/ferret/search/filter.rb +11 -0
- data/lib/ferret/search/filtered_query.rb +130 -0
- data/lib/ferret/search/filtered_term_enum.rb +79 -0
- data/lib/ferret/search/fuzzy_query.rb +153 -0
- data/lib/ferret/search/fuzzy_term_enum.rb +244 -0
- data/lib/ferret/search/hit_collector.rb +34 -0
- data/lib/ferret/search/hit_queue.rb +11 -0
- data/lib/ferret/search/index_searcher.rb +173 -0
- data/lib/ferret/search/match_all_docs_query.rb +104 -0
- data/lib/ferret/search/multi_phrase_query.rb +204 -0
- data/lib/ferret/search/multi_term_query.rb +65 -0
- data/lib/ferret/search/non_matching_scorer.rb +22 -0
- data/lib/ferret/search/phrase_positions.rb +55 -0
- data/lib/ferret/search/phrase_query.rb +217 -0
- data/lib/ferret/search/phrase_scorer.rb +153 -0
- data/lib/ferret/search/prefix_query.rb +47 -0
- data/lib/ferret/search/query.rb +111 -0
- data/lib/ferret/search/query_filter.rb +51 -0
- data/lib/ferret/search/range_filter.rb +103 -0
- data/lib/ferret/search/range_query.rb +139 -0
- data/lib/ferret/search/req_excl_scorer.rb +125 -0
- data/lib/ferret/search/req_opt_sum_scorer.rb +70 -0
- data/lib/ferret/search/score_doc.rb +38 -0
- data/lib/ferret/search/score_doc_comparator.rb +114 -0
- data/lib/ferret/search/scorer.rb +91 -0
- data/lib/ferret/search/similarity.rb +278 -0
- data/lib/ferret/search/sloppy_phrase_scorer.rb +47 -0
- data/lib/ferret/search/sort.rb +105 -0
- data/lib/ferret/search/sort_comparator.rb +60 -0
- data/lib/ferret/search/sort_field.rb +87 -0
- data/lib/ferret/search/spans.rb +12 -0
- data/lib/ferret/search/spans/near_spans_enum.rb +304 -0
- data/lib/ferret/search/spans/span_first_query.rb +79 -0
- data/lib/ferret/search/spans/span_near_query.rb +108 -0
- data/lib/ferret/search/spans/span_not_query.rb +130 -0
- data/lib/ferret/search/spans/span_or_query.rb +176 -0
- data/lib/ferret/search/spans/span_query.rb +25 -0
- data/lib/ferret/search/spans/span_scorer.rb +74 -0
- data/lib/ferret/search/spans/span_term_query.rb +105 -0
- data/lib/ferret/search/spans/span_weight.rb +84 -0
- data/lib/ferret/search/spans/spans_enum.rb +44 -0
- data/lib/ferret/search/term_query.rb +128 -0
- data/lib/ferret/search/term_scorer.rb +181 -0
- data/lib/ferret/search/top_docs.rb +24 -0
- data/lib/ferret/search/top_field_docs.rb +17 -0
- data/lib/ferret/search/weight.rb +54 -0
- data/lib/ferret/search/wildcard_query.rb +26 -0
- data/lib/ferret/search/wildcard_term_enum.rb +61 -0
- data/lib/ferret/stemmers.rb +1 -0
- data/lib/ferret/stemmers/porter_stemmer.rb +218 -0
- data/lib/ferret/store.rb +5 -0
- data/lib/ferret/store/buffered_index_io.rb +191 -0
- data/lib/ferret/store/directory.rb +139 -0
- data/lib/ferret/store/fs_store.rb +338 -0
- data/lib/ferret/store/index_io.rb +259 -0
- data/lib/ferret/store/ram_store.rb +282 -0
- data/lib/ferret/utils.rb +7 -0
- data/lib/ferret/utils/bit_vector.rb +105 -0
- data/lib/ferret/utils/date_tools.rb +138 -0
- data/lib/ferret/utils/number_tools.rb +91 -0
- data/lib/ferret/utils/parameter.rb +41 -0
- data/lib/ferret/utils/priority_queue.rb +120 -0
- data/lib/ferret/utils/string_helper.rb +47 -0
- data/lib/ferret/utils/weak_key_hash.rb +51 -0
- data/rake_utils/code_statistics.rb +106 -0
- data/setup.rb +1551 -0
- data/test/benchmark/tb_ram_store.rb +76 -0
- data/test/benchmark/tb_rw_vint.rb +26 -0
- data/test/longrunning/tc_numbertools.rb +60 -0
- data/test/longrunning/tm_store.rb +19 -0
- data/test/test_all.rb +9 -0
- data/test/test_helper.rb +6 -0
- data/test/unit/analysis/tc_analyzer.rb +21 -0
- data/test/unit/analysis/tc_letter_tokenizer.rb +20 -0
- data/test/unit/analysis/tc_lower_case_filter.rb +20 -0
- data/test/unit/analysis/tc_lower_case_tokenizer.rb +27 -0
- data/test/unit/analysis/tc_per_field_analyzer_wrapper.rb +39 -0
- data/test/unit/analysis/tc_porter_stem_filter.rb +16 -0
- data/test/unit/analysis/tc_standard_analyzer.rb +20 -0
- data/test/unit/analysis/tc_standard_tokenizer.rb +20 -0
- data/test/unit/analysis/tc_stop_analyzer.rb +20 -0
- data/test/unit/analysis/tc_stop_filter.rb +14 -0
- data/test/unit/analysis/tc_white_space_analyzer.rb +21 -0
- data/test/unit/analysis/tc_white_space_tokenizer.rb +20 -0
- data/test/unit/analysis/tc_word_list_loader.rb +32 -0
- data/test/unit/document/tc_document.rb +47 -0
- data/test/unit/document/tc_field.rb +80 -0
- data/test/unit/index/tc_compound_file_io.rb +107 -0
- data/test/unit/index/tc_field_infos.rb +119 -0
- data/test/unit/index/tc_fields_io.rb +167 -0
- data/test/unit/index/tc_index.rb +140 -0
- data/test/unit/index/tc_index_reader.rb +622 -0
- data/test/unit/index/tc_index_writer.rb +57 -0
- data/test/unit/index/tc_multiple_term_doc_pos_enum.rb +80 -0
- data/test/unit/index/tc_segment_infos.rb +74 -0
- data/test/unit/index/tc_segment_term_docs.rb +17 -0
- data/test/unit/index/tc_segment_term_enum.rb +60 -0
- data/test/unit/index/tc_segment_term_vector.rb +71 -0
- data/test/unit/index/tc_term.rb +22 -0
- data/test/unit/index/tc_term_buffer.rb +57 -0
- data/test/unit/index/tc_term_info.rb +19 -0
- data/test/unit/index/tc_term_infos_io.rb +192 -0
- data/test/unit/index/tc_term_vector_offset_info.rb +18 -0
- data/test/unit/index/tc_term_vectors_io.rb +108 -0
- data/test/unit/index/th_doc.rb +244 -0
- data/test/unit/query_parser/tc_query_parser.rb +84 -0
- data/test/unit/search/tc_filter.rb +113 -0
- data/test/unit/search/tc_fuzzy_query.rb +136 -0
- data/test/unit/search/tc_index_searcher.rb +188 -0
- data/test/unit/search/tc_search_and_sort.rb +98 -0
- data/test/unit/search/tc_similarity.rb +37 -0
- data/test/unit/search/tc_sort.rb +48 -0
- data/test/unit/search/tc_sort_field.rb +27 -0
- data/test/unit/search/tc_spans.rb +153 -0
- data/test/unit/store/tc_fs_store.rb +84 -0
- data/test/unit/store/tc_ram_store.rb +35 -0
- data/test/unit/store/tm_store.rb +180 -0
- data/test/unit/store/tm_store_lock.rb +68 -0
- data/test/unit/ts_analysis.rb +16 -0
- data/test/unit/ts_document.rb +4 -0
- data/test/unit/ts_index.rb +18 -0
- data/test/unit/ts_query_parser.rb +3 -0
- data/test/unit/ts_search.rb +10 -0
- data/test/unit/ts_store.rb +6 -0
- data/test/unit/ts_utils.rb +10 -0
- data/test/unit/utils/tc_bit_vector.rb +65 -0
- data/test/unit/utils/tc_date_tools.rb +50 -0
- data/test/unit/utils/tc_number_tools.rb +59 -0
- data/test/unit/utils/tc_parameter.rb +40 -0
- data/test/unit/utils/tc_priority_queue.rb +62 -0
- data/test/unit/utils/tc_string_helper.rb +21 -0
- data/test/unit/utils/tc_weak_key_hash.rb +25 -0
- metadata +251 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
#include "ferret.h"
|
2
|
+
|
3
|
+
ID eq, lt;
|
4
|
+
/****************************************************************************
|
5
|
+
*
|
6
|
+
* SegmentMergeQueue Methods
|
7
|
+
*
|
8
|
+
****************************************************************************/
|
9
|
+
|
10
|
+
static VALUE
|
11
|
+
frt_smq_less_than(VALUE self, VALUE rsti1, VALUE rsti2)
|
12
|
+
{
|
13
|
+
int base1, base2;
|
14
|
+
int cmp = frt_term_compare_to_int(rb_iv_get(rsti1, "@term"), rb_iv_get(rsti2, "@term"));
|
15
|
+
if (cmp == 0) {
|
16
|
+
base1 = FIX2INT(rb_iv_get(rsti1, "@base"));
|
17
|
+
base2 = FIX2INT(rb_iv_get(rsti2, "@base"));
|
18
|
+
return base1 < base2 ? Qtrue : Qfalse;
|
19
|
+
} else {
|
20
|
+
return cmp < 0 ? Qtrue : Qfalse;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
/****************************************************************************
|
25
|
+
*
|
26
|
+
* Init Function
|
27
|
+
*
|
28
|
+
****************************************************************************/
|
29
|
+
|
30
|
+
void
|
31
|
+
Init_segment_merge_queue(void)
|
32
|
+
{
|
33
|
+
// IDs
|
34
|
+
eq = rb_intern("==");
|
35
|
+
lt = rb_intern("<");
|
36
|
+
|
37
|
+
// SegmentMergeQueue
|
38
|
+
cSegmentMergeQueue = rb_define_class_under(mIndex, "SegmentMergeQueue", cPriorityQueue);
|
39
|
+
|
40
|
+
rb_define_method(cSegmentMergeQueue, "less_than", frt_smq_less_than, 2);
|
41
|
+
}
|
data/ext/string_helper.c
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#include "ferret.h"
|
2
|
+
|
3
|
+
/****************************************************************************
|
4
|
+
*
|
5
|
+
* StringHelper Methods
|
6
|
+
*
|
7
|
+
****************************************************************************/
|
8
|
+
inline int
|
9
|
+
frt_sh_string_difference_int(VALUE self, VALUE rstr1, VALUE rstr2)
|
10
|
+
{
|
11
|
+
int i;
|
12
|
+
struct RString *str1 = RSTRING(rstr1), *str2 = RSTRING(rstr2);
|
13
|
+
char *s1 = str1->ptr, *s2 = str2->ptr;
|
14
|
+
int len = str1->len < str2->len ? str1->len : str2->len;
|
15
|
+
for (i = 0; i < len; i++) {
|
16
|
+
if (s1[i] != s2[i])
|
17
|
+
return i;
|
18
|
+
}
|
19
|
+
return len;
|
20
|
+
}
|
21
|
+
|
22
|
+
static VALUE
|
23
|
+
frt_sh_string_difference(VALUE self, VALUE rstr1, VALUE rstr2)
|
24
|
+
{
|
25
|
+
return INT2FIX(frt_sh_string_difference_int(self, rstr1, rstr2));
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
/****************************************************************************
|
30
|
+
*
|
31
|
+
* Init Function
|
32
|
+
*
|
33
|
+
****************************************************************************/
|
34
|
+
|
35
|
+
void
|
36
|
+
Init_string_helper(void)
|
37
|
+
{
|
38
|
+
// StringHelper
|
39
|
+
mStringHelper = rb_define_module_under(mUtils, "StringHelper");
|
40
|
+
|
41
|
+
rb_define_method(mStringHelper, "string_difference", frt_sh_string_difference, 2);
|
42
|
+
}
|
data/ext/tags
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
2
|
+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
3
|
+
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
|
4
|
+
!_TAG_PROGRAM_NAME Exuberant Ctags //
|
5
|
+
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
|
6
|
+
!_TAG_PROGRAM_VERSION 5.5.4 //
|
7
|
+
AR Makefile /^AR = ar$/;" m
|
8
|
+
BUFFER_SIZE ferret.h 6;" d
|
9
|
+
CC Makefile /^CC = gcc$/;" m
|
10
|
+
CFLAGS Makefile /^CFLAGS = -fPIC -Wall -g -O2 -fPIC $/;" m
|
11
|
+
CLEANFILES Makefile /^CLEANFILES = $/;" m
|
12
|
+
CLEANLIBS Makefile /^CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map$/;" m
|
13
|
+
CLEANOBJS Makefile /^CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak$/;" m
|
14
|
+
COPY Makefile /^COPY = cp$/;" m
|
15
|
+
CPPFLAGS Makefile /^CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) $/;" m
|
16
|
+
CXXFLAGS Makefile /^CXXFLAGS = $(CFLAGS) $/;" m
|
17
|
+
DEFFILE Makefile /^DEFFILE = $/;" m
|
18
|
+
DISTCLEANFILES Makefile /^DISTCLEANFILES = $/;" m
|
19
|
+
DLDFLAGS Makefile /^DLDFLAGS = $/;" m
|
20
|
+
DLLIB Makefile /^DLLIB = $(TARGET).so$/;" m
|
21
|
+
EXEEXT Makefile /^EXEEXT = $/;" m
|
22
|
+
INSTALL Makefile /^INSTALL = \/usr\/bin\/install -c$/;" m
|
23
|
+
INSTALL_DATA Makefile /^INSTALL_DATA = $(INSTALL) -m 644$/;" m
|
24
|
+
INSTALL_PROG Makefile /^INSTALL_PROG = $(INSTALL) -m 0755$/;" m
|
25
|
+
IndexBuffer ferret.h /^typedef struct IndexBuffer {$/;" s
|
26
|
+
IndexBuffer ferret.h /^} IndexBuffer;$/;" t
|
27
|
+
Init_extensions ferret.c /^Init_extensions(void)$/;" f
|
28
|
+
Init_indexio index_io.c /^Init_indexio(void)$/;" f
|
29
|
+
Init_priority_queue priority_queue.c /^Init_priority_queue(void)$/;" f
|
30
|
+
Init_ram_directory ram_directory.c /^Init_ram_directory(void)$/;" f
|
31
|
+
Init_segment_merge_queue segment_merge_queue.c /^Init_segment_merge_queue(void)$/;" f
|
32
|
+
Init_string_helper string_helper.c /^Init_string_helper(void)$/;" f
|
33
|
+
Init_term term.c /^Init_term(void)$/;" f
|
34
|
+
Init_term_buffer term_buffer.c /^Init_term_buffer(void) {$/;" f
|
35
|
+
LDSHARED Makefile /^LDSHARED = $(CC) -shared$/;" m
|
36
|
+
LIBPATH Makefile /^LIBPATH = -L"$(libdir)"$/;" m
|
37
|
+
LIBRUBY Makefile /^LIBRUBY = $(LIBRUBY_SO)$/;" m
|
38
|
+
LIBRUBYARG_SHARED Makefile /^LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)$/;" m
|
39
|
+
LIBRUBYARG_STATIC Makefile /^LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static$/;" m
|
40
|
+
LIBRUBY_A Makefile /^LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a$/;" m
|
41
|
+
LIBS Makefile /^LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc$/;" m
|
42
|
+
LOCAL_LIBS Makefile /^LOCAL_LIBS = $/;" m
|
43
|
+
MAKEDIRS Makefile /^MAKEDIRS = mkdir -p$/;" m
|
44
|
+
OBJS Makefile /^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$/;" m
|
45
|
+
PriorityQueue ferret.h /^typedef struct PriorityQueue {$/;" s
|
46
|
+
PriorityQueue ferret.h /^} PriorityQueue;$/;" t
|
47
|
+
RAMFile ferret.h /^typedef struct RAMFile {$/;" s
|
48
|
+
RAMFile ferret.h /^} RAMFile;$/;" t
|
49
|
+
RM Makefile /^RM = rm -f$/;" m
|
50
|
+
RUBY Makefile /^RUBY = $(ruby)$/;" m
|
51
|
+
RUBYARCHDIR Makefile /^RUBYARCHDIR = $(sitearchdir)$(target_prefix)$/;" m
|
52
|
+
RUBYCOMMONDIR Makefile /^RUBYCOMMONDIR = $(sitedir)$(target_prefix)$/;" m
|
53
|
+
RUBYLIBDIR Makefile /^RUBYLIBDIR = $(sitelibdir)$(target_prefix)$/;" m
|
54
|
+
RUBY_INSTALL_NAME Makefile /^RUBY_INSTALL_NAME = ruby1.8$/;" m
|
55
|
+
RUBY_SO_NAME Makefile /^RUBY_SO_NAME = ruby1.8$/;" m
|
56
|
+
SHELL Makefile /^SHELL = \/bin\/sh$/;" m
|
57
|
+
SRCS Makefile /^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$/;" m
|
58
|
+
STATIC_LIB Makefile /^STATIC_LIB = $/;" m
|
59
|
+
TARGET Makefile /^TARGET = extensions$/;" m
|
60
|
+
TARGET_SO Makefile /^TARGET_SO = $(DLLIB)$/;" m
|
61
|
+
Term ferret.h /^typedef struct Term {$/;" s
|
62
|
+
Term ferret.h /^} Term;$/;" t
|
63
|
+
TermBuffer ferret.h /^typedef struct TermBuffer {$/;" s
|
64
|
+
TermBuffer ferret.h /^} TermBuffer;$/;" t
|
65
|
+
VPATH Makefile /^VPATH = $(srcdir):$(topdir):$(hdrdir)$/;" m
|
66
|
+
__FERRET_H_ ferret.h 2;" d
|
67
|
+
arch Makefile /^arch = i486-linux$/;" m
|
68
|
+
archdir Makefile /^archdir = $(rubylibdir)\/$(arch)$/;" m
|
69
|
+
bindir Makefile /^bindir = $(exec_prefix)\/bin$/;" m
|
70
|
+
bufcnt ferret.h /^ int bufcnt;$/;" m struct:RAMFile
|
71
|
+
buffer ferret.h /^ byte_t *buffer;$/;" m struct:IndexBuffer
|
72
|
+
buffers ferret.h /^ void **buffers;$/;" m struct:RAMFile
|
73
|
+
byte_t ferret.h /^typedef unsigned char byte_t;$/;" t
|
74
|
+
cBufferedIndexIn ferret.h /^VALUE cBufferedIndexIn;$/;" v
|
75
|
+
cBufferedIndexOut ferret.h /^VALUE cBufferedIndexOut;$/;" v
|
76
|
+
cFSIndexIn ferret.h /^VALUE cFSIndexIn;$/;" v
|
77
|
+
cFSIndexOut ferret.h /^VALUE cFSIndexOut;$/;" v
|
78
|
+
cIndexIn ferret.h /^VALUE cIndexIn;$/;" v
|
79
|
+
cIndexOut ferret.h /^VALUE cIndexOut;$/;" v
|
80
|
+
cPriorityQueue ferret.h /^VALUE cPriorityQueue;$/;" v
|
81
|
+
cRAMDirectory ferret.h /^VALUE cRAMDirectory;$/;" v
|
82
|
+
cRAMIndexIn ferret.h /^VALUE cRAMIndexIn;$/;" v
|
83
|
+
cRAMIndexOut ferret.h /^VALUE cRAMIndexOut;$/;" v
|
84
|
+
cSegmentMergeQueue ferret.h /^VALUE cSegmentMergeQueue;$/;" v
|
85
|
+
cTerm ferret.h /^VALUE cTerm;$/;" v
|
86
|
+
cTermBuffer ferret.h /^VALUE cTermBuffer;$/;" v
|
87
|
+
datadir Makefile /^datadir = $(prefix)\/share$/;" m
|
88
|
+
eq segment_merge_queue.c /^ID eq, lt;$/;" v
|
89
|
+
exec_prefix Makefile /^exec_prefix = $(prefix)$/;" m
|
90
|
+
extout Makefile /^extout = $/;" m
|
91
|
+
extout_prefix Makefile /^extout_prefix = $/;" m
|
92
|
+
field ferret.h /^ char *field;$/;" m struct:Term
|
93
|
+
field ferret.h /^ char *field;$/;" m struct:TermBuffer
|
94
|
+
field_name term_buffer.c /^ID field_name;$/;" v
|
95
|
+
flen ferret.h /^ int flen;$/;" m struct:Term
|
96
|
+
flen ferret.h /^ int flen;$/;" m struct:TermBuffer
|
97
|
+
flush ram_directory.c /^ID flush, seek;$/;" v
|
98
|
+
frt_extend_buffer_if_necessary ram_directory.c /^frt_extend_buffer_if_necessary(RAMFile *rf, int bufnum)$/;" f
|
99
|
+
frt_flush_buffer index_io.c /^ID frt_length, frt_flush_buffer, frt_read_internal, frt_seek_internal; $/;" v
|
100
|
+
frt_hash util.c /^frt_hash(register char *p, register int len)$/;" f
|
101
|
+
frt_indexbuffer_alloc index_io.c /^frt_indexbuffer_alloc(VALUE klass)$/;" f file:
|
102
|
+
frt_indexbuffer_free index_io.c /^frt_indexbuffer_free(void *p)$/;" f
|
103
|
+
frt_indexin_init_copy index_io.c /^frt_indexin_init_copy(VALUE self, VALUE orig)$/;" f file:
|
104
|
+
frt_indexin_pos index_io.c /^frt_indexin_pos(VALUE self)$/;" f file:
|
105
|
+
frt_indexin_read_byte index_io.c /^frt_indexin_read_byte(VALUE self)$/;" f file:
|
106
|
+
frt_indexin_read_bytes index_io.c /^frt_indexin_read_bytes(VALUE self, VALUE rbuf, VALUE roffset, VALUE rlen)$/;" f file:
|
107
|
+
frt_indexin_read_int index_io.c /^frt_indexin_read_int(VALUE self)$/;" f file:
|
108
|
+
frt_indexin_read_long index_io.c /^frt_indexin_read_long(VALUE self)$/;" f file:
|
109
|
+
frt_indexin_read_string index_io.c /^frt_indexin_read_string(VALUE self)$/;" f file:
|
110
|
+
frt_indexin_read_uint index_io.c /^frt_indexin_read_uint(VALUE self)$/;" f file:
|
111
|
+
frt_indexin_read_ulong index_io.c /^frt_indexin_read_ulong(VALUE self)$/;" f file:
|
112
|
+
frt_indexin_read_vint index_io.c /^frt_indexin_read_vint(VALUE self)$/;" f file:
|
113
|
+
frt_indexin_refill index_io.c /^frt_indexin_refill(VALUE self)$/;" f file:
|
114
|
+
frt_indexin_seek index_io.c /^frt_indexin_seek(VALUE self, VALUE rpos)$/;" f file:
|
115
|
+
frt_indexout_flush index_io.c /^frt_indexout_flush(VALUE self)$/;" f file:
|
116
|
+
frt_indexout_pos index_io.c /^frt_indexout_pos(VALUE self)$/;" f file:
|
117
|
+
frt_indexout_seek index_io.c /^frt_indexout_seek(VALUE self, VALUE pos)$/;" f file:
|
118
|
+
frt_indexout_write_byte index_io.c /^frt_indexout_write_byte(VALUE self, VALUE rbyte)$/;" f file:
|
119
|
+
frt_indexout_write_bytes index_io.c /^frt_indexout_write_bytes(VALUE self, VALUE rbuffer, VALUE rlen)$/;" f file:
|
120
|
+
frt_indexout_write_chars index_io.c /^frt_indexout_write_chars(VALUE self, VALUE rstr, VALUE rstart, VALUE rlength)$/;" f file:
|
121
|
+
frt_indexout_write_int index_io.c /^frt_indexout_write_int(VALUE self, VALUE rint)$/;" f file:
|
122
|
+
frt_indexout_write_long index_io.c /^frt_indexout_write_long(VALUE self, VALUE rlong)$/;" f file:
|
123
|
+
frt_indexout_write_string index_io.c /^frt_indexout_write_string(VALUE self, VALUE rstr)$/;" f file:
|
124
|
+
frt_indexout_write_uint index_io.c /^frt_indexout_write_uint(VALUE self, VALUE ruint)$/;" f file:
|
125
|
+
frt_indexout_write_ulong index_io.c /^frt_indexout_write_ulong(VALUE self, VALUE rulong)$/;" f file:
|
126
|
+
frt_indexout_write_vint index_io.c /^frt_indexout_write_vint(VALUE self, VALUE rulong)$/;" f file:
|
127
|
+
frt_length index_io.c /^ID frt_length, frt_flush_buffer, frt_read_internal, frt_seek_internal; $/;" v
|
128
|
+
frt_newobj ferret.h /^ID frt_newobj;$/;" v
|
129
|
+
frt_priq_adjust_top priority_queue.c /^frt_priq_adjust_top(VALUE self)$/;" f file:
|
130
|
+
frt_priq_alloc priority_queue.c /^frt_priq_alloc(VALUE klass)$/;" f file:
|
131
|
+
frt_priq_clear priority_queue.c /^frt_priq_clear(VALUE self)$/;" f file:
|
132
|
+
frt_priq_free priority_queue.c /^frt_priq_free(void *p)$/;" f
|
133
|
+
frt_priq_init priority_queue.c /^frt_priq_init(VALUE self, VALUE rsize)$/;" f file:
|
134
|
+
frt_priq_insert priority_queue.c /^frt_priq_insert(VALUE self, VALUE e)$/;" f file:
|
135
|
+
frt_priq_pop priority_queue.c /^frt_priq_pop(VALUE self)$/;" f file:
|
136
|
+
frt_priq_push priority_queue.c /^frt_priq_push(VALUE self, VALUE e)$/;" f file:
|
137
|
+
frt_priq_size priority_queue.c /^frt_priq_size(VALUE self)$/;" f file:
|
138
|
+
frt_priq_top priority_queue.c /^frt_priq_top(VALUE self)$/;" f file:
|
139
|
+
frt_read_byte index_io.c /^frt_read_byte(VALUE self)$/;" f
|
140
|
+
frt_read_bytes index_io.c /^frt_read_bytes(VALUE self, VALUE rbuffer, int offset, int len)$/;" f file:
|
141
|
+
frt_read_chars index_io.c /^frt_read_chars(VALUE self, char* buffer, int off, int len) $/;" f
|
142
|
+
frt_read_internal index_io.c /^ID frt_length, frt_flush_buffer, frt_read_internal, frt_seek_internal; $/;" v
|
143
|
+
frt_read_vint index_io.c /^frt_read_vint(VALUE self)$/;" f
|
144
|
+
frt_rf_alloc ram_directory.c /^frt_rf_alloc(VALUE klass)$/;" f file:
|
145
|
+
frt_rf_extend ram_directory.c /^frt_rf_extend(RAMFile *rf)$/;" f
|
146
|
+
frt_rf_free ram_directory.c /^frt_rf_free(void *p)$/;" f
|
147
|
+
frt_rf_length ram_directory.c /^frt_rf_length(VALUE self)$/;" f file:
|
148
|
+
frt_rf_mark ram_directory.c /^frt_rf_mark(void *p)$/;" f
|
149
|
+
frt_rii_close ram_directory.c /^frt_rii_close(VALUE self)$/;" f file:
|
150
|
+
frt_rii_init ram_directory.c /^frt_rii_init(VALUE self, VALUE ramfile)$/;" f file:
|
151
|
+
frt_rii_length ram_directory.c /^frt_rii_length(VALUE self)$/;" f file:
|
152
|
+
frt_rii_read_internal ram_directory.c /^frt_rii_read_internal(VALUE self, VALUE rb, VALUE roffset, VALUE rlen)$/;" f file:
|
153
|
+
frt_rii_seek_internal ram_directory.c /^frt_rii_seek_internal(VALUE self, VALUE rpos)$/;" f file:
|
154
|
+
frt_rio_close ram_directory.c /^frt_rio_close(VALUE self)$/;" f file:
|
155
|
+
frt_rio_flush_buffer ram_directory.c /^frt_rio_flush_buffer(VALUE self, VALUE rsrc, VALUE rlen)$/;" f file:
|
156
|
+
frt_rio_init ram_directory.c /^frt_rio_init(VALUE self, VALUE ramfile)$/;" f file:
|
157
|
+
frt_rio_length ram_directory.c /^frt_rio_length(VALUE self)$/;" f file:
|
158
|
+
frt_rio_reset ram_directory.c /^frt_rio_reset(VALUE self)$/;" f file:
|
159
|
+
frt_rio_seek ram_directory.c /^frt_rio_seek(VALUE self, VALUE rpos)$/;" f file:
|
160
|
+
frt_rio_write_to ram_directory.c /^frt_rio_write_to(VALUE self, VALUE routput)$/;" f file:
|
161
|
+
frt_seek_internal index_io.c /^ID frt_length, frt_flush_buffer, frt_read_internal, frt_seek_internal; $/;" v
|
162
|
+
frt_sh_string_difference string_helper.c /^frt_sh_string_difference(VALUE self, VALUE rstr1, VALUE rstr2)$/;" f file:
|
163
|
+
frt_sh_string_difference_int string_helper.c /^frt_sh_string_difference_int(VALUE self, VALUE rstr1, VALUE rstr2)$/;" f
|
164
|
+
frt_smq_less_than segment_merge_queue.c /^frt_smq_less_than(VALUE self, VALUE rsti1, VALUE rsti2)$/;" f file:
|
165
|
+
frt_term_alloc term.c /^frt_term_alloc(VALUE klass)$/;" f file:
|
166
|
+
frt_term_compare_to term.c /^frt_term_compare_to(VALUE self, VALUE other)$/;" f file:
|
167
|
+
frt_term_compare_to_int term.c /^frt_term_compare_to_int(VALUE self, VALUE rother)$/;" f
|
168
|
+
frt_term_free term.c /^frt_term_free(void *p)$/;" f
|
169
|
+
frt_term_get_field term.c /^frt_term_get_field(VALUE self)$/;" f file:
|
170
|
+
frt_term_get_text term.c /^frt_term_get_text(VALUE self)$/;" f file:
|
171
|
+
frt_term_hash term.c /^frt_term_hash(VALUE self)$/;" f file:
|
172
|
+
frt_term_init term.c /^frt_term_init(VALUE self, VALUE rfield, VALUE rtext)$/;" f file:
|
173
|
+
frt_term_set term.c /^frt_term_set(VALUE self, VALUE rfield, VALUE rtext)$/;" f
|
174
|
+
frt_term_to_s term.c /^frt_term_to_s(VALUE self)$/;" f
|
175
|
+
frt_termbuffer_alloc term_buffer.c /^frt_termbuffer_alloc(VALUE klass)$/;" f file:
|
176
|
+
frt_termbuffer_compare_to term_buffer.c /^frt_termbuffer_compare_to(VALUE self, VALUE rother)$/;" f file:
|
177
|
+
frt_termbuffer_compare_to_int term_buffer.c /^frt_termbuffer_compare_to_int(VALUE self, VALUE rother)$/;" f
|
178
|
+
frt_termbuffer_free term_buffer.c /^frt_termbuffer_free(void *p)$/;" f
|
179
|
+
frt_termbuffer_get_field_name term_buffer.c /^frt_termbuffer_get_field_name(VALUE self)$/;" f file:
|
180
|
+
frt_termbuffer_get_text term_buffer.c /^frt_termbuffer_get_text(VALUE self)$/;" f file:
|
181
|
+
frt_termbuffer_get_text_length term_buffer.c /^frt_termbuffer_get_text_length(VALUE self)$/;" f file:
|
182
|
+
frt_termbuffer_hash term_buffer.c /^frt_termbuffer_hash(VALUE self)$/;" f file:
|
183
|
+
frt_termbuffer_init term_buffer.c /^frt_termbuffer_init(VALUE self)$/;" f file:
|
184
|
+
frt_termbuffer_init_copy term_buffer.c /^frt_termbuffer_init_copy(VALUE self, VALUE rother)$/;" f file:
|
185
|
+
frt_termbuffer_read term_buffer.c /^frt_termbuffer_read(VALUE self, VALUE input, VALUE info)$/;" f file:
|
186
|
+
frt_termbuffer_reset term_buffer.c /^frt_termbuffer_reset(VALUE self)$/;" f file:
|
187
|
+
frt_termbuffer_set_term term_buffer.c /^frt_termbuffer_set_term(VALUE self, VALUE rterm)$/;" f file:
|
188
|
+
frt_termbuffer_to_term term_buffer.c /^frt_termbuffer_to_term(VALUE self)$/;" f file:
|
189
|
+
frt_write_byte index_io.c /^frt_write_byte(VALUE self, byte_t b)$/;" f file:
|
190
|
+
frt_write_bytes index_io.c /^frt_write_bytes(VALUE self, byte_t *buf, int len)$/;" f
|
191
|
+
frt_write_chars index_io.c /^frt_write_chars(VALUE self, VALUE rbuf, int start, int length)$/;" f file:
|
192
|
+
frt_write_vint index_io.c /^frt_write_vint(VALUE self, register unsigned long long i)$/;" f file:
|
193
|
+
hdrdir Makefile /^hdrdir = $(topdir)$/;" m
|
194
|
+
heap ferret.h /^ VALUE *heap;$/;" m struct:PriorityQueue
|
195
|
+
includedir Makefile /^includedir = $(prefix)\/include$/;" m
|
196
|
+
infodir Makefile /^infodir = $(prefix)\/info$/;" m
|
197
|
+
len ferret.h /^ int len;$/;" m struct:PriorityQueue
|
198
|
+
len ferret.h /^ int len;$/;" m struct:IndexBuffer
|
199
|
+
length ferret.h /^ int length;$/;" m struct:RAMFile
|
200
|
+
less_than priority_queue.c /^ID less_than, put_heap;$/;" v
|
201
|
+
libdir Makefile /^libdir = $(exec_prefix)\/lib$/;" m
|
202
|
+
libexecdir Makefile /^libexecdir = $(exec_prefix)\/libexec$/;" m
|
203
|
+
libpath Makefile /^libpath = $(libdir)$/;" m
|
204
|
+
localstatedir Makefile /^localstatedir = $(DESTDIR)\/var$/;" m
|
205
|
+
lt segment_merge_queue.c /^ID eq, lt;$/;" v
|
206
|
+
mFerret ferret.h /^VALUE mFerret;$/;" v
|
207
|
+
mIndex ferret.h /^VALUE mIndex;$/;" v
|
208
|
+
mStore ferret.h /^VALUE mStore;$/;" v
|
209
|
+
mStringHelper ferret.h /^VALUE mStringHelper;$/;" v
|
210
|
+
mUtils ferret.h /^VALUE mUtils;$/;" v
|
211
|
+
mandir Makefile /^mandir = $(datadir)\/man$/;" m
|
212
|
+
mtime ferret.h /^ VALUE mtime;$/;" m struct:RAMFile
|
213
|
+
name ferret.h /^ char *name;$/;" m struct:RAMFile
|
214
|
+
oldincludedir Makefile /^oldincludedir = $(DESTDIR)\/usr\/include$/;" m
|
215
|
+
pos ferret.h /^ int pos;$/;" m struct:IndexBuffer
|
216
|
+
prefix Makefile /^prefix = $(DESTDIR)\/usr$/;" m
|
217
|
+
preload Makefile /^preload = $/;" m
|
218
|
+
priq_down priority_queue.c /^priq_down(PriorityQueue *priq, VALUE self, VALUE rary)$/;" f
|
219
|
+
priq_up priority_queue.c /^priq_up(PriorityQueue *priq, VALUE self, VALUE rary)$/;" f
|
220
|
+
put_heap priority_queue.c /^ID less_than, put_heap;$/;" v
|
221
|
+
ruby Makefile /^ruby = \/usr\/bin\/ruby1.8$/;" m
|
222
|
+
ruby_version Makefile /^ruby_version = 1.8$/;" m
|
223
|
+
rubylibdir Makefile /^rubylibdir = $(libdir)\/ruby\/$(ruby_version)$/;" m
|
224
|
+
sbindir Makefile /^sbindir = $(exec_prefix)\/sbin$/;" m
|
225
|
+
seek ram_directory.c /^ID flush, seek;$/;" v
|
226
|
+
sharedstatedir Makefile /^sharedstatedir = $(prefix)\/com$/;" m
|
227
|
+
sitearch Makefile /^sitearch = i486-linux$/;" m
|
228
|
+
sitearchdir Makefile /^sitearchdir = $(sitelibdir)\/$(sitearch)$/;" m
|
229
|
+
sitedir Makefile /^sitedir = $(DESTDIR)\/usr\/local\/lib\/site_ruby$/;" m
|
230
|
+
sitelibdir Makefile /^sitelibdir = $(sitedir)\/$(ruby_version)$/;" m
|
231
|
+
size ferret.h /^ int size;$/;" m struct:PriorityQueue
|
232
|
+
srcdir Makefile /^srcdir = .$/;" m
|
233
|
+
start ferret.h /^ long start;$/;" m struct:IndexBuffer
|
234
|
+
sysconfdir Makefile /^sysconfdir = $(DESTDIR)\/etc$/;" m
|
235
|
+
target_prefix Makefile /^target_prefix = \/ferret$/;" m
|
236
|
+
text ferret.h /^ char *text;$/;" m struct:Term
|
237
|
+
text ferret.h /^ char *text;$/;" m struct:TermBuffer
|
238
|
+
tlen ferret.h /^ int tlen;$/;" m struct:Term
|
239
|
+
tlen ferret.h /^ int tlen;$/;" m struct:TermBuffer
|
240
|
+
topdir Makefile /^topdir = \/usr\/lib\/ruby\/1.8\/i486-linux$/;" m
|
data/ext/term.c
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
#include "ferret.h"
|
2
|
+
|
3
|
+
|
4
|
+
/****************************************************************************
|
5
|
+
*
|
6
|
+
* Term Methods
|
7
|
+
*
|
8
|
+
****************************************************************************/
|
9
|
+
|
10
|
+
void
|
11
|
+
frt_term_free(void *p)
|
12
|
+
{
|
13
|
+
Term *term;
|
14
|
+
term = (Term *)p;
|
15
|
+
free((void *)(term->field));
|
16
|
+
free((void *)(term->text));
|
17
|
+
free(p);
|
18
|
+
}
|
19
|
+
|
20
|
+
static VALUE
|
21
|
+
frt_term_alloc(VALUE klass)
|
22
|
+
{
|
23
|
+
Term *term;
|
24
|
+
term = (Term *)ALLOC(Term);
|
25
|
+
term->field = (char *)ALLOC_N(char, 1);
|
26
|
+
term->text = (char *)ALLOC_N(char, 1);
|
27
|
+
|
28
|
+
VALUE rbuffer = Data_Wrap_Struct(klass, NULL, frt_term_free, term);
|
29
|
+
return rbuffer;
|
30
|
+
}
|
31
|
+
|
32
|
+
VALUE
|
33
|
+
frt_term_set(VALUE self, VALUE rfield, VALUE rtext)
|
34
|
+
{
|
35
|
+
Term *term;
|
36
|
+
int flen = RSTRING(rfield)->len;
|
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);
|
41
|
+
|
42
|
+
REALLOC_N(term->field, char, flen + 1);
|
43
|
+
REALLOC_N(term->text, char, tlen + 1);
|
44
|
+
|
45
|
+
MEMCPY(term->field, field, char, flen);
|
46
|
+
MEMCPY(term->text, text, char, tlen);
|
47
|
+
term->flen = flen;
|
48
|
+
term->tlen = tlen;
|
49
|
+
|
50
|
+
return Qnil;
|
51
|
+
}
|
52
|
+
|
53
|
+
static VALUE
|
54
|
+
frt_term_init(VALUE self, VALUE rfield, VALUE rtext)
|
55
|
+
{
|
56
|
+
frt_term_set(self, rfield, rtext);
|
57
|
+
return self;
|
58
|
+
}
|
59
|
+
|
60
|
+
static VALUE
|
61
|
+
frt_term_get_text(VALUE self)
|
62
|
+
{
|
63
|
+
Term *term;
|
64
|
+
Data_Get_Struct(self, Term, term);
|
65
|
+
return rb_str_new(term->text, term->tlen);
|
66
|
+
}
|
67
|
+
|
68
|
+
static VALUE
|
69
|
+
frt_term_set_text(VALUE self, VALUE rtext)
|
70
|
+
{
|
71
|
+
Term *term;
|
72
|
+
int tlen = RSTRING(rtext)->len;
|
73
|
+
char *text = RSTRING(rtext)->ptr;
|
74
|
+
Data_Get_Struct(self, Term, term);
|
75
|
+
|
76
|
+
REALLOC_N(term->text, char, tlen + 1);
|
77
|
+
|
78
|
+
MEMCPY(term->text, text, char, tlen);
|
79
|
+
term->tlen = tlen;
|
80
|
+
|
81
|
+
return Qnil;
|
82
|
+
}
|
83
|
+
|
84
|
+
static VALUE
|
85
|
+
frt_term_get_field(VALUE self)
|
86
|
+
{
|
87
|
+
Term *term;
|
88
|
+
Data_Get_Struct(self, Term, term);
|
89
|
+
return rb_str_new(term->field, term->flen);
|
90
|
+
}
|
91
|
+
|
92
|
+
static VALUE
|
93
|
+
frt_term_set_field(VALUE self, VALUE rfield)
|
94
|
+
{
|
95
|
+
Term *term;
|
96
|
+
int flen = RSTRING(rfield)->len;
|
97
|
+
char *field = RSTRING(rfield)->ptr;
|
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;
|
106
|
+
}
|
107
|
+
|
108
|
+
VALUE
|
109
|
+
frt_term_to_s(VALUE self)
|
110
|
+
{
|
111
|
+
Term *term;
|
112
|
+
int tlen, flen;
|
113
|
+
Data_Get_Struct(self, Term, term);
|
114
|
+
tlen = term->tlen;
|
115
|
+
flen = term->flen;
|
116
|
+
char res[flen + tlen + 1];
|
117
|
+
char delim[] = ":";
|
118
|
+
|
119
|
+
MEMCPY(res, term->field, char, flen);
|
120
|
+
MEMCPY(res + flen, delim, char, 1);
|
121
|
+
MEMCPY(res + flen + 1, term->text, char, tlen);
|
122
|
+
return rb_str_new(res, tlen + flen + 1 );
|
123
|
+
}
|
124
|
+
|
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
|
+
//comp = strcmp(term->field, other->field);
|
149
|
+
//if(comp == 0)
|
150
|
+
// comp = strcmp(term->text, other->text);
|
151
|
+
return INT2FIX(comp);
|
152
|
+
}
|
153
|
+
|
154
|
+
// keep in synch with fuction above
|
155
|
+
int
|
156
|
+
frt_term_compare_to_int(VALUE self, VALUE rother)
|
157
|
+
{
|
158
|
+
int comp, size, mylen, olen;
|
159
|
+
Term *term, *other;
|
160
|
+
Data_Get_Struct(self, Term, term);
|
161
|
+
Data_Get_Struct(rother, Term, other);
|
162
|
+
|
163
|
+
mylen = term->flen;
|
164
|
+
olen = other->flen;
|
165
|
+
size = mylen >= olen ? olen : mylen;
|
166
|
+
comp = memcmp(term->field, other->field, size);
|
167
|
+
if(comp == 0){
|
168
|
+
if(mylen == olen){
|
169
|
+
mylen = term->tlen;
|
170
|
+
olen = other->tlen;
|
171
|
+
size = mylen >= olen ? olen : mylen;
|
172
|
+
comp = memcmp(term->text, other->text, size);
|
173
|
+
if(comp == 0 && mylen != olen)
|
174
|
+
comp = mylen > olen ? 1 : -1;
|
175
|
+
} else
|
176
|
+
comp = mylen > olen ? 1 : -1;
|
177
|
+
}
|
178
|
+
//comp = strcmp(term->field, other->field);
|
179
|
+
//if(comp == 0)
|
180
|
+
// comp = strcmp(term->text, other->text);
|
181
|
+
return comp;
|
182
|
+
}
|
183
|
+
|
184
|
+
VALUE
|
185
|
+
frt_term_lt(VALUE self, VALUE rother)
|
186
|
+
{
|
187
|
+
return frt_term_compare_to_int(self, rother) < 0 ? Qtrue : Qfalse;
|
188
|
+
}
|
189
|
+
|
190
|
+
VALUE
|
191
|
+
frt_term_gt(VALUE self, VALUE rother)
|
192
|
+
{
|
193
|
+
return frt_term_compare_to_int(self, rother) > 0 ? Qtrue : Qfalse;
|
194
|
+
}
|
195
|
+
|
196
|
+
VALUE
|
197
|
+
frt_term_le(VALUE self, VALUE rother)
|
198
|
+
{
|
199
|
+
return frt_term_compare_to_int(self, rother) <= 0 ? Qtrue : Qfalse;
|
200
|
+
}
|
201
|
+
|
202
|
+
VALUE
|
203
|
+
frt_term_ge(VALUE self, VALUE rother)
|
204
|
+
{
|
205
|
+
return frt_term_compare_to_int(self, rother) >= 0 ? Qtrue : Qfalse;
|
206
|
+
}
|
207
|
+
|
208
|
+
VALUE
|
209
|
+
frt_term_eq(VALUE self, VALUE rother)
|
210
|
+
{
|
211
|
+
if (rother == Qnil)
|
212
|
+
return Qfalse;
|
213
|
+
return frt_term_compare_to_int(self, rother) == 0 ? Qtrue : Qfalse;
|
214
|
+
}
|
215
|
+
|
216
|
+
|
217
|
+
//static VALUE
|
218
|
+
//frt_term_compare_to(VALUE self, VALUE other)
|
219
|
+
//{
|
220
|
+
// return INT2FIX(frt_term_compare_to_int(self, other));
|
221
|
+
//}
|
222
|
+
|
223
|
+
static VALUE
|
224
|
+
frt_term_hash(VALUE self)
|
225
|
+
{
|
226
|
+
Term *term;
|
227
|
+
Data_Get_Struct(self, Term, term);
|
228
|
+
return INT2FIX(frt_hash(term->text, term->tlen) +
|
229
|
+
frt_hash(term->field, term->flen));
|
230
|
+
}
|
231
|
+
|
232
|
+
/****************************************************************************
|
233
|
+
*
|
234
|
+
* Init Function
|
235
|
+
*
|
236
|
+
****************************************************************************/
|
237
|
+
|
238
|
+
void
|
239
|
+
Init_term(void)
|
240
|
+
{
|
241
|
+
//Term
|
242
|
+
cTerm = rb_define_class_under(mIndex, "Term", rb_cObject);
|
243
|
+
rb_define_alloc_func(cTerm, frt_term_alloc);
|
244
|
+
rb_include_module(cTerm, rb_mComparable);
|
245
|
+
|
246
|
+
rb_define_method(cTerm, "initialize", frt_term_init, 2);
|
247
|
+
rb_define_method(cTerm, "set!", frt_term_set, 2);
|
248
|
+
rb_define_method(cTerm, "to_s", frt_term_to_s, 0);
|
249
|
+
rb_define_method(cTerm, "<=>", frt_term_compare_to, 1);
|
250
|
+
rb_define_method(cTerm, "<", frt_term_lt, 1);
|
251
|
+
rb_define_method(cTerm, ">", frt_term_gt, 1);
|
252
|
+
rb_define_method(cTerm, "<=", frt_term_le, 1);
|
253
|
+
rb_define_method(cTerm, ">=", frt_term_ge, 1);
|
254
|
+
rb_define_method(cTerm, "eql?", frt_term_eq, 1);
|
255
|
+
rb_define_method(cTerm, "==", frt_term_eq, 1);
|
256
|
+
rb_define_method(cTerm, "text", frt_term_get_text, 0);
|
257
|
+
rb_define_method(cTerm, "text=", frt_term_set_text, 1);
|
258
|
+
rb_define_method(cTerm, "field", frt_term_get_field, 0);
|
259
|
+
rb_define_method(cTerm, "field=", frt_term_set_field, 1);
|
260
|
+
rb_define_method(cTerm, "hash", frt_term_hash, 0);
|
261
|
+
}
|