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