ferret 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|