ferret 0.9.6 → 0.10.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/MIT-LICENSE +1 -1
- data/README +12 -24
- data/Rakefile +38 -54
- data/TODO +14 -17
- data/ext/analysis.c +982 -823
- data/ext/analysis.h +133 -76
- data/ext/array.c +96 -58
- data/ext/array.h +40 -13
- data/ext/bitvector.c +476 -118
- data/ext/bitvector.h +264 -22
- data/ext/compound_io.c +217 -229
- data/ext/defines.h +49 -0
- data/ext/document.c +107 -317
- data/ext/document.h +31 -65
- data/ext/except.c +81 -36
- data/ext/except.h +117 -55
- data/ext/extconf.rb +2 -9
- data/ext/ferret.c +211 -104
- data/ext/ferret.h +22 -11
- data/ext/filter.c +97 -82
- data/ext/fs_store.c +348 -367
- data/ext/global.c +226 -188
- data/ext/global.h +44 -26
- data/ext/hash.c +474 -391
- data/ext/hash.h +441 -68
- data/ext/hashset.c +124 -96
- data/ext/hashset.h +169 -20
- data/ext/helper.c +56 -5
- data/ext/helper.h +7 -0
- data/ext/inc/lang.h +29 -49
- data/ext/inc/threading.h +31 -0
- data/ext/ind.c +288 -278
- data/ext/ind.h +68 -0
- data/ext/index.c +5688 -0
- data/ext/index.h +663 -616
- data/ext/lang.h +29 -49
- data/ext/libstemmer.c +3 -3
- data/ext/mem_pool.c +84 -0
- data/ext/mem_pool.h +35 -0
- data/ext/posh.c +1006 -0
- data/ext/posh.h +1007 -0
- data/ext/priorityqueue.c +117 -194
- data/ext/priorityqueue.h +135 -39
- data/ext/q_boolean.c +1305 -1108
- data/ext/q_const_score.c +106 -93
- data/ext/q_filtered_query.c +138 -135
- data/ext/q_fuzzy.c +206 -242
- data/ext/q_match_all.c +94 -80
- data/ext/q_multi_term.c +663 -0
- data/ext/q_parser.c +667 -593
- data/ext/q_phrase.c +992 -555
- data/ext/q_prefix.c +72 -61
- data/ext/q_range.c +235 -210
- data/ext/q_span.c +1480 -1166
- data/ext/q_term.c +273 -246
- data/ext/q_wildcard.c +127 -114
- data/ext/r_analysis.c +1720 -711
- data/ext/r_index.c +3049 -0
- data/ext/r_qparser.c +433 -146
- data/ext/r_search.c +2934 -1993
- data/ext/r_store.c +372 -143
- data/ext/r_utils.c +941 -0
- data/ext/ram_store.c +330 -326
- data/ext/search.c +1291 -668
- data/ext/search.h +403 -702
- data/ext/similarity.c +91 -113
- data/ext/similarity.h +45 -30
- data/ext/sort.c +721 -484
- data/ext/stopwords.c +361 -273
- data/ext/store.c +556 -58
- data/ext/store.h +706 -126
- data/ext/tags +3578 -2780
- data/ext/term_vectors.c +352 -0
- data/ext/threading.h +31 -0
- data/ext/win32.h +54 -0
- data/lib/ferret.rb +5 -17
- data/lib/ferret/document.rb +130 -2
- data/lib/ferret/index.rb +577 -26
- data/lib/ferret/number_tools.rb +157 -0
- data/lib/ferret_version.rb +3 -0
- data/test/test_helper.rb +5 -13
- data/test/unit/analysis/tc_analyzer.rb +513 -1
- data/test/unit/analysis/{ctc_tokenstream.rb → tc_token_stream.rb} +23 -0
- data/test/unit/index/tc_index.rb +183 -240
- data/test/unit/index/tc_index_reader.rb +312 -479
- data/test/unit/index/tc_index_writer.rb +397 -13
- data/test/unit/index/th_doc.rb +269 -206
- data/test/unit/query_parser/tc_query_parser.rb +40 -33
- data/test/unit/search/tc_filter.rb +59 -71
- data/test/unit/search/tc_fuzzy_query.rb +24 -16
- data/test/unit/search/tc_index_searcher.rb +23 -201
- data/test/unit/search/tc_multi_searcher.rb +78 -226
- data/test/unit/search/tc_search_and_sort.rb +93 -81
- data/test/unit/search/tc_sort.rb +23 -23
- data/test/unit/search/tc_sort_field.rb +7 -7
- data/test/unit/search/tc_spans.rb +51 -47
- data/test/unit/search/tm_searcher.rb +339 -0
- data/test/unit/store/tc_fs_store.rb +1 -1
- data/test/unit/store/tm_store_lock.rb +3 -3
- data/test/unit/tc_document.rb +81 -0
- data/test/unit/ts_analysis.rb +1 -1
- data/test/unit/ts_utils.rb +1 -1
- data/test/unit/utils/tc_bit_vector.rb +288 -0
- data/test/unit/utils/tc_number_tools.rb +117 -0
- data/test/unit/utils/tc_priority_queue.rb +106 -0
- metadata +140 -301
- data/CHANGELOG +0 -9
- data/ext/dummy.exe +0 -0
- data/ext/field.c +0 -408
- data/ext/frtio.h +0 -13
- data/ext/inc/except.h +0 -90
- data/ext/index_io.c +0 -382
- data/ext/index_rw.c +0 -2658
- data/ext/lang.c +0 -41
- data/ext/nix_io.c +0 -134
- data/ext/q_multi_phrase.c +0 -380
- data/ext/r_doc.c +0 -582
- data/ext/r_index_io.c +0 -1021
- data/ext/r_term.c +0 -219
- data/ext/term.c +0 -820
- data/ext/termdocs.c +0 -611
- data/ext/vector.c +0 -637
- data/ext/w32_io.c +0 -150
- data/lib/ferret/analysis.rb +0 -11
- data/lib/ferret/analysis/analyzers.rb +0 -112
- data/lib/ferret/analysis/standard_tokenizer.rb +0 -71
- data/lib/ferret/analysis/token.rb +0 -100
- data/lib/ferret/analysis/token_filters.rb +0 -86
- data/lib/ferret/analysis/token_stream.rb +0 -26
- data/lib/ferret/analysis/tokenizers.rb +0 -112
- data/lib/ferret/analysis/word_list_loader.rb +0 -27
- data/lib/ferret/document/document.rb +0 -152
- data/lib/ferret/document/field.rb +0 -312
- data/lib/ferret/index/compound_file_io.rb +0 -338
- data/lib/ferret/index/document_writer.rb +0 -289
- data/lib/ferret/index/field_infos.rb +0 -279
- data/lib/ferret/index/fields_io.rb +0 -181
- data/lib/ferret/index/index.rb +0 -675
- data/lib/ferret/index/index_file_names.rb +0 -33
- data/lib/ferret/index/index_reader.rb +0 -503
- data/lib/ferret/index/index_writer.rb +0 -534
- data/lib/ferret/index/multi_reader.rb +0 -377
- data/lib/ferret/index/multiple_term_doc_pos_enum.rb +0 -98
- data/lib/ferret/index/segment_infos.rb +0 -130
- data/lib/ferret/index/segment_merge_info.rb +0 -49
- data/lib/ferret/index/segment_merge_queue.rb +0 -16
- data/lib/ferret/index/segment_merger.rb +0 -358
- data/lib/ferret/index/segment_reader.rb +0 -412
- data/lib/ferret/index/segment_term_enum.rb +0 -169
- data/lib/ferret/index/segment_term_vector.rb +0 -58
- data/lib/ferret/index/term.rb +0 -53
- data/lib/ferret/index/term_buffer.rb +0 -83
- data/lib/ferret/index/term_doc_enum.rb +0 -291
- data/lib/ferret/index/term_enum.rb +0 -52
- data/lib/ferret/index/term_info.rb +0 -37
- data/lib/ferret/index/term_infos_io.rb +0 -321
- data/lib/ferret/index/term_vector_offset_info.rb +0 -20
- data/lib/ferret/index/term_vectors_io.rb +0 -553
- data/lib/ferret/query_parser.rb +0 -312
- data/lib/ferret/query_parser/query_parser.tab.rb +0 -928
- data/lib/ferret/search.rb +0 -50
- data/lib/ferret/search/boolean_clause.rb +0 -100
- data/lib/ferret/search/boolean_query.rb +0 -299
- data/lib/ferret/search/boolean_scorer.rb +0 -294
- data/lib/ferret/search/caching_wrapper_filter.rb +0 -40
- data/lib/ferret/search/conjunction_scorer.rb +0 -99
- data/lib/ferret/search/disjunction_sum_scorer.rb +0 -205
- data/lib/ferret/search/exact_phrase_scorer.rb +0 -32
- data/lib/ferret/search/explanation.rb +0 -41
- data/lib/ferret/search/field_cache.rb +0 -215
- data/lib/ferret/search/field_doc.rb +0 -31
- data/lib/ferret/search/field_sorted_hit_queue.rb +0 -184
- data/lib/ferret/search/filter.rb +0 -11
- data/lib/ferret/search/filtered_query.rb +0 -130
- data/lib/ferret/search/filtered_term_enum.rb +0 -79
- data/lib/ferret/search/fuzzy_query.rb +0 -154
- data/lib/ferret/search/fuzzy_term_enum.rb +0 -247
- data/lib/ferret/search/hit_collector.rb +0 -34
- data/lib/ferret/search/hit_queue.rb +0 -11
- data/lib/ferret/search/index_searcher.rb +0 -200
- data/lib/ferret/search/match_all_query.rb +0 -104
- data/lib/ferret/search/multi_phrase_query.rb +0 -216
- data/lib/ferret/search/multi_searcher.rb +0 -261
- data/lib/ferret/search/multi_term_query.rb +0 -65
- data/lib/ferret/search/non_matching_scorer.rb +0 -22
- data/lib/ferret/search/phrase_positions.rb +0 -55
- data/lib/ferret/search/phrase_query.rb +0 -214
- data/lib/ferret/search/phrase_scorer.rb +0 -152
- data/lib/ferret/search/prefix_query.rb +0 -54
- data/lib/ferret/search/query.rb +0 -140
- data/lib/ferret/search/query_filter.rb +0 -51
- data/lib/ferret/search/range_filter.rb +0 -103
- data/lib/ferret/search/range_query.rb +0 -139
- data/lib/ferret/search/req_excl_scorer.rb +0 -125
- data/lib/ferret/search/req_opt_sum_scorer.rb +0 -70
- data/lib/ferret/search/score_doc.rb +0 -38
- data/lib/ferret/search/score_doc_comparator.rb +0 -114
- data/lib/ferret/search/scorer.rb +0 -91
- data/lib/ferret/search/similarity.rb +0 -278
- data/lib/ferret/search/sloppy_phrase_scorer.rb +0 -47
- data/lib/ferret/search/sort.rb +0 -112
- data/lib/ferret/search/sort_comparator.rb +0 -60
- data/lib/ferret/search/sort_field.rb +0 -91
- data/lib/ferret/search/spans.rb +0 -12
- data/lib/ferret/search/spans/near_spans_enum.rb +0 -304
- data/lib/ferret/search/spans/span_first_query.rb +0 -79
- data/lib/ferret/search/spans/span_near_query.rb +0 -108
- data/lib/ferret/search/spans/span_not_query.rb +0 -130
- data/lib/ferret/search/spans/span_or_query.rb +0 -176
- data/lib/ferret/search/spans/span_query.rb +0 -25
- data/lib/ferret/search/spans/span_scorer.rb +0 -74
- data/lib/ferret/search/spans/span_term_query.rb +0 -105
- data/lib/ferret/search/spans/span_weight.rb +0 -84
- data/lib/ferret/search/spans/spans_enum.rb +0 -44
- data/lib/ferret/search/term_query.rb +0 -128
- data/lib/ferret/search/term_scorer.rb +0 -183
- data/lib/ferret/search/top_docs.rb +0 -36
- data/lib/ferret/search/top_field_docs.rb +0 -17
- data/lib/ferret/search/weight.rb +0 -54
- data/lib/ferret/search/wildcard_query.rb +0 -26
- data/lib/ferret/search/wildcard_term_enum.rb +0 -61
- data/lib/ferret/stemmers.rb +0 -1
- data/lib/ferret/stemmers/porter_stemmer.rb +0 -218
- data/lib/ferret/store.rb +0 -5
- data/lib/ferret/store/buffered_index_io.rb +0 -190
- data/lib/ferret/store/directory.rb +0 -141
- data/lib/ferret/store/fs_store.rb +0 -381
- data/lib/ferret/store/index_io.rb +0 -245
- data/lib/ferret/store/ram_store.rb +0 -286
- data/lib/ferret/utils.rb +0 -8
- data/lib/ferret/utils/bit_vector.rb +0 -123
- data/lib/ferret/utils/date_tools.rb +0 -138
- data/lib/ferret/utils/number_tools.rb +0 -91
- data/lib/ferret/utils/parameter.rb +0 -41
- data/lib/ferret/utils/priority_queue.rb +0 -120
- data/lib/ferret/utils/string_helper.rb +0 -47
- data/lib/ferret/utils/thread_local.rb +0 -28
- data/lib/ferret/utils/weak_key_hash.rb +0 -60
- data/lib/rferret.rb +0 -37
- data/rake_utils/code_statistics.rb +0 -106
- data/test/benchmark/tb_ram_store.rb +0 -76
- data/test/benchmark/tb_rw_vint.rb +0 -26
- data/test/functional/thread_safety_index_test.rb +0 -81
- data/test/functional/thread_safety_test.rb +0 -137
- data/test/longrunning/tc_numbertools.rb +0 -60
- data/test/longrunning/tm_store.rb +0 -19
- data/test/unit/analysis/ctc_analyzer.rb +0 -532
- data/test/unit/analysis/data/wordfile +0 -6
- data/test/unit/analysis/rtc_letter_tokenizer.rb +0 -20
- data/test/unit/analysis/rtc_lower_case_filter.rb +0 -20
- data/test/unit/analysis/rtc_lower_case_tokenizer.rb +0 -27
- data/test/unit/analysis/rtc_per_field_analyzer_wrapper.rb +0 -39
- data/test/unit/analysis/rtc_porter_stem_filter.rb +0 -16
- data/test/unit/analysis/rtc_standard_analyzer.rb +0 -20
- data/test/unit/analysis/rtc_standard_tokenizer.rb +0 -20
- data/test/unit/analysis/rtc_stop_analyzer.rb +0 -20
- data/test/unit/analysis/rtc_stop_filter.rb +0 -14
- data/test/unit/analysis/rtc_white_space_analyzer.rb +0 -21
- data/test/unit/analysis/rtc_white_space_tokenizer.rb +0 -20
- data/test/unit/analysis/rtc_word_list_loader.rb +0 -32
- data/test/unit/analysis/tc_token.rb +0 -25
- data/test/unit/document/rtc_field.rb +0 -28
- data/test/unit/document/tc_document.rb +0 -47
- data/test/unit/document/tc_field.rb +0 -98
- data/test/unit/index/rtc_compound_file_io.rb +0 -107
- data/test/unit/index/rtc_field_infos.rb +0 -127
- data/test/unit/index/rtc_fields_io.rb +0 -167
- data/test/unit/index/rtc_multiple_term_doc_pos_enum.rb +0 -83
- data/test/unit/index/rtc_segment_infos.rb +0 -74
- data/test/unit/index/rtc_segment_term_docs.rb +0 -17
- data/test/unit/index/rtc_segment_term_enum.rb +0 -60
- data/test/unit/index/rtc_segment_term_vector.rb +0 -71
- data/test/unit/index/rtc_term_buffer.rb +0 -57
- data/test/unit/index/rtc_term_info.rb +0 -19
- data/test/unit/index/rtc_term_infos_io.rb +0 -192
- data/test/unit/index/rtc_term_vectors_io.rb +0 -108
- data/test/unit/index/tc_term.rb +0 -27
- data/test/unit/index/tc_term_voi.rb +0 -18
- data/test/unit/search/rtc_similarity.rb +0 -37
- data/test/unit/search/rtc_sort_field.rb +0 -14
- data/test/unit/search/tc_multi_searcher2.rb +0 -126
- data/test/unit/store/rtc_fs_store.rb +0 -62
- data/test/unit/store/rtc_ram_store.rb +0 -15
- data/test/unit/store/rtm_store.rb +0 -150
- data/test/unit/store/rtm_store_lock.rb +0 -2
- data/test/unit/ts_document.rb +0 -2
- data/test/unit/utils/rtc_bit_vector.rb +0 -73
- data/test/unit/utils/rtc_date_tools.rb +0 -50
- data/test/unit/utils/rtc_number_tools.rb +0 -59
- data/test/unit/utils/rtc_parameter.rb +0 -40
- data/test/unit/utils/rtc_priority_queue.rb +0 -62
- data/test/unit/utils/rtc_string_helper.rb +0 -21
- data/test/unit/utils/rtc_thread.rb +0 -61
- data/test/unit/utils/rtc_weak_key_hash.rb +0 -25
- data/test/utils/number_to_spoken.rb +0 -132
data/ext/global.c
CHANGED
@@ -7,283 +7,321 @@
|
|
7
7
|
#include <math.h>
|
8
8
|
#include <ctype.h>
|
9
9
|
|
10
|
-
static char * const ESTRDUP_MEM_ERROR_MSG = "estrdup failed";
|
11
|
-
static char * const MEM_ERROR_MSG = "malloc failed";
|
12
|
-
|
13
10
|
const char *EMPTY_STRING = "";
|
14
11
|
|
15
|
-
|
12
|
+
bool x_do_logging = false;
|
13
|
+
|
14
|
+
inline int min3(int a, int b, int c)
|
16
15
|
{
|
17
|
-
|
16
|
+
return MIN3(a, b, c);
|
18
17
|
}
|
19
18
|
|
20
|
-
int min2(int a, int b)
|
19
|
+
inline int min2(int a, int b)
|
21
20
|
{
|
22
|
-
|
21
|
+
return MIN(a, b);
|
23
22
|
}
|
24
23
|
|
25
|
-
int max3(int a, int b, int c)
|
24
|
+
inline int max3(int a, int b, int c)
|
26
25
|
{
|
27
|
-
|
26
|
+
return MAX3(a, b, c);
|
28
27
|
}
|
29
28
|
|
30
|
-
int max2(int a, int b)
|
29
|
+
inline int max2(int a, int b)
|
31
30
|
{
|
32
|
-
|
31
|
+
return MAX(a, b);
|
33
32
|
}
|
34
33
|
|
35
34
|
int scmp(const void *p1, const void *p2)
|
36
35
|
{
|
37
|
-
|
36
|
+
return strcmp(*(char **) p1, *(char **) p2);
|
38
37
|
}
|
39
38
|
|
40
|
-
int
|
39
|
+
int icmp(const void *p1, const void *p2)
|
41
40
|
{
|
42
|
-
|
41
|
+
int i1 = *(int *) p1;
|
42
|
+
int i2 = *(int *) p2;
|
43
|
+
|
44
|
+
if (i1 > i2) {
|
45
|
+
return 1;
|
46
|
+
}
|
47
|
+
else if (i1 < i2) {
|
48
|
+
return -1;
|
49
|
+
}
|
50
|
+
return 0;
|
43
51
|
}
|
44
52
|
|
45
|
-
int
|
53
|
+
int icmp_risky(const void *p1, const void *p2)
|
46
54
|
{
|
47
|
-
int
|
48
|
-
int i2 = *(int *)p2;
|
49
|
-
|
50
|
-
if (i1 > i2) return 1;
|
51
|
-
else if (i1 < i2) return -1;
|
52
|
-
return 0;
|
55
|
+
return (*(int *)p1) - *((int *)p2);
|
53
56
|
}
|
54
57
|
|
55
58
|
|
56
|
-
/*
|
57
|
-
|
59
|
+
/* frt_exit: print error message and exit */
|
60
|
+
#ifdef FRT_HAS_VARARGS
|
61
|
+
void vfrt_exit(const char *file, int line_num, const char *func,
|
62
|
+
const char *err_type, const char *fmt, va_list args)
|
63
|
+
#else
|
64
|
+
void V_FRT_EXIT(const char *err_type, const char *fmt, va_list args)
|
65
|
+
#endif
|
58
66
|
{
|
59
|
-
|
67
|
+
fflush(stdout);
|
68
|
+
fprintf(stderr, "\n");
|
69
|
+
if (progname() != NULL) {
|
70
|
+
fprintf(stderr, "%s: ", progname());
|
71
|
+
}
|
60
72
|
|
61
|
-
|
62
|
-
|
63
|
-
|
73
|
+
#ifdef FRT_HAS_VARARGS
|
74
|
+
fprintf(stderr, "%s occured at <%s>:%d in %s\n",
|
75
|
+
err_type, file, line_num, func);
|
76
|
+
#else
|
77
|
+
fprintf(stderr, "%s occured:\n", err_type);
|
78
|
+
#endif
|
79
|
+
vfprintf(stderr, fmt, args);
|
64
80
|
|
65
|
-
|
66
|
-
|
67
|
-
|
81
|
+
if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':') {
|
82
|
+
fprintf(stderr, " %s", strerror(errno));
|
83
|
+
}
|
68
84
|
|
69
|
-
|
70
|
-
|
71
|
-
fprintf(stderr, "\n");
|
72
|
-
exit(2); /* conventional value for failed execution */
|
85
|
+
fprintf(stderr, "\n");
|
86
|
+
exit(2); /* conventional value for failed execution */
|
73
87
|
}
|
74
88
|
|
75
|
-
|
76
|
-
|
89
|
+
|
90
|
+
#ifdef FRT_HAS_VARARGS
|
91
|
+
void frt_exit(const char *file, int line_num, const char *func,
|
92
|
+
const char *err_type, const char *fmt, ...)
|
93
|
+
#else
|
94
|
+
void FRT_EXIT(const char *err_type, const char *fmt, ...)
|
95
|
+
#endif
|
77
96
|
{
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
va_start(args, fmt);
|
87
|
-
vfprintf(stderr, fmt, args);
|
88
|
-
va_end(args);
|
89
|
-
|
90
|
-
if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':')
|
91
|
-
fprintf(stderr, " %s", strerror(errno));
|
92
|
-
fprintf(stderr, "\n");
|
93
|
-
exit(2); /* conventional value for failed execution */
|
97
|
+
va_list args;
|
98
|
+
va_start(args, fmt);
|
99
|
+
#ifdef FRT_HAS_VARARGS
|
100
|
+
vfrt_exit(file, line_num, func, err_type, fmt, args);
|
101
|
+
#else
|
102
|
+
V_FRT_EXIT(err_type, fmt, args);
|
103
|
+
#endif
|
104
|
+
va_end(args);
|
94
105
|
}
|
95
106
|
|
107
|
+
|
96
108
|
/* weprintf: print error message and don't exit */
|
97
109
|
void weprintf(const char *fmt, ...)
|
98
110
|
{
|
99
|
-
|
111
|
+
va_list args;
|
100
112
|
|
101
|
-
|
102
|
-
|
103
|
-
|
113
|
+
fflush(stdout);
|
114
|
+
if (progname() != NULL)
|
115
|
+
fprintf(stderr, "%s: ", progname());
|
104
116
|
|
105
|
-
|
106
|
-
|
107
|
-
|
117
|
+
va_start(args, fmt);
|
118
|
+
vfprintf(stderr, fmt, args);
|
119
|
+
va_end(args);
|
108
120
|
|
109
|
-
|
110
|
-
|
111
|
-
|
121
|
+
if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':')
|
122
|
+
fprintf(stderr, " %s", strerror(errno));
|
123
|
+
fprintf(stderr, "\n");
|
112
124
|
}
|
113
125
|
|
114
|
-
|
126
|
+
#define MAX_PROG_NAME 200
|
127
|
+
static char name[MAX_PROG_NAME]; /* program name for error msgs */
|
115
128
|
|
116
129
|
/* setprogname: set stored name of program */
|
117
130
|
void setprogname(const char *str)
|
118
131
|
{
|
119
|
-
|
132
|
+
strncpy(name, str, MAX_PROG_NAME - 1);
|
120
133
|
}
|
121
134
|
|
122
|
-
char *progname(
|
135
|
+
char *progname()
|
123
136
|
{
|
124
|
-
|
137
|
+
return name;
|
125
138
|
}
|
126
139
|
|
127
140
|
/* concatenate two strings freeing the second */
|
128
141
|
char *estrcat(char *str1, char *str2)
|
129
142
|
{
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
143
|
+
size_t len1 = strlen(str1);
|
144
|
+
size_t len2 = strlen(str2);
|
145
|
+
REALLOC_N(str1, char, len1 + len2 + 3); /* leave room for <CR> */
|
146
|
+
memcpy(str1 + len1, str2, len2 + 1); /* make sure '\0' copied too */
|
147
|
+
free(str2);
|
148
|
+
return str1;
|
136
149
|
}
|
137
150
|
|
138
151
|
/* epstrdup: duplicate a string with a format, report if error */
|
139
152
|
char *epstrdup(const char *fmt, int len, ...)
|
140
153
|
{
|
141
|
-
|
142
|
-
|
143
|
-
|
154
|
+
char *string;
|
155
|
+
va_list args;
|
156
|
+
len += (int) strlen(fmt);
|
144
157
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
158
|
+
string = ALLOC_N(char, len + 1);
|
159
|
+
va_start(args, len);
|
160
|
+
vsprintf(string, fmt, args);
|
161
|
+
va_end(args);
|
149
162
|
|
150
|
-
|
163
|
+
return string;
|
151
164
|
}
|
152
165
|
|
153
166
|
/* estrdup: duplicate a string, report if error */
|
154
167
|
char *estrdup(const char *s)
|
155
168
|
{
|
156
|
-
|
169
|
+
char *t = (char *)malloc(strlen(s) + 1);
|
157
170
|
|
158
|
-
|
159
|
-
|
160
|
-
|
171
|
+
if (t == NULL) {
|
172
|
+
RAISE(MEM_ERROR, "failed to allocate %d bytes", (int)strlen(s) + 1);
|
173
|
+
}
|
161
174
|
|
162
|
-
|
163
|
-
|
175
|
+
strcpy(t, s);
|
176
|
+
return t;
|
164
177
|
}
|
165
178
|
|
166
179
|
/* emalloc: malloc and report if error */
|
167
180
|
void *emalloc(size_t size)
|
168
181
|
{
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
182
|
+
void *p = malloc(size);
|
183
|
+
|
184
|
+
if (p == NULL) {
|
185
|
+
RAISE(MEM_ERROR, "failed to allocate %d bytes", (int)size);
|
186
|
+
}
|
187
|
+
|
188
|
+
return p;
|
189
|
+
}
|
190
|
+
|
191
|
+
/* ecalloc: malloc, zeroset and report if error */
|
192
|
+
void *ecalloc(size_t size)
|
193
|
+
{
|
194
|
+
void *p = calloc(1, size);
|
195
|
+
|
196
|
+
if (p == NULL) {
|
197
|
+
RAISE(MEM_ERROR, "failed to allocate %d bytes", (int)size);
|
198
|
+
}
|
199
|
+
|
200
|
+
return p;
|
174
201
|
}
|
175
202
|
|
203
|
+
/* erealloc: realloc and report if error */
|
176
204
|
void *erealloc(void *ptr, size_t size)
|
177
205
|
{
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
206
|
+
void *p = realloc(ptr, size);
|
207
|
+
|
208
|
+
if (p == NULL) {
|
209
|
+
RAISE(MEM_ERROR, "failed to reallocate %d bytes", (int)size);
|
210
|
+
}
|
211
|
+
|
212
|
+
return p;
|
183
213
|
}
|
184
214
|
|
185
|
-
/*
|
186
|
-
*
|
187
|
-
* numeric.c. We use it so that tests comparing floats as strings will pass.
|
215
|
+
/* Pretty print a float to the buffer. The buffer should have at least 32
|
216
|
+
* bytes available.
|
188
217
|
*/
|
189
218
|
char *dbl_to_s(char *buf, double num)
|
190
219
|
{
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
if (!isdigit(e[-1])) {
|
204
|
-
/* reformat if ended with decimal point (ex 111111111111111.) */
|
205
|
-
sprintf(buf, "%#.6e", num);
|
220
|
+
char *p, *e;
|
221
|
+
|
222
|
+
#ifdef FRT_IS_C99
|
223
|
+
if (isinf(num)) {
|
224
|
+
return estrdup(num < 0 ? "-Infinity" : "Infinity");
|
225
|
+
}
|
226
|
+
else if (isnan(num)) {
|
227
|
+
return estrdup("NaN");
|
228
|
+
}
|
229
|
+
#endif
|
230
|
+
|
231
|
+
sprintf(buf, "%#.7g", num);
|
206
232
|
if (!(e = strchr(buf, 'e'))) {
|
207
|
-
|
233
|
+
e = buf + strlen(buf);
|
208
234
|
}
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
235
|
+
if (!isdigit(e[-1])) {
|
236
|
+
/* reformat if ended with decimal point (ex 111111111111111.) */
|
237
|
+
sprintf(buf, "%#.6e", num);
|
238
|
+
if (!(e = strchr(buf, 'e'))) {
|
239
|
+
e = buf + strlen(buf);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
p = e;
|
243
|
+
while (p[-1] == '0' && isdigit(p[-2])) {
|
244
|
+
p--;
|
245
|
+
}
|
246
|
+
|
247
|
+
memmove(p, e, strlen(e) + 1);
|
248
|
+
return buf;
|
215
249
|
}
|
216
250
|
|
217
|
-
|
251
|
+
/* strfmt: like sprintf except that it allocates memory for the string */
|
252
|
+
char *vstrfmt(const char *fmt, va_list args)
|
218
253
|
{
|
219
|
-
|
220
|
-
*
|
221
|
-
|
222
|
-
|
254
|
+
char *string;
|
255
|
+
char *p = (char *) fmt, *q;
|
256
|
+
int len = (int) strlen(fmt) + 1;
|
257
|
+
int slen;
|
258
|
+
char *s;
|
259
|
+
long i;
|
260
|
+
double d;
|
261
|
+
|
262
|
+
q = string = ALLOC_N(char, len);
|
263
|
+
|
264
|
+
while (*p) {
|
265
|
+
if (*p == '%') {
|
266
|
+
p++;
|
267
|
+
switch (*p) {
|
268
|
+
case 's':
|
269
|
+
p++;
|
270
|
+
s = va_arg(args, char *);
|
271
|
+
if (s) {
|
272
|
+
slen = (int) strlen(s);
|
273
|
+
len += slen;
|
274
|
+
*q = 0;
|
275
|
+
REALLOC_N(string, char, len);
|
276
|
+
q = string + strlen(string);
|
277
|
+
sprintf(q, s);
|
278
|
+
q += slen;
|
279
|
+
}
|
280
|
+
continue;
|
281
|
+
case 'f':
|
282
|
+
p++;
|
283
|
+
len += 32;
|
284
|
+
*q = 0;
|
285
|
+
REALLOC_N(string, char, len);
|
286
|
+
q = string + strlen(string);
|
287
|
+
d = va_arg(args, double);
|
288
|
+
dbl_to_s(q, d);
|
289
|
+
q += strlen(q);
|
290
|
+
continue;
|
291
|
+
case 'd':
|
292
|
+
p++;
|
293
|
+
len += 20;
|
294
|
+
*q = 0;
|
295
|
+
REALLOC_N(string, char, len);
|
296
|
+
q = string + strlen(string);
|
297
|
+
i = va_arg(args, long);
|
298
|
+
sprintf(q, "%ld", i);
|
299
|
+
q += strlen(q);
|
300
|
+
continue;
|
301
|
+
default:
|
302
|
+
break;
|
303
|
+
}
|
304
|
+
}
|
305
|
+
*q = *p;
|
306
|
+
p++;
|
307
|
+
q++;
|
308
|
+
}
|
309
|
+
*q = 0;
|
310
|
+
|
311
|
+
return string;
|
223
312
|
}
|
224
313
|
|
225
|
-
/* strfmt: like sprintf except that it allocates memory for the string */
|
226
314
|
char *strfmt(const char *fmt, ...)
|
227
315
|
{
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
va_start(args, fmt);
|
240
|
-
while (*p) {
|
241
|
-
if (*p == '%') {
|
242
|
-
p++;
|
243
|
-
switch (*p) {
|
244
|
-
case 's':
|
245
|
-
p++;
|
246
|
-
s = va_arg(args, char *);
|
247
|
-
if (s) {
|
248
|
-
slen = (int)strlen(s);
|
249
|
-
len += slen;
|
250
|
-
*q = 0;
|
251
|
-
REALLOC_N(string, char, len);
|
252
|
-
q = string + strlen(string);
|
253
|
-
sprintf(q, s);
|
254
|
-
q += slen;
|
255
|
-
}
|
256
|
-
continue;
|
257
|
-
case 'f':
|
258
|
-
p++;
|
259
|
-
len += 32;
|
260
|
-
*q = 0;
|
261
|
-
REALLOC_N(string, char, len);
|
262
|
-
q = string + strlen(string);
|
263
|
-
d = va_arg(args, double);
|
264
|
-
dbl_to_s(q, d);
|
265
|
-
q += strlen(q);
|
266
|
-
continue;
|
267
|
-
case 'd':
|
268
|
-
p++;
|
269
|
-
len += 20;
|
270
|
-
*q = 0;
|
271
|
-
REALLOC_N(string, char, len);
|
272
|
-
q = string + strlen(string);
|
273
|
-
i = va_arg(args, long);
|
274
|
-
sprintf(q, "%ld", i);
|
275
|
-
q += strlen(q);
|
276
|
-
continue;
|
277
|
-
default:
|
278
|
-
break;
|
279
|
-
}
|
280
|
-
}
|
281
|
-
*q = *p;
|
282
|
-
p++;
|
283
|
-
q++;
|
284
|
-
}
|
285
|
-
va_end(args);
|
286
|
-
*q = 0;
|
287
|
-
|
288
|
-
return string;
|
316
|
+
va_list args;
|
317
|
+
char *str;
|
318
|
+
va_start(args, fmt);
|
319
|
+
str = vstrfmt(fmt, args);
|
320
|
+
va_end(args);
|
321
|
+
return str;
|
322
|
+
}
|
323
|
+
|
324
|
+
void dummy_free(void *p)
|
325
|
+
{
|
326
|
+
(void)p; /* suppress unused argument warning */
|
289
327
|
}
|