ferret 0.10.6 → 0.10.7
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/ext/analysis.c +136 -107
- data/ext/analysis.h +4 -0
- data/ext/bitvector.c +2 -2
- data/ext/bitvector.h +1 -1
- data/ext/compound_io.c +4 -4
- data/ext/defines.h +0 -2
- data/ext/filter.c +3 -3
- data/ext/fs_store.c +4 -4
- data/ext/hash.c +29 -18
- data/ext/hash.h +34 -16
- data/ext/hashset.c +6 -3
- data/ext/hashset.h +1 -1
- data/ext/index.c +22 -20
- data/ext/q_boolean.c +3 -3
- data/ext/q_const_score.c +1 -1
- data/ext/q_fuzzy.c +1 -1
- data/ext/q_match_all.c +1 -1
- data/ext/q_multi_term.c +2 -2
- data/ext/q_parser.c +21 -6
- data/ext/q_phrase.c +2 -2
- data/ext/q_prefix.c +1 -1
- data/ext/q_range.c +3 -3
- data/ext/q_span.c +8 -8
- data/ext/q_term.c +1 -1
- data/ext/q_wildcard.c +1 -1
- data/ext/r_analysis.c +10 -4
- data/ext/r_index.c +89 -12
- data/ext/r_qparser.c +67 -4
- data/ext/r_search.c +11 -1
- data/ext/r_store.c +51 -35
- data/ext/ram_store.c +18 -18
- data/ext/search.c +1 -1
- data/ext/search.h +25 -23
- data/ext/similarity.c +1 -1
- data/ext/sort.c +1 -1
- data/ext/store.c +22 -3
- data/ext/store.h +8 -2
- data/lib/ferret/index.rb +14 -4
- data/lib/ferret_version.rb +1 -1
- data/test/test_helper.rb +3 -0
- data/test/unit/analysis/tc_analyzer.rb +5 -5
- data/test/unit/analysis/tc_token_stream.rb +3 -3
- data/test/unit/index/tc_index_writer.rb +1 -1
- data/test/unit/query_parser/tc_query_parser.rb +7 -5
- data/test/unit/search/tc_filter.rb +1 -1
- data/test/unit/search/tc_fuzzy_query.rb +1 -1
- data/test/unit/search/tc_index_searcher.rb +1 -1
- data/test/unit/search/tc_multi_searcher.rb +1 -1
- data/test/unit/search/tc_search_and_sort.rb +1 -1
- data/test/unit/search/tc_spans.rb +1 -1
- metadata +4 -3
    
        data/ext/analysis.c
    CHANGED
    
    | @@ -230,6 +230,43 @@ Analyzer *analyzer_new(TokenStream *ts, | |
| 230 230 | 
             
                return a;
         | 
| 231 231 | 
             
            }
         | 
| 232 232 |  | 
| 233 | 
            +
            /****************************************************************************
         | 
| 234 | 
            +
             *
         | 
| 235 | 
            +
             * Non
         | 
| 236 | 
            +
             *
         | 
| 237 | 
            +
             ****************************************************************************/
         | 
| 238 | 
            +
             | 
| 239 | 
            +
            /*
         | 
| 240 | 
            +
             * NonTokenizer
         | 
| 241 | 
            +
             */
         | 
| 242 | 
            +
            static Token *nt_next(TokenStream *ts)
         | 
| 243 | 
            +
            {
         | 
| 244 | 
            +
                if (ts->t) {
         | 
| 245 | 
            +
                    size_t len = strlen(ts->t);
         | 
| 246 | 
            +
                    ts->t = NULL;
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                    return tk_set(&(CTS(ts)->token), ts->text, len, 0, len, 1);
         | 
| 249 | 
            +
                }
         | 
| 250 | 
            +
                else {
         | 
| 251 | 
            +
                    return NULL;
         | 
| 252 | 
            +
                }
         | 
| 253 | 
            +
            }
         | 
| 254 | 
            +
             | 
| 255 | 
            +
            TokenStream *non_tokenizer_new()
         | 
| 256 | 
            +
            {
         | 
| 257 | 
            +
                TokenStream *ts = cts_new();
         | 
| 258 | 
            +
                ts->next = &nt_next;
         | 
| 259 | 
            +
                return ts;
         | 
| 260 | 
            +
            }
         | 
| 261 | 
            +
             | 
| 262 | 
            +
            /*
         | 
| 263 | 
            +
             * NonAnalyzer
         | 
| 264 | 
            +
             */
         | 
| 265 | 
            +
            Analyzer *non_analyzer_new()
         | 
