Subversion Repositories wimsdev

Rev

Rev 10 | Rev 8113 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 10 Rev 3808
Line 43... Line 43...
43
}
43
}
44
 
44
 
45
        /* searches a list. Returns index if found, -1 if nomatch.
45
        /* searches a list. Returns index if found, -1 if nomatch.
46
         * This routine is faster than naive one by one comparisons,
46
         * This routine is faster than naive one by one comparisons,
47
         * and is especially suited for large lists. */
47
         * and is especially suited for large lists. */
48
int suffix_list(void *list, int items, size_t item_size, const char *str)
48
int suffix_list(void *list, int items, size_t item_size, const unsigned char *str)
49
{
49
{
50
    int i1,i2,j,k,t,v;
50
    int i1,i2,j,k,t,v;
51
    char c,d;
51
    unsigned char c,d;
52
   
52
   
53
    if(items<=0) return -1;
53
    if(items<=0) return -1;
54
    k=sufcomp(0,str);
54
    k=sufcomp(0,str);
55
    if(k==0) return 0; if(k>0) return -1;
55
    if(k==0) return 0; if(k>0) return -1;
56
    j=items-1; k=sufcomp(j,str);
56
    j=items-1; k=sufcomp(j,str);
Line 68... Line 68...
68
    if(t<sufminlen) return -1; if(t>=suf[j].olen) return j;
68
    if(t<sufminlen) return -1; if(t>=suf[j].olen) return j;
69
    for(j--,c=str[sufwordlen-1],d=str[sufwordlen-t];
69
    for(j--,c=str[sufwordlen-1],d=str[sufwordlen-t];
70
        j>=0 && suf[j].original[0]==c && suf[j].olen>t
70
        j>=0 && suf[j].original[0]==c && suf[j].olen>t
71
        && suf[j].original[t-1]==d;j--);
71
        && suf[j].original[t-1]==d;j--);
72
    if(j>=0 && suf[j].original[0]==c &&
72
    if(j>=0 && suf[j].original[0]==c &&
73
       strncmp(suf[j].original,suf[v].original,suf[j].olen)==0)
73
       strncmp((char*)suf[j].original,(char*)suf[v].original,suf[j].olen)==0)
74
      return j;
74
      return j;
75
    else goto backcheck;
75
    else goto backcheck;
76
}
76
}
77
 
77
 
78
        /* Prepare dictionary.  */
78
        /* Prepare dictionary.  */
Line 97... Line 97...
97
        *pp++=0;
97
        *pp++=0;
98
        strip_trailing_spaces(p1); strip_trailing_spaces(pp);
98
        strip_trailing_spaces(p1); strip_trailing_spaces(pp);
99
        p1=find_word_start(p1); pp=find_word_start(pp);
99
        p1=find_word_start(p1); pp=find_word_start(pp);
100
        if(*p1==0) continue;
100
        if(*p1==0) continue;
101
        if(i>0) {
101
        if(i>0) {
102
            k=strcmp(suf[i-1].original,p1);
102
            k=strcmp((char*)suf[i-1].original,p1);
103
            if(k>0) {
103
            if(k>0) {
104
                pp=strrchr(sdicname,'/'); if(pp==NULL) pp=sdicname; else pp++;
104
                pp=strrchr(sdicname,'/'); if(pp==NULL) pp=sdicname; else pp++;
105
                error("unsorted_dictionary %s: %s > %s.\n",
105
                error("unsorted_dictionary %s: %s > %s.\n",
106
                      pp,suf[i-1].original,p1);
106
                      pp,suf[i-1].original,p1);
107
            }
107
            }
108
            if(k==0) {
108
            if(k==0) {
109
                pp=strrchr(sdicname,'/'); if(pp==NULL) pp=sdicname; else pp++;
109
                pp=strrchr(sdicname,'/'); if(pp==NULL) pp=sdicname; else pp++;
110
                error("duplication_in_dictionary %s: %s.\n",pp,p1);
110
                error("duplication_in_dictionary %s: %s.\n",pp,p1);
111
            }
111
            }
112
        }
112
        }
113
        suf[i].original=p1; suf[i].olen=l=strlen(p1);
113
        suf[i].original=(unsigned char*)p1; suf[i].olen=l=strlen(p1);
114
        if(l<sufminlen) sufminlen=l;
114
        if(l<sufminlen) sufminlen=l;
115
        suf[i].replace=pp; i++;
115
        suf[i].replace=(unsigned char*)pp; i++;
116
    }
116
    }
117
    suffixcnt=i;
117
    suffixcnt=i;
118
}
118
}
119
 
119
 
120
        /* Suffix translation. */
120
        /* Suffix translation. */
Line 128... Line 128...
128
        p1=p2) {
128
        p1=p2) {
129
        if(!isalpha(*p1)) {p2=p1+1; continue;}
129
        if(!isalpha(*p1)) {p2=p1+1; continue;}
130
        for(p2=p1;isalpha(*p2);p2++);
130
        for(p2=p1;isalpha(*p2);p2++);
131
        if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
131
        if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
132
        sufwordlen=p2-p1;
132
        sufwordlen=p2-p1;
133
        t=suffix_list(suf,suffixcnt,sizeof(suf[0]),p1);
133
        t=suffix_list(suf,suffixcnt,sizeof(suf[0]),(unsigned char*)p1);
134
        if(t<0) continue;
134
        if(t<0) continue;
135
        string_modify(p,p2-suf[t].olen,p2,suf[t].replace);
135
        string_modify(p,p2-suf[t].olen,p2,(char*)suf[t].replace);
136
        p2=p2-suf[t].olen+strlen(suf[t].replace);
136
        p2=p2-suf[t].olen+strlen((char*)suf[t].replace);
137
    }
137
    }
138
    p[MAX_LINELEN]=0;
138
    p[MAX_LINELEN]=0;
139
}
139
}
140
 
140
 
141
void suffix(char *p, char *sdicname)
141
void suffix(char *p, char *sdicname)