ferret 0.9.1 → 0.9.2
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/README +6 -5
- data/Rakefile +34 -13
- data/TODO +1 -0
- data/TUTORIAL +1 -1
- data/ext/analysis.c +87 -70
- data/ext/analysis.h +18 -6
- data/ext/array.c +1 -2
- data/ext/array.h +1 -1
- data/ext/bitvector.c +10 -6
- data/ext/bitvector.h +2 -2
- data/ext/compound_io.c +30 -27
- data/ext/document.c +15 -15
- data/ext/document.h +5 -5
- data/ext/except.c +2 -0
- data/ext/except.h +25 -23
- data/ext/extconf.rb +1 -0
- data/ext/ferret.c +10 -8
- data/ext/ferret.h +9 -8
- data/ext/field.c +29 -25
- data/ext/filter.c +52 -14
- data/ext/frtio.h +13 -0
- data/ext/fs_store.c +115 -170
- data/ext/global.c +9 -8
- data/ext/global.h +17 -13
- data/ext/hash.c +13 -19
- data/ext/hash.h +11 -11
- data/ext/hashset.c +5 -7
- data/ext/hashset.h +9 -8
- data/ext/helper.c +1 -1
- data/ext/helper.h +2 -1
- data/ext/inc/except.h +25 -23
- data/ext/inc/lang.h +11 -1
- data/ext/ind.c +33 -21
- data/ext/index.h +44 -39
- data/ext/index_io.c +61 -57
- data/ext/index_rw.c +418 -361
- data/ext/lang.c +10 -0
- data/ext/lang.h +11 -1
- data/ext/nix_io.c +135 -0
- data/ext/priorityqueue.c +16 -16
- data/ext/priorityqueue.h +9 -6
- data/ext/q_boolean.c +128 -76
- data/ext/q_const_score.c +20 -20
- data/ext/q_filtered_query.c +20 -20
- data/ext/q_fuzzy.c +37 -23
- data/ext/q_match_all.c +15 -19
- data/ext/q_multi_phrase.c +87 -46
- data/ext/q_parser.c +247 -119
- data/ext/q_phrase.c +86 -52
- data/ext/q_prefix.c +25 -14
- data/ext/q_range.c +59 -14
- data/ext/q_span.c +263 -172
- data/ext/q_term.c +62 -51
- data/ext/q_wildcard.c +24 -13
- data/ext/r_analysis.c +328 -80
- data/ext/r_doc.c +11 -6
- data/ext/r_index_io.c +40 -32
- data/ext/r_qparser.c +15 -14
- data/ext/r_search.c +270 -152
- data/ext/r_store.c +32 -17
- data/ext/ram_store.c +38 -22
- data/ext/search.c +617 -87
- data/ext/search.h +227 -163
- data/ext/similarity.c +54 -45
- data/ext/similarity.h +3 -3
- data/ext/sort.c +132 -53
- data/ext/store.c +21 -2
- data/ext/store.h +14 -14
- data/ext/tags +4322 -232
- data/ext/term.c +140 -109
- data/ext/termdocs.c +74 -60
- data/ext/vector.c +181 -152
- data/ext/w32_io.c +150 -0
- data/lib/ferret.rb +1 -1
- data/lib/ferret/analysis/standard_tokenizer.rb +4 -3
- data/lib/ferret/document/field.rb +1 -1
- data/lib/ferret/index/field_infos.rb +1 -1
- data/lib/ferret/index/term.rb +1 -1
- data/lib/ferret/query_parser/query_parser.tab.rb +8 -24
- data/lib/ferret/search.rb +1 -0
- data/lib/ferret/search/boolean_query.rb +0 -4
- data/lib/ferret/search/index_searcher.rb +21 -8
- data/lib/ferret/search/multi_phrase_query.rb +7 -0
- data/lib/ferret/search/multi_searcher.rb +261 -0
- data/lib/ferret/search/phrase_query.rb +1 -1
- data/lib/ferret/search/query.rb +34 -5
- data/lib/ferret/search/sort.rb +7 -3
- data/lib/ferret/search/sort_field.rb +8 -4
- data/lib/ferret/store/fs_store.rb +13 -6
- data/lib/ferret/store/index_io.rb +0 -14
- data/lib/ferret/store/ram_store.rb +3 -2
- data/lib/rferret.rb +1 -1
- data/test/unit/analysis/ctc_analyzer.rb +131 -0
- data/test/unit/analysis/ctc_tokenstream.rb +98 -9
- data/test/unit/index/tc_index.rb +40 -1
- data/test/unit/index/tc_term.rb +7 -0
- data/test/unit/index/th_doc.rb +8 -0
- data/test/unit/query_parser/tc_query_parser.rb +6 -4
- data/test/unit/search/rtc_sort_field.rb +6 -6
- data/test/unit/search/tc_index_searcher.rb +8 -0
- data/test/unit/search/tc_multi_searcher.rb +275 -0
- data/test/unit/search/tc_multi_searcher2.rb +126 -0
- data/test/unit/search/tc_search_and_sort.rb +66 -0
- metadata +31 -26
- data/test/unit/query_parser/rtc_query_parser.rb +0 -138
data/ext/global.c
CHANGED
@@ -17,7 +17,7 @@ int min3(int a, int b, int c)
|
|
17
17
|
return MIN3(a, b, c);
|
18
18
|
}
|
19
19
|
|
20
|
-
int
|
20
|
+
int min2(int a, int b)
|
21
21
|
{
|
22
22
|
return MIN(a, b);
|
23
23
|
}
|
@@ -27,7 +27,7 @@ int max3(int a, int b, int c)
|
|
27
27
|
return MAX3(a, b, c);
|
28
28
|
}
|
29
29
|
|
30
|
-
int
|
30
|
+
int max2(int a, int b)
|
31
31
|
{
|
32
32
|
return MAX(a, b);
|
33
33
|
}
|
@@ -127,8 +127,8 @@ char *progname(void)
|
|
127
127
|
/* concatenate two strings freeing the second */
|
128
128
|
char *estrcat(char *str1, char *str2)
|
129
129
|
{
|
130
|
-
|
131
|
-
|
130
|
+
size_t len1 = strlen(str1);
|
131
|
+
size_t len2 = strlen(str2);
|
132
132
|
REALLOC_N(str1, char, len1 + len2 + 3); // leave room for <CR>
|
133
133
|
memcpy(str1 + len1, str2, len2 + 1); // make sure '\0' copied too
|
134
134
|
free(str2);
|
@@ -138,10 +138,11 @@ char *estrcat(char *str1, char *str2)
|
|
138
138
|
/* epstrdup: duplicate a string with a format, report if error */
|
139
139
|
char *epstrdup(const char *fmt, int len, ...)
|
140
140
|
{
|
141
|
+
char *string;
|
141
142
|
va_list args;
|
142
|
-
len += strlen(fmt);
|
143
|
+
len += (int)strlen(fmt);
|
143
144
|
|
144
|
-
|
145
|
+
string = ALLOC_N(char, len + 1);
|
145
146
|
va_start(args, len);
|
146
147
|
vsprintf(string, fmt, args);
|
147
148
|
va_end(args);
|
@@ -227,7 +228,7 @@ char *strfmt(const char *fmt, ...)
|
|
227
228
|
char *string;
|
228
229
|
char *p = (char *)fmt, *q;
|
229
230
|
va_list args;
|
230
|
-
int len = strlen(fmt) + 1;
|
231
|
+
int len = (int)strlen(fmt) + 1;
|
231
232
|
int slen;
|
232
233
|
char *s;
|
233
234
|
long i;
|
@@ -244,7 +245,7 @@ char *strfmt(const char *fmt, ...)
|
|
244
245
|
p++;
|
245
246
|
s = va_arg(args, char *);
|
246
247
|
if (s) {
|
247
|
-
slen = strlen(s);
|
248
|
+
slen = (int)strlen(s);
|
248
249
|
len += slen;
|
249
250
|
*q = 0;
|
250
251
|
REALLOC_N(string, char, len);
|
data/ext/global.h
CHANGED
@@ -4,29 +4,34 @@
|
|
4
4
|
#include <stdlib.h>
|
5
5
|
#include <stdio.h>
|
6
6
|
#include <assert.h>
|
7
|
-
|
7
|
+
/*
|
8
|
+
#define DEBUG
|
8
9
|
#define VALGRIND
|
9
|
-
|
10
|
+
*/
|
10
11
|
#define false 0
|
11
12
|
#define true 1
|
12
13
|
|
13
|
-
typedef unsigned
|
14
|
+
typedef unsigned int bool;
|
14
15
|
typedef unsigned char uchar;
|
15
16
|
typedef unsigned int uint;
|
16
17
|
|
17
|
-
typedef void (*
|
18
|
+
typedef void (*free_ft)(void *key);
|
18
19
|
|
19
20
|
#include "lang.h"
|
20
21
|
#include "except.h"
|
21
22
|
|
23
|
+
#define ref(obj) obj->ref_cnt++
|
24
|
+
#define deref(obj) obj->ref_cnt--
|
25
|
+
|
22
26
|
#define MAX_WORD_SIZE 255
|
23
|
-
#define
|
27
|
+
#define MAX_FILE_PATH 1024
|
24
28
|
#define MAX_BUFFER_SIZE 1024
|
25
29
|
#define ARRAY_INIT_SIZE 4
|
26
30
|
|
27
31
|
#define NELEMS(array) sizeof(array)/sizeof(array[0])
|
28
32
|
|
29
33
|
#define ZEROSET(ptr, type, n) memset(ptr, 0, sizeof(type)*(n))
|
34
|
+
#define ALLOC_AND_ZERO(type) (type*)memset(emalloc(sizeof(type)), 0, sizeof(type))
|
30
35
|
#define ALLOC_AND_ZERO_N(type,n) (type*)ZEROSET(emalloc(sizeof(type)*(n)), type, n)
|
31
36
|
|
32
37
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
@@ -50,7 +55,6 @@ typedef void (*destroy_func_t)(void *p);
|
|
50
55
|
#define Jx fprintf(stderr,"%s, %d: %s\n", __FILE__, __LINE__, __func__);
|
51
56
|
#define Xj fprintf(stdout,"%s, %d: %s\n", __FILE__, __LINE__, __func__);
|
52
57
|
|
53
|
-
#define efree free
|
54
58
|
extern void *emalloc(size_t n);
|
55
59
|
extern void *erealloc(void *ptr, size_t n);
|
56
60
|
extern char *estrdup(const char *s);
|
@@ -63,12 +67,12 @@ extern int scmp(const void *p1, const void *p2);
|
|
63
67
|
extern int icmp(const void *p1, const void *p2);
|
64
68
|
extern int icmp_risky(const void *p1, const void *p2);
|
65
69
|
|
66
|
-
int
|
67
|
-
int min3(int a, int b, int c);
|
68
|
-
int
|
69
|
-
int max3(int a, int b, int c);
|
70
|
+
extern int min2(int a, int b);
|
71
|
+
extern int min3(int a, int b, int c);
|
72
|
+
extern int max2(int a, int b);
|
73
|
+
extern int max3(int a, int b, int c);
|
70
74
|
|
71
|
-
char *dbl_to_s(char *buf, double num);
|
72
|
-
void lower_str(char *str);
|
73
|
-
char *strfmt(const char *fmt, ...);
|
75
|
+
extern char *dbl_to_s(char *buf, double num);
|
76
|
+
extern void lower_str(char *str);
|
77
|
+
extern char *strfmt(const char *fmt, ...);
|
74
78
|
#endif
|
data/ext/hash.c
CHANGED
@@ -255,11 +255,9 @@ HshEntry *h_lookup(HshTable *ht, register const void *key)
|
|
255
255
|
|
256
256
|
typedef void (*free_func)(void *);
|
257
257
|
void dummy_free(void *p)
|
258
|
-
{
|
259
|
-
//printf("Shouldn't do nuthin");
|
260
|
-
}
|
258
|
+
{ }
|
261
259
|
|
262
|
-
HshTable *h_new_str(
|
260
|
+
HshTable *h_new_str(free_ft free_key, free_ft free_value)
|
263
261
|
{
|
264
262
|
HshTable *ht;
|
265
263
|
if (num_free_hts > 0) {
|
@@ -278,10 +276,7 @@ HshTable *h_new_str(void (*free_key)(void *key), void (*free_value)(void *value)
|
|
278
276
|
return ht;
|
279
277
|
}
|
280
278
|
|
281
|
-
HshTable *h_new(
|
282
|
-
int (*eq)(const void *key1, const void *key2),
|
283
|
-
void (*free_key)(void *key),
|
284
|
-
void (*free_value)(void *value))
|
279
|
+
HshTable *h_new(hash_ft hash, eq_ft eq, free_ft free_key, free_ft free_value)
|
285
280
|
{
|
286
281
|
HshTable *ht = h_new_str(free_key, free_value);
|
287
282
|
|
@@ -298,7 +293,7 @@ void h_clear(HshTable *ht)
|
|
298
293
|
free_func free_key = ht->free_key;
|
299
294
|
free_func free_value = ht->free_value;
|
300
295
|
|
301
|
-
|
296
|
+
/* Clear all the hash values and keys as necessary */
|
302
297
|
for (i = 0; i <= ht->mask; i++) {
|
303
298
|
he = &ht->table[i];
|
304
299
|
if (he->key != NULL && he->key != dummy_key) {
|
@@ -309,13 +304,15 @@ void h_clear(HshTable *ht)
|
|
309
304
|
}
|
310
305
|
ht->used = 0;
|
311
306
|
ht->fill = 0;
|
307
|
+
/* for some reason the following line doesn't seem to help */
|
308
|
+
/* ZEROSET(ht->table, HshEntry, ht->mask + 1); */
|
312
309
|
}
|
313
310
|
|
314
311
|
void h_destroy(HshTable *ht)
|
315
312
|
{
|
316
313
|
h_clear(ht);
|
317
314
|
|
318
|
-
|
315
|
+
/* if a new table was created, be sure to free it */
|
319
316
|
if (ht->table != ht->smalltable) free(ht->table);
|
320
317
|
|
321
318
|
if (num_free_hts < MAX_FREE_HASH_TABLES) {
|
@@ -389,20 +386,16 @@ int h_resize(HshTable *ht, int min_newsize) {
|
|
389
386
|
}
|
390
387
|
memset(ht->table, 0, sizeof(HshEntry) * newsize);
|
391
388
|
i = ht->used;
|
392
|
-
//i = ht->fill;
|
393
389
|
ht->fill = ht->used;
|
394
390
|
ht->mask = newsize - 1;
|
395
|
-
|
391
|
+
|
396
392
|
for (he_old = oldtable; i > 0; he_old++) {
|
397
|
-
|
398
|
-
if (he_old->value != NULL) {// active entry
|
393
|
+
if (he_old->value != NULL) {/* active entry */
|
399
394
|
he_new = ht->lookup(ht, he_old->key);
|
400
395
|
he_new->key = he_old->key;
|
401
396
|
he_new->value = he_old->value;
|
402
397
|
i--;
|
403
|
-
|
404
|
-
// i--;
|
405
|
-
} // else empty entry so nothing to do
|
398
|
+
} /* else empty entry so nothing to do */
|
406
399
|
}
|
407
400
|
if (oldtable != smallcopy && oldtable != ht->smalltable)
|
408
401
|
free(oldtable);
|
@@ -453,7 +446,7 @@ void h_each(HshTable *ht,
|
|
453
446
|
HshEntry *he;
|
454
447
|
int i = ht->used;
|
455
448
|
for (he = ht->table; i > 0; he++) {
|
456
|
-
if (he->value != NULL) {
|
449
|
+
if (he->value != NULL) {/* active entry */
|
457
450
|
each_kv(he->key, he->value, arg);
|
458
451
|
i--;
|
459
452
|
}
|
@@ -468,6 +461,7 @@ HshTable *h_clone(HshTable *ht,
|
|
468
461
|
HshEntry *he;
|
469
462
|
int i = ht->used;
|
470
463
|
HshTable *ht_clone;
|
464
|
+
|
471
465
|
if (ht->lookup == &h_lookup_str) {
|
472
466
|
ht_clone = h_new_str(ht->free_key, ht->free_value);
|
473
467
|
} else {
|
@@ -475,7 +469,7 @@ HshTable *h_clone(HshTable *ht,
|
|
475
469
|
}
|
476
470
|
|
477
471
|
for (he = ht->table; i > 0; he++) {
|
478
|
-
if (he->value != NULL) {
|
472
|
+
if (he->value != NULL) {/* active entry */
|
479
473
|
key = clone_key ? clone_key(he->key) : he->key;
|
480
474
|
value = clone_value ? clone_value(he->value) : he->value;
|
481
475
|
h_set(ht_clone, key, value);
|
data/ext/hash.h
CHANGED
@@ -27,8 +27,8 @@ void *ht_delete(HashEntry **ht, char *name);
|
|
27
27
|
****************************************************************************/
|
28
28
|
|
29
29
|
#define Hsh_MINSIZE 8
|
30
|
-
#define SLOW_DOWN 50000
|
31
|
-
|
30
|
+
#define SLOW_DOWN 50000 /* stop increasing the hash table so quickly to
|
31
|
+
* conserve memory */
|
32
32
|
extern char *dummy_key;
|
33
33
|
enum {
|
34
34
|
HASH_KEY_DOES_NOT_EXIST = 0,
|
@@ -45,24 +45,24 @@ typedef struct {
|
|
45
45
|
typedef struct HshTable {
|
46
46
|
int fill; /* # Active + # Dummy */
|
47
47
|
int used; /* # Active */
|
48
|
-
int mask;
|
48
|
+
int mask; /* size of table - 1 */
|
49
49
|
|
50
50
|
/* table points to smalltable for small tables, else to
|
51
51
|
* additional malloc'ed memory. */
|
52
52
|
HshEntry *table;
|
53
53
|
HshEntry smalltable[Hsh_MINSIZE];
|
54
|
-
HshEntry *(*lookup)(struct HshTable *ht, const void *key);
|
54
|
+
HshEntry *(*lookup)(struct HshTable *ht, register const void *key);
|
55
55
|
unsigned int (*hash)(const void *key);
|
56
56
|
int (*eq)(const void *key1, const void *key2);
|
57
|
-
|
58
|
-
|
57
|
+
free_ft free_key;
|
58
|
+
free_ft free_value;
|
59
59
|
} HshTable;
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
61
|
+
typedef unsigned int (*hash_ft)(const void *key);
|
62
|
+
typedef int (*eq_ft)(const void *key1, const void *key2);
|
63
|
+
|
64
|
+
HshTable *h_new_str(free_ft free_key, free_ft free_value);
|
65
|
+
HshTable *h_new(hash_ft hash, eq_ft eq, free_ft free_key, free_ft free_value);
|
66
66
|
void h_destroy(HshTable *ht);
|
67
67
|
void h_clear(HshTable *ht);
|
68
68
|
|
data/ext/hashset.c
CHANGED
@@ -16,7 +16,7 @@ HashSet *hs_create(unsigned int (*hash)(const void *p),
|
|
16
16
|
void (*free_elem)(void *p))
|
17
17
|
{
|
18
18
|
HashSet *hs = ALLOC(HashSet);
|
19
|
-
hs->ht = h_new(hash, eq, NULL, &
|
19
|
+
hs->ht = h_new(hash, eq, NULL, &free);
|
20
20
|
hs->elems = NULL;
|
21
21
|
hs->capa = hs->size = 0;
|
22
22
|
if (free_elem == NULL)
|
@@ -29,7 +29,7 @@ HashSet *hs_create(unsigned int (*hash)(const void *p),
|
|
29
29
|
HashSet *hs_str_create(void (*free_elem)(void *p))
|
30
30
|
{
|
31
31
|
HashSet *hs = ALLOC(HashSet);
|
32
|
-
hs->ht = h_new_str(NULL, &
|
32
|
+
hs->ht = h_new_str((free_ft)NULL, &free);
|
33
33
|
hs->elems = NULL;
|
34
34
|
hs->capa = hs->size = 0;
|
35
35
|
if (free_elem == NULL)
|
@@ -39,9 +39,8 @@ HashSet *hs_str_create(void (*free_elem)(void *p))
|
|
39
39
|
return hs;
|
40
40
|
}
|
41
41
|
|
42
|
-
void hs_destroy(
|
42
|
+
void hs_destroy(HashSet *hs)
|
43
43
|
{
|
44
|
-
HashSet *hs = (HashSet *)p;
|
45
44
|
h_destroy(hs->ht);
|
46
45
|
free(hs->elems);
|
47
46
|
free(hs);
|
@@ -54,14 +53,13 @@ void hs_clear(HashSet *self)
|
|
54
53
|
hs_del(self, self->elems[i]);
|
55
54
|
}
|
56
55
|
|
57
|
-
void hs_destroy_all(
|
56
|
+
void hs_destroy_all(HashSet *hs)
|
58
57
|
{
|
59
58
|
int i;
|
60
|
-
HashSet *hs = (HashSet *)p;
|
61
59
|
if (hs->free_elem != &dummy_free)
|
62
60
|
for (i = 0; i < hs->size; i++)
|
63
61
|
hs->free_elem(hs->elems[i]);
|
64
|
-
hs_destroy(
|
62
|
+
hs_destroy(hs);
|
65
63
|
}
|
66
64
|
|
67
65
|
int hs_add(HashSet *hs, void *elem)
|
data/ext/hashset.h
CHANGED
@@ -17,8 +17,8 @@ HashSet *hs_create(unsigned int (*hash)(const void *p),
|
|
17
17
|
int (*eq)(const void *p1, const void *p2),
|
18
18
|
void (*free_elem)(void *p));
|
19
19
|
HashSet *hs_str_create(void (*free_elem)(void *p));
|
20
|
-
void hs_destroy(
|
21
|
-
void hs_destroy_all(
|
20
|
+
void hs_destroy(HashSet *hs);
|
21
|
+
void hs_destroy_all(HashSet *hs);
|
22
22
|
int hs_add(HashSet *hs, void *elem);
|
23
23
|
int hs_del(HashSet *hs, void *elem);
|
24
24
|
void *hs_rem(HashSet *hs, void *elem);
|
@@ -27,11 +27,12 @@ HashSet *hs_merge(HashSet *hs, HashSet *other);
|
|
27
27
|
void *hs_orig(HashSet *hs, void *elem);
|
28
28
|
void hs_clear(HashSet *self);
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
/* TODO: finish these functions.
|
31
|
+
int hs_osf(HashSet *hs, void *elem);
|
32
|
+
HashSet hs_or(HashSet *hs1, HashSet *h2);
|
33
|
+
HashSet hs_excl_or(HashSet *hs1, HashSet *h2);
|
34
|
+
HashSet hs_and(HashSet *hs1, HashSet *h2);
|
35
|
+
HashSet hs_mask(HashSet *hs1, HashSet *h2);
|
36
|
+
*/
|
36
37
|
|
37
38
|
#endif
|
data/ext/helper.c
CHANGED
data/ext/helper.h
CHANGED
data/ext/inc/except.h
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
#define BODY 0
|
8
8
|
#define FINALLY -1
|
9
9
|
#define EXCEPTION 1
|
10
|
-
#define ERROR 1
|
11
10
|
#define IO_ERROR 2
|
12
11
|
#define ARG_ERROR 3
|
13
12
|
#define EOF_ERROR 4
|
@@ -29,35 +28,38 @@ RUBY_EXTERN int rb_thread_critical;
|
|
29
28
|
extern xcontext_t *xtop_context;
|
30
29
|
|
31
30
|
#define TRY\
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
do {\
|
32
|
+
xcontext_t xcontext;\
|
33
|
+
rb_thread_critical = Qtrue;\
|
34
|
+
xcontext.next = xtop_context;\
|
35
|
+
xtop_context = &xcontext;\
|
36
|
+
xcontext.handled = true;\
|
37
|
+
xcontext.in_finally = false;\
|
38
|
+
switch (setjmp(xcontext.jbuf)) {\
|
39
|
+
case BODY:
|
40
40
|
|
41
41
|
|
42
42
|
#define XENDTRY\
|
43
|
-
|
44
|
-
xtop_context = xcontext.next;\
|
45
|
-
if (!xcontext.handled) {\
|
46
|
-
RAISE(xcontext.excode, xcontext.msg);\
|
47
|
-
}\
|
48
|
-
rb_thread_critical = 0;
|
49
|
-
|
50
|
-
#define ENDTRY\
|
51
|
-
}\
|
52
|
-
if (!xcontext.in_finally) {\
|
43
|
+
}\
|
53
44
|
xtop_context = xcontext.next;\
|
54
45
|
if (!xcontext.handled) {\
|
55
46
|
RAISE(xcontext.excode, xcontext.msg);\
|
56
47
|
}\
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
48
|
+
rb_thread_critical = 0;\
|
49
|
+
} while (0);
|
50
|
+
|
51
|
+
#define ENDTRY\
|
52
|
+
}\
|
53
|
+
if (!xcontext.in_finally) {\
|
54
|
+
xtop_context = xcontext.next;\
|
55
|
+
if (!xcontext.handled) {\
|
56
|
+
RAISE(xcontext.excode, xcontext.msg);\
|
57
|
+
}\
|
58
|
+
xcontext.in_finally = 1;\
|
59
|
+
longjmp(xcontext.jbuf, FINALLY);\
|
60
|
+
}\
|
61
|
+
rb_thread_critical = 0;\
|
62
|
+
} while (0);
|
61
63
|
|
62
64
|
#define XFINALLY default: xcontext.in_finally = 1;
|
63
65
|
|
data/ext/inc/lang.h
CHANGED
@@ -7,7 +7,17 @@
|
|
7
7
|
#define FERRET_EXT
|
8
8
|
|
9
9
|
#define MAX_ERROR_LEN 2048
|
10
|
-
|
10
|
+
|
11
|
+
typedef LONG_LONG llong;
|
12
|
+
typedef unsigned LONG_LONG ullong;
|
13
|
+
|
14
|
+
#ifdef WIN32
|
15
|
+
# undef close
|
16
|
+
# undef rename
|
17
|
+
extern void eprintf(VALUE etype, const char *fmt, ...);
|
18
|
+
#else
|
19
|
+
# define eprintf(...) ft_raise(__FILE__, __LINE__, __VA_ARGS__)
|
20
|
+
#endif
|
11
21
|
extern void ft_raise(char *file, int line_num, VALUE etype, const char *fmt, ...);
|
12
22
|
extern void weprintf(const char *fmt, ...);
|
13
23
|
extern char *progname(void);
|