| 266 | 
            +
            {
         | 
| 267 | 
            +
                return analyzer_new(non_tokenizer_new(), NULL, NULL);
         | 
| 268 | 
            +
            }
         | 
| 269 | 
            +
             | 
| 233 270 | 
             
            /****************************************************************************
         | 
| 234 271 | 
             
             *
         | 
| 235 272 | 
             
             * Whitespace
         | 
| @@ -520,7 +557,7 @@ static int std_get_alpha(TokenStream *ts, char *token) | |
| 520 557 | 
             
            {
         | 
| 521 558 | 
             
                int i = 0;
         | 
| 522 559 | 
             
                char *t = ts->t;
         | 
| 523 | 
            -
                while (t[i] != '\0' &&  | 
| 560 | 
            +
                while (t[i] != '\0' && isalnum(t[i])) {
         | 
| 524 561 | 
             
                    if (i < MAX_WORD_SIZE) {
         | 
| 525 562 | 
             
                        token[i] = t[i];
         | 
| 526 563 | 
             
                    }
         | 
| @@ -538,7 +575,7 @@ static int mb_std_get_alpha(TokenStream *ts, char *token) | |
| 538 575 |  | 
| 539 576 | 
             
                i = mb_next_char(&wchr, t, &state);
         | 
| 540 577 |  | 
| 541 | 
            -
                while (wchr != 0 &&  | 
| 578 | 
            +
                while (wchr != 0 && iswalnum(wchr)) {
         | 
| 542 579 | 
             
                    t += i;
         | 
| 543 580 | 
             
                    i = mb_next_char(&wchr, t, &state);
         | 
| 544 581 | 
             
                }
         | 
| @@ -820,133 +857,125 @@ static Token *std_next(TokenStream *ts) | |
| 820 857 | 
             
                }
         | 
| 821 858 |  | 
| 822 859 | 
             
                start = t = ts->t;
         | 
| 823 | 
            -
                 | 
| 824 | 
            -
             | 
| 825 | 
            -
             | 
| 860 | 
            +
                token_i = std_tz->get_alpha(ts, token);
         | 
| 861 | 
            +
                t += token_i;
         | 
| 862 | 
            +
             | 
| 863 | 
            +
                if (!std_tz->is_tok_char(t)) {
         | 
| 864 | 
            +
                    /* very common case, ie a plain word, so check and return */
         | 
| 826 865 | 
             
                    ts->t = t;
         | 
| 827 | 
            -
                    tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 866 | 
            +
                    return tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 828 867 | 
             
                }
         | 
| 829 | 
            -
                else {
         | 
| 830 | 
            -
                    token_i = std_tz->get_alpha(ts, token);
         | 
| 831 | 
            -
                    t += token_i;
         | 
| 832 868 |  | 
| 833 | 
            -
             | 
| 834 | 
            -
             | 
| 835 | 
            -
             | 
| 836 | 
            -
             | 
| 869 | 
            +
                if (*t == '\'') {       /* apostrophe case. */
         | 
| 870 | 
            +
                    t += std_tz->get_apostrophe(t);
         | 
| 871 | 
            +
                    ts->t = t;
         | 
| 872 | 
            +
                    len = (int)(t - start);
         | 
| 873 | 
            +
                    /* strip possesive */
         | 
| 874 | 
            +
                    if ((t[-1] == 's' || t[-1] == 'S') && t[-2] == '\'') {
         | 
| 875 | 
            +
                        t -= 2;
         | 
| 876 | 
            +
                        tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 877 | 
            +
                        CTS(ts)->token.end += 2;
         | 
| 878 | 
            +
                    }
         | 
| 879 | 
            +
                    else {
         | 
| 880 | 
            +
                        tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 837 881 | 
             
                    }
         | 
| 838 882 |  | 
| 839 | 
            -
                     | 
| 840 | 
            -
             | 
| 841 | 
            -
                        ts->t = t;
         | 
| 842 | 
            -
                        len = (int)(t - start);
         | 
| 843 | 
            -
                        /* strip possesive */
         | 
| 844 | 
            -
                        if ((t[-1] == 's' || t[-1] == 'S') && t[-2] == '\'') {
         | 
| 845 | 
            -
                            t -= 2;
         | 
| 846 | 
            -
                            tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 847 | 
            -
                            CTS(ts)->token.end += 2;
         | 
| 848 | 
            -
                        }
         | 
| 849 | 
            -
                        else {
         | 
| 850 | 
            -
                            tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 851 | 
            -
                        }
         | 
| 883 | 
            +
                    return &(CTS(ts)->token);
         | 
| 884 | 
            +
                }
         | 
| 852 885 |  | 
| 853 | 
            -
             | 
| 854 | 
            -
                     | 
| 886 | 
            +
                if (*t == '&') {        /* apostrophe case. */
         | 
| 887 | 
            +
                    t += std_get_company_name(t);
         | 
| 888 | 
            +
                    ts->t = t;
         | 
| 889 | 
            +
                    return tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 890 | 
            +
                }
         | 
| 855 891 |  | 
| 856 | 
            -
             | 
| 857 | 
            -
             | 
| 858 | 
            -
             | 
| 859 | 
            -
             | 
| 892 | 
            +
                if ((isdigit(*t) || isnumpunc(*t))       /* possibly a number */
         | 
| 893 | 
            +
                    && (len = std_get_number(t) > 0)) {
         | 
| 894 | 
            +
                    num_end = start + len;
         | 
| 895 | 
            +
                    if (!std_tz->is_tok_char(num_end)) { /* won't find a longer token */
         | 
| 896 | 
            +
                        ts->t = num_end;
         | 
| 897 | 
            +
                        return tk_set_ts(&(CTS(ts)->token), start, num_end, ts->text, 1);
         | 
| 860 898 | 
             
                    }
         | 
| 899 | 
            +
                    /* else there may be a longer token so check */
         | 
| 900 | 
            +
                }
         | 
| 861 901 |  | 
| 862 | 
            -
             | 
| 863 | 
            -
             | 
| 864 | 
            -
             | 
| 865 | 
            -
             | 
| 866 | 
            -
             | 
| 867 | 
            -
             | 
| 868 | 
            -
                        }
         | 
