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);
         
     |