Subversion Repositories wimsdev

Rev

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

Rev 10 Rev 3247
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
        singlespace(p1);
99
        singlespace(p1);
100
        p1=find_word_start(p1); pp=find_word_start(pp);
100
        p1=find_word_start(p1); pp=find_word_start(pp);
101
        if(*p1==0) continue;
101
        if(*p1==0) continue;
102
        suf[i].original=p1; suf[i].olen=l=strlen(p1);
102
        suf[i].original=(unsigned char*)p1; suf[i].olen=l=strlen(p1);
103
        if(l<sufminlen) sufminlen=l;
103
        if(l<sufminlen) sufminlen=l;
104
        suf[i].replace=pp; i++;
104
        suf[i].replace=(unsigned char*)pp; i++;
105
    }
105
    }
106
    suffixcnt=i;
106
    suffixcnt=i;
107
}
107
}
108
 
108
 
109
        /* Suffix translation. */
109
        /* Suffix translation. */
Line 117... Line 117...
117
        p1=p2) {
117
        p1=p2) {
118
        if(!isalpha(*p1)) {p2=p1+1; continue;}
118
        if(!isalpha(*p1)) {p2=p1+1; continue;}
119
        for(p2=p1;isalpha(*p2);p2++);
119
        for(p2=p1;isalpha(*p2);p2++);
120
        if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
120
        if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
121
        sufwordlen=p2-p1;
121
        sufwordlen=p2-p1;
122
        t=suffix_list(suf,suffixcnt,sizeof(suf[0]),p1);
122
        t=suffix_list(suf,suffixcnt,sizeof(suf[0]),(unsigned char*)p1);
123
        if(t<0) continue;
123
        if(t<0) continue;
124
        string_modify(p,p2-suf[t].olen,p2,suf[t].replace);
124
        string_modify(p,p2-suf[t].olen,p2,(char*)suf[t].replace);
125
        p2=p2-suf[t].olen+strlen(suf[t].replace);
125
        p2=p2-suf[t].olen+strlen((char*)suf[t].replace);
126
    }
126
    }
127
    p[MAX_LINELEN]=0;
127
    p[MAX_LINELEN]=0;
128
}
128
}
129
 
129
 
130
void suffix(char *p, char *sdicname)
130
void suffix(char *p, char *sdicname)