| 869 | 
            -
                        /* else there may be a longer token so check */
         | 
| 902 | 
            +
                if (t[0] == ':' && t[1] == '/' && t[2] == '/') {
         | 
| 903 | 
            +
                    /* check for a known url start */
         | 
| 904 | 
            +
                    token[token_i] = '\0';
         | 
| 905 | 
            +
                    t += 3;
         | 
| 906 | 
            +
                    while (*t == '/') {
         | 
| 907 | 
            +
                        t++;
         | 
| 870 908 | 
             
                    }
         | 
| 871 | 
            -
             | 
| 872 | 
            -
             | 
| 873 | 
            -
             | 
| 874 | 
            -
             | 
| 875 | 
            -
             | 
| 876 | 
            -
                         | 
| 877 | 
            -
                            t++;
         | 
| 878 | 
            -
                        }
         | 
| 879 | 
            -
                        if (isalpha(*t) &&
         | 
| 880 | 
            -
                            (memcmp(token, "ftp", 3) == 0 ||
         | 
| 881 | 
            -
                             memcmp(token, "http", 4) == 0 ||
         | 
| 882 | 
            -
                             memcmp(token, "https", 5) == 0 ||
         | 
| 883 | 
            -
                             memcmp(token, "file", 4) == 0)) {
         | 
| 884 | 
            -
                            len = std_get_url(t, token, 0); /* dispose of first part of the URL */
         | 
| 885 | 
            -
                        }
         | 
| 886 | 
            -
                        else {              /* still treat as url but keep the first part */
         | 
| 887 | 
            -
                            token_i = (int)(t - start);
         | 
| 888 | 
            -
                            memcpy(token, start, token_i * sizeof(char));
         | 
| 889 | 
            -
                            len = token_i + std_get_url(t, token, token_i); /* keep start */
         | 
| 890 | 
            -
                        }
         | 
| 891 | 
            -
                        ts->t = t + len;
         | 
| 892 | 
            -
                        token[len] = 0;
         | 
| 893 | 
            -
                        return tk_set(&(CTS(ts)->token), token, len, (int)(start - ts->text),
         | 
| 894 | 
            -
                               (int)(ts->t - ts->text), 1);
         | 
| 909 | 
            +
                    if (isalpha(*t) &&
         | 
| 910 | 
            +
                        (memcmp(token, "ftp", 3) == 0 ||
         | 
| 911 | 
            +
                         memcmp(token, "http", 4) == 0 ||
         | 
| 912 | 
            +
                         memcmp(token, "https", 5) == 0 ||
         | 
| 913 | 
            +
                         memcmp(token, "file", 4) == 0)) {
         | 
| 914 | 
            +
                        len = std_get_url(t, token, 0); /* dispose of first part of the URL */
         | 
| 895 915 | 
             
                    }
         | 
| 896 | 
            -
             | 
| 897 | 
            -
             | 
| 898 | 
            -
             | 
| 899 | 
            -
             | 
| 900 | 
            -
                     | 
| 901 | 
            -
             | 
| 902 | 
            -
             | 
| 903 | 
            -
             | 
| 904 | 
            -
             | 
| 905 | 
            -
             | 
| 916 | 
            +
                    else {              /* still treat as url but keep the first part */
         | 
| 917 | 
            +
                        token_i = (int)(t - start);
         | 
| 918 | 
            +
                        memcpy(token, start, token_i * sizeof(char));
         | 
| 919 | 
            +
                        len = token_i + std_get_url(t, token, token_i); /* keep start */
         | 
| 920 | 
            +
                    }
         | 
| 921 | 
            +
                    ts->t = t + len;
         | 
| 922 | 
            +
                    token[len] = 0;
         | 
| 923 | 
            +
                    return tk_set(&(CTS(ts)->token), token, len, (int)(start - ts->text),
         | 
| 924 | 
            +
                           (int)(ts->t - ts->text), 1);
         | 
| 925 | 
            +
                }
         | 
| 926 | 
            +
             | 
| 927 | 
            +
                /* now see how long a url we can find. */
         | 
| 928 | 
            +
                is_acronym = true;
         | 
| 929 | 
            +
                seen_at_symbol = false;
         | 
| 930 | 
            +
                while (isurlxatc(*t)) {
         | 
| 931 | 
            +
                    if (is_acronym && !isalpha(*t) && (*t != '.')) {
         | 
| 932 | 
            +
                        is_acronym = false;
         | 
| 933 | 
            +
                    }
         | 
| 934 | 
            +
                    if (isurlxatpunc(*t) && isurlxatpunc(t[-1])) {
         | 
| 935 | 
            +
                        break; /* can't have two punctuation characters in a row */
         | 
| 936 | 
            +
                    }
         | 
| 937 | 
            +
                    if (*t == '@') {
         | 
| 938 | 
            +
                        if (seen_at_symbol) {
         | 
| 939 | 
            +
                            break; /* we can only have one @ symbol */
         | 
| 906 940 | 
             
                        }
         | 
| 907 | 
            -
                         | 
| 908 | 
            -
                             | 
| 909 | 
            -
                                break; /* we can only have one @ symbol */
         | 
| 910 | 
            -
                            }
         | 
| 911 | 
            -
                            else {
         | 
| 912 | 
            -
                                seen_at_symbol = true;
         | 
| 913 | 
            -
                            }
         | 
| 941 | 
            +
                        else {
         | 
| 942 | 
            +
                            seen_at_symbol = true;
         | 
| 914 943 | 
             
                        }
         | 
| 915 | 
            -
                        t++;
         | 
| 916 | 
            -
                    }
         | 
| 917 | 
            -
                    while (isurlxatpunc(t[-1])) {
         | 
| 918 | 
            -
                        t--;                /* strip trailing punctuation */
         | 
| 919 944 | 
             
                    }
         | 
| 945 | 
            +
                    t++;
         | 
| 946 | 
            +
                }
         | 
| 947 | 
            +
                while (isurlxatpunc(t[-1])) {
         | 
| 948 | 
            +
                    t--;                /* strip trailing punctuation */
         | 
| 949 | 
            +
                }
         | 
| 920 950 |  | 
| 921 | 
            -
             | 
| 922 | 
            -
             | 
| 951 | 
            +
                if (num_end == NULL || t > num_end) {
         | 
| 952 | 
            +
                    ts->t = t;
         | 
| 923 953 |  | 
| 924 | 
            -
             | 
| 925 | 
            -
             | 
| 926 | 
            -
             | 
| 927 | 
            -
             | 
| 928 | 
            -
                            }
         | 
| 954 | 
            +
                    if (is_acronym) {   /* check it is one letter followed by one '.' */
         | 
| 955 | 
            +
                        for (s = start; s < t - 1; s++) {
         | 
| 956 | 
            +
                            if (isalpha(*s) && (s[1] != '.'))
         | 
| 957 | 
            +
                                is_acronym = false;
         | 
| 929 958 | 
             
                        }
         | 
| 930 | 
            -
             | 
| 931 | 
            -
             | 
| 932 | 
            -
             | 
| 933 | 
            -
             | 
| 934 | 
            -
             | 
| 935 | 
            -
                                 | 
| 959 | 
            +
                    }
         | 
| 960 | 
            +
                    if (is_acronym) {   /* strip '.'s */
         | 
| 961 | 
            +
                        for (s = start + token_i; s < t; s++) {
         | 
| 962 | 
            +
                            if (*s != '.') {
         | 
| 963 | 
            +
                                token[token_i] = *s;
         | 
| 964 | 
            +
                                token_i++;
         | 
| 936 965 | 
             
                            }
         | 
| 937 | 
            -
                            tk_set(&(CTS(ts)->token), token, token_i,
         | 
| 938 | 
            -
                                   (int)(start - ts->text),
         | 
| 939 | 
            -
                                   (int)(t - ts->text), 1);
         | 
| 940 | 
            -
                        }
         | 
| 941 | 
            -
                        else { /* just return the url as is */
         | 
| 942 | 
            -
                            tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 943 966 | 
             
                        }
         | 
| 967 | 
            +
                        tk_set(&(CTS(ts)->token), token, token_i,
         | 
| 968 | 
            +
                               (int)(start - ts->text),
         | 
| 969 | 
            +
                               (int)(t - ts->text), 1);
         | 
| 944 970 | 
             
                    }
         | 
| 945 | 
            -
                    else { | 
| 946 | 
            -
                        ts->t  | 
| 947 | 
            -
                        tk_set_ts(&(CTS(ts)->token), start, num_end, ts->text, 1);
         | 
| 971 | 
            +
                    else { /* just return the url as is */
         | 
| 972 | 
            +
                        tk_set_ts(&(CTS(ts)->token), start, t, ts->text, 1);
         | 
| 948 973 | 
             
                    }
         | 
| 949 974 | 
             
                }
         | 
| 975 | 
            +
                else {                  /* return the number */
         | 
| 976 | 
            +
                    ts->t = num_end;
         | 
| 977 | 
            +
                    tk_set_ts(&(CTS(ts)->token), start, num_end, ts->text, 1);
         | 
| 978 | 
            +
                }
         | 
| 950 979 |  | 
| 951 980 | 
             
                return &(CTS(ts)->token);
         | 
| 952 981 | 
             
            }
         | 
    
        data/ext/analysis.h
    CHANGED
    
    | @@ -112,6 +112,8 @@ typedef struct StemFilter | |
| 112 112 |  | 
| 113 113 | 
             
            extern void ts_deref(TokenStream *ts);
         | 
| 114 114 |  | 
| 115 | 
            +
            extern TokenStream *non_tokenizer_new();
         | 
| 116 | 
            +
             | 
| 115 117 | 
             
            extern TokenStream *whitespace_tokenizer_new();
         | 
| 116 118 | 
             
            extern TokenStream *mb_whitespace_tokenizer_new(bool lowercase);
         | 
| 117 119 |  | 
| @@ -172,6 +174,8 @@ extern Analyzer *analyzer_new(TokenStream *ts, | |
| 172 174 | 
             
                                                                 char *field,
         | 
| 173 175 | 
             
                                                                 char *text));
         | 
| 174 176 | 
             
            extern void a_standard_destroy(Analyzer *a);
         | 
| 177 | 
            +
            extern Analyzer *non_analyzer_new();
         | 
| 178 | 
            +
             | 
| 175 179 | 
             
            extern Analyzer *whitespace_analyzer_new(bool lowercase);
         | 
| 176 180 | 
             
            extern Analyzer *mb_whitespace_analyzer_new(bool lowercase);
         | 
| 177 181 |  | 
    
        data/ext/bitvector.c
    CHANGED
    
    | @@ -345,9 +345,9 @@ int bv_eq(BitVector *bv1, BitVector *bv2) | |
| 345 345 | 
             
                return true;
         | 
| 346 346 | 
             
            }
         | 
| 347 347 |  | 
| 348 | 
            -
             | 
| 348 | 
            +
            unsigned long bv_hash(BitVector *bv)
         | 
| 349 349 | 
             
            {
         | 
| 350 | 
            -
                 | 
| 350 | 
            +
                unsigned long hash = 0;
         | 
| 351 351 | 
             
                const f_u32 empty_word = bv->extends_as_ones ? 0xFFFFFFFF : 0;
         | 
| 352 352 | 
             
                int i;
         | 
| 353 353 | 
             
                for (i = (bv->size >> 5); i >= 0; i--) {
         | 
    
        data/ext/bitvector.h
    CHANGED
    
    | @@ -193,7 +193,7 @@ extern int bv_eq(BitVector *bv1, BitVector *bv2); | |
| 193 193 | 
             
             * @param bv the BitVector to hash
         | 
| 194 194 | 
             
             * @return A hash value for the BitVector
         | 
| 195 195 | 
             
             */
         | 
| 196 | 
            -
            extern  | 
| 196 | 
            +
            extern unsigned long bv_hash(BitVector *bv);
         | 
| 197 197 |  | 
| 198 198 | 
             
            /**
         | 
| 199 199 | 
             
             * ANDs two BitVectors (+bv1+ and +bv2+) together and return the resultant
         | 
    
        data/ext/compound_io.c
    CHANGED
    
    | @@ -181,7 +181,7 @@ static OutStream *cmpd_new_output(Store *store, const char *file_name) | |
| 181 181 | 
             
                return NULL;
         | 
| 182 182 | 
             
            }
         | 
| 183 183 |  | 
| 184 | 
            -
            static Lock * | 
| 184 | 
            +
            static Lock *cmpd_open_lock_i(Store *store, char *lock_name)
         | 
| 185 185 | 
             
            {
         | 
| 186 186 | 
             
                (void)store;
         | 
| 187 187 | 
             
                (void)lock_name;
         | 
| @@ -189,7 +189,7 @@ static Lock *cmpd_open_lock(Store *store, char *lock_name) | |
| 189 189 | 
             
                return NULL;
         | 
| 190 190 | 
             
            }
         | 
| 191 191 |  | 
| 192 | 
            -
            static void  | 
| 192 | 
            +
            static void cmpd_close_lock_i(Lock *lock)
         | 
| 193 193 | 
             
            {
         | 
| 194 194 | 
             
                (void)lock;
         | 
| 195 195 | 
             
                RAISE(UNSUPPORTED_ERROR, UNSUPPORTED_ERROR_MSG);
         | 
| @@ -246,8 +246,8 @@ Store *open_cmpd_store(Store *store, const char *name) | |
| 246 246 | 
             
                new_store->close_i      = &cmpd_close_i;
         | 
| 247 247 | 
             
                new_store->new_output   = &cmpd_new_output;
         | 
| 248 248 | 
             
                new_store->open_input   = &cmpd_open_input;
         | 
| 249 | 
            -
                new_store-> | 
| 250 | 
            -
                new_store-> | 
| 249 | 
            +
                new_store->open_lock_i  = &cmpd_open_lock_i;
         | 
| 250 | 
            +
                new_store->close_lock_i = &cmpd_close_lock_i;
         | 
| 251 251 |  | 
| 252 252 | 
             
                return new_store;
         | 
| 253 253 | 
             
            }
         | 
    
        data/ext/defines.h
    CHANGED
    
    
    
        data/ext/filter.c
    CHANGED
    
    | @@ -41,7 +41,7 @@ static char *filt_to_s_i(Filter *filt) | |
| 41 41 | 
             
                return estrdup(filt->name);
         | 
| 42 42 | 
             
            }
         | 
| 43 43 |  | 
| 44 | 
            -
             | 
| 44 | 
            +
            unsigned long filt_hash_default(Filter *filt)
         | 
| 45 45 | 
             
            {
         | 
| 46 46 | 
             
                (void)filt;
         | 
| 47 47 | 
             
                return 0;
         | 
| @@ -66,7 +66,7 @@ Filter *filt_create(size_t size, const char *name) | |
| 66 66 | 
             
                return filt;
         | 
| 67 67 | 
             
            }
         | 
| 68 68 |  | 
| 69 | 
            -
             | 
| 69 | 
            +
            unsigned long filt_hash(Filter *filt)
         | 
| 70 70 | 
             
            {
         | 
| 71 71 | 
             
                return str_hash(filt->name) ^ filt->hash(filt);
         | 
| 72 72 | 
             
            }
         | 
| @@ -118,7 +118,7 @@ static BitVector *qfilt_get_bv_i(Filter *filt, IndexReader *ir) | |
| 118 118 | 
             
                return bv;
         | 
| 119 119 | 
             
            }
         | 
| 120 120 |  | 
| 121 | 
            -
            static  | 
| 121 | 
            +
            static unsigned long qfilt_hash(Filter *filt)
         | 
| 122 122 | 
             
            {
         | 
| 123 123 | 
             
                return q_hash(QF(filt)->query);
         | 
| 124 124 | 
             
            }
         | 
    
        data/ext/fs_store.c
    CHANGED
    
    | @@ -384,7 +384,7 @@ void fs_lock_release(Lock *lock) | |
| 384 384 | 
             
                remove(lock->name);
         | 
| 385 385 | 
             
            }
         | 
| 386 386 |  | 
| 387 | 
            -
            static Lock * | 
| 387 | 
            +
            static Lock *fs_open_lock_i(Store *store, char *lockname)
         | 
| 388 388 | 
             
            {
         | 
| 389 389 | 
             
                Lock *lock = ALLOC(Lock);
         | 
| 390 390 | 
             
                char lname[100];
         | 
| @@ -398,7 +398,7 @@ static Lock *fs_open_lock(Store *store, char *lockname) | |
| 398 398 | 
             
                return lock;
         | 
| 399 399 | 
             
            }
         | 
| 400 400 |  | 
| 401 | 
            -
            static void  | 
| 401 | 
            +
            static void fs_close_lock_i(Lock *lock)
         | 
| 402 402 | 
             
            {
         | 
| 403 403 | 
             
                remove(lock->name);
         | 
| 404 404 | 
             
                free(lock->name);
         | 
| @@ -447,8 +447,8 @@ static Store *fs_store_new(const char *pathname) | |
| 447 447 | 
             
                new_store->each          = &fs_each;
         | 
| 448 448 | 
             
                new_store->new_output    = &fs_new_output;
         | 
| 449 449 | 
             
                new_store->open_input    = &fs_open_input;
         | 
| 450 | 
            -
                new_store-> | 
| 451 | 
            -
                new_store-> | 
| 450 | 
            +
                new_store->open_lock_i   = &fs_open_lock_i;
         | 
| 451 | 
            +
                new_store->close_lock_i  = &fs_close_lock_i;
         | 
| 452 452 | 
             
                return new_store;
         | 
| 453 453 | 
             
            }
         | 
| 454 454 |  | 
    
        data/ext/hash.c
    CHANGED
    
    | @@ -18,16 +18,16 @@ static char *dummy_key = ""; | |
| 18 18 | 
             
            static HashTable *free_hts[MAX_FREE_HASH_TABLES];
         | 
| 19 19 | 
             
            static int num_free_hts = 0;
         | 
| 20 20 |  | 
| 21 | 
            -
             | 
| 21 | 
            +
            unsigned long *imalloc(unsigned long value)
         | 
| 22 22 | 
             
            {
         | 
| 23 | 
            -
               | 
| 23 | 
            +
              unsigned long *p = ALLOC(unsigned long);
         | 
| 24 24 | 
             
              *p = value;
         | 
| 25 25 | 
             
              return p;
         | 
| 26 26 | 
             
            }
         | 
| 27 27 |  | 
| 28 | 
            -
             | 
| 28 | 
            +
            unsigned long str_hash(const char *const str)
         | 
| 29 29 | 
             
            {
         | 
| 30 | 
            -
                register  | 
| 30 | 
            +
                register unsigned long h = 0;
         | 
| 31 31 | 
             
                register unsigned char *p = (unsigned char *) str;
         | 
| 32 32 |  | 
| 33 33 | 
             
                for (; *p; p++) {
         | 
| @@ -37,6 +37,16 @@ ulong str_hash(const char *const str) | |
| 37 37 | 
             
                return h;
         | 
| 38 38 | 
             
            }
         | 
| 39 39 |  | 
| 40 | 
            +
            unsigned long ptr_hash(const void *const ptr)
         | 
| 41 | 
            +
            {
         | 
| 42 | 
            +
                return (unsigned long)ptr;
         | 
| 43 | 
            +
            }
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            int ptr_eq(const void *q1, const void *q2)
         | 
| 46 | 
            +
            {
         | 
| 47 | 
            +
                return q1 == q2;
         | 
| 48 | 
            +
            }
         | 
| 49 | 
            +
             | 
| 40 50 | 
             
            static int int_eq(const void *q1, const void *q2)
         | 
| 41 51 | 
             
            {
         | 
| 42 52 | 
             
                (void)q1;
         | 
| @@ -44,9 +54,9 @@ static int int_eq(const void *q1, const void *q2) | |
| 44 54 | 
             
                return true;
         | 
| 45 55 | 
             
            }
         | 
| 46 56 |  | 
| 47 | 
            -
            static  | 
| 57 | 
            +
            static unsigned long int_hash(const void *i)
         | 
| 48 58 | 
             
            {
         | 
| 49 | 
            -
                return *(( | 
| 59 | 
            +
                return *((unsigned long *)i);
         | 
| 50 60 | 
             
            }
         | 
| 51 61 |  | 
| 52 62 | 
             
            typedef HashEntry *(*lookup_ft)(struct HashTable *ht, register const void *key);
         | 
| @@ -58,9 +68,10 @@ typedef HashEntry *(*lookup_ft)(struct HashTable *ht, register const void *key); | |
| 58 68 | 
             
             * @param ht the HashTable to do the fast lookup in
         | 
| 59 69 | 
             
             * @param the hashkey we are looking for
         | 
| 60 70 | 
             
             */
         | 
| 61 | 
            -
            static __inline HashEntry *h_resize_lookup(HashTable *ht, | 
| 71 | 
            +
            static __inline HashEntry *h_resize_lookup(HashTable *ht,
         | 
| 72 | 
            +
                                                       register const unsigned long hash)
         | 
| 62 73 | 
             
            {
         | 
| 63 | 
            -
                register  | 
| 74 | 
            +
                register unsigned long perturb;
         | 
| 64 75 | 
             
                register int mask = ht->mask;
         | 
| 65 76 | 
             
                register HashEntry *he0 = ht->table;
         | 
| 66 77 | 
             
                register int i = hash & mask;
         | 
| @@ -83,8 +94,8 @@ static __inline HashEntry *h_resize_lookup(HashTable *ht, register const ulong h | |
| 83 94 |  | 
| 84 95 | 
             
            HashEntry *h_lookup_int(HashTable *ht, const void *key)
         | 
| 85 96 | 
             
            {
         | 
| 86 | 
            -
                register  | 
| 87 | 
            -
                register  | 
| 97 | 
            +
                register unsigned long hash = *((int *)key);
         | 
| 98 | 
            +
                register unsigned long perturb;
         | 
| 88 99 | 
             
                register int mask = ht->mask;
         | 
| 89 100 | 
             
                register HashEntry *he0 = ht->table;
         | 
| 90 101 | 
             
                register int i = hash & mask;
         | 
| @@ -120,8 +131,8 @@ HashEntry *h_lookup_int(HashTable *ht, const void *key) | |
| 120 131 |  | 
| 121 132 | 
             
            HashEntry *h_lookup_str(HashTable *ht, register const char *key)
         | 
| 122 133 | 
             
            {
         | 
| 123 | 
            -
                register  | 
| 124 | 
            -
                register  | 
| 134 | 
            +
                register unsigned long hash = str_hash(key);
         | 
| 135 | 
            +
                register unsigned long perturb;
         | 
| 125 136 | 
             
                register int mask = ht->mask;
         | 
| 126 137 | 
             
                register HashEntry *he0 = ht->table;
         | 
| 127 138 | 
             
                register int i = hash & mask;
         | 
| @@ -477,32 +488,32 @@ int h_has_key(HashTable *ht, const void *key) | |
| 477 488 | 
             
                }
         | 
| 478 489 | 
             
            }
         | 
| 479 490 |  | 
| 480 | 
            -
            void *h_get_int(HashTable *self, const  | 
| 491 | 
            +
            void *h_get_int(HashTable *self, const unsigned long key)
         | 
| 481 492 | 
             
            {
         | 
| 482 493 | 
             
              return h_get(self, &key);
         | 
| 483 494 | 
             
            }
         | 
| 484 495 |  | 
| 485 | 
            -
            int h_del_int(HashTable *self, const  | 
| 496 | 
            +
            int h_del_int(HashTable *self, const unsigned long key)
         | 
| 486 497 | 
             
            {
         | 
| 487 498 | 
             
              return h_del(self, &key);
         | 
| 488 499 | 
             
            }
         | 
| 489 500 |  | 
| 490 | 
            -
            void *h_rem_int(HashTable *self, const  | 
| 501 | 
            +
            void *h_rem_int(HashTable *self, const unsigned long key)
         | 
| 491 502 | 
             
            {
         | 
| 492 503 | 
             
              return h_rem(self, &key, false);
         | 
| 493 504 | 
             
            }
         | 
| 494 505 |  | 
| 495 | 
            -
            int h_set_int(HashTable *self, const  | 
| 506 | 
            +
            int h_set_int(HashTable *self, const unsigned long key, void *value)
         | 
| 496 507 | 
             
            {
         | 
| 497 508 | 
             
              return h_set(self, &key, value);
         | 
| 498 509 | 
             
            }
         | 
| 499 510 |  | 
| 500 | 
            -
            int h_set_safe_int(HashTable *self, const  | 
| 511 | 
            +
            int h_set_safe_int(HashTable *self, const unsigned long key, void *value)
         | 
| 501 512 | 
             
            {
         | 
| 502 513 | 
             
              return h_set_safe(self, &key, value);
         | 
| 503 514 | 
             
            }
         | 
| 504 515 |  | 
| 505 | 
            -
            int h_has_key_int(HashTable *self, const  | 
| 516 | 
            +
            int h_has_key_int(HashTable *self, const unsigned long key)
         | 
| 506 517 | 
             
            {
         | 
| 507 518 | 
             
              return h_has_key(self, &key);
         | 
| 508 519 | 
             
            }
         |