Rev 3808 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3808 | Rev 8161 | ||
---|---|---|---|
Line 13... | Line 13... | ||
13 | * You should have received a copy of the GNU General Public License |
13 | * You should have received a copy of the GNU General Public License |
14 | * along with this program; if not, write to the Free Software |
14 | * along with this program; if not, write to the Free Software |
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
16 | */ |
16 | */ |
17 | 17 | ||
18 |
|
18 | /* Versatile translation according to a dictionary */ |
- | 19 | ||
- | 20 | #include "symtext.h" |
|
19 | 21 | ||
20 | char inpbuf[MAX_LINELEN+1], troutbuf[2*MAX_LINELEN+2]; |
22 | char inpbuf[MAX_LINELEN+1], troutbuf[2*MAX_LINELEN+2]; |
21 | struct entry { |
- | |
22 | unsigned char *original, *replace; |
- | |
23 | int olen,earlier; |
- | |
24 |
|
23 | struct entry entry[MAX_DICENTRIES]; |
25 | int entrycount=0; |
24 | int entrycount=0; |
26 | 25 | ||
27 | struct dic { |
- | |
28 | char name[MAX_FNAME+1]; |
- | |
29 | char unknown[256]; |
- | |
30 | char *buf; |
- | |
31 | int unknown_type; |
- | |
32 | int start; |
- | |
33 | int len; |
- | |
34 |
|
26 | struct dic dic[MAX_DICS]; |
35 | int diccnt; |
27 | int diccnt; |
36 | int transdic, macrodic; |
28 | int transdic, macrodic; |
37 | 29 | ||
38 | enum { |
- | |
39 | unk_delete, unk_leave, unk_replace |
- | |
40 | }; |
- | |
41 | - | ||
42 | int compare(struct entry *e, const char *s2) |
30 | int compare(struct entry *e, const char *s2) |
43 | { |
31 | { |
44 | int k; |
32 | int k; |
45 | k=strncmp((char*)e->original, (char*)s2, e->olen); |
33 | k=strncmp((char*)e->original, (char*)s2, e->olen); |
46 | if(k==0 && isalnum(*(s2+e->olen))) return -1; |
34 | if(k==0 && isalnum(*(s2+e->olen))) return -1; |
47 | else return k; |
35 | else return k; |
48 | } |
36 | } |
49 | 37 | ||
50 | /* searches a list. Returns index if found, -1 if nomatch. |
38 | /* searches a list. Returns index if found, -1 if nomatch. |
51 | * Uses binary search, list must be sorted. */ |
39 | * Uses binary search, list must be sorted. */ |
52 | int search_dic(struct entry *list, int items, size_t item_size, const char *str) |
40 | int search_dic(struct entry *list, int items, size_t item_size, const char *str) |
53 | { |
41 | { |
54 | int i1,i2,j,k,t,t1; |
42 | int i1,i2,j,k,t,t1; |
55 | unsigned char c; |
43 | unsigned char c; |
Line 63... | Line 51... | ||
63 | if(k>0) for(i1=0,i2=j;i2>i1+1;) { |
51 | if(k>0) for(i1=0,i2=j;i2>i1+1;) { |
64 | j=i1+(i2-i1)/2; |
52 | j=i1+(i2-i1)/2; |
65 | k=list[j].original[0]-c; if(k==0) k=compare(list+j,str); |
53 | k=list[j].original[0]-c; if(k==0) k=compare(list+j,str); |
66 | if(k==0) goto more; |
54 | if(k==0) goto more; |
67 | if(k>0) {i2=j; continue;} |
55 | if(k>0) {i2=j; continue;} |
68 | if(k<0) {i1=j; continue;} |
56 | if(k<0) {i1=j; continue;} |
69 | } |
57 | } |
70 | if(k>0) {j--;k=compare(list+j,str);} |
58 | if(k>0) {j--;k=compare(list+j,str);} |
71 | more: |
59 | more: |
72 | if((t=list[j].earlier)<0) { |
60 | if((t=list[j].earlier)<0) { |
73 | if(k==0) return j; else return -1; |
61 | if(k==0) return j; else return -1; |
74 | } |
62 | } |
75 | if(compare(entry+t,str)!=0) return -1; |
63 | if(compare(entry+t,str)!=0) return -1; |
76 | for(j=t1=t,k=0;j<items+(list-entry) && entry[j].earlier==t1 && (k=compare(entry+j,str))<=0; j++) |
64 | for(j=t1=t,k=0;j<items+(list-entry) && entry[j].earlier==t1 && (k=compare(entry+j,str))<=0; j++) |
77 | if(k==0) t=j; |
65 | if(k==0) t=j; |
78 | return t-(list-entry); |
66 | return t-(list-entry); |
79 | } |
67 | } |
80 | 68 | ||
81 | #include "suffix.c" |
- | |
82 | - | ||
83 |
|
69 | /* Prepare dictionary */ |
84 | struct dic *prepare_dic(char *fname) |
70 | struct dic *prepare_dic(char *fname) |
85 | { |
71 | { |
86 | int i,l; |
72 | int i,l; |
87 | struct dic *thisdic; |
73 | struct dic *thisdic; |
88 | FILE *dicf; |
74 | FILE *dicf; |
89 | char *p1, *p2, *pp; |
75 | char *p1, *p2, *pp; |
90 | char tbuf[256], buf[MAX_LINELEN+1]; |
76 | char tbuf[256], buf[MAX_LINELEN+1]; |
91 | long int flen; |
77 | long int flen; |
92 | 78 | ||
93 | if(diccnt>=MAX_DICS) error("too_many_dictionaries"); |
79 | if(diccnt>=MAX_DICS) error("too_many_dictionaries"); |
94 | thisdic=dic+diccnt; diccnt++; |
80 | thisdic=dic+diccnt; diccnt++; |
95 | thisdic->len=0; |
81 | thisdic->len=0; |
96 | thisdic->start=entrycount; |
82 | thisdic->start=entrycount; |
97 | snprintf(thisdic->name,sizeof(thisdic->name),"%s",fname); |
83 | snprintf(thisdic->name,sizeof(thisdic->name),"%s",fname); |
Line 115... | Line 101... | ||
115 | fname,entry[i-1].original,p1); |
101 | fname,entry[i-1].original,p1); |
116 | if(i>entrycount && strcmp((char*)entry[i-1].original,p1)==0) |
102 | if(i>entrycount && strcmp((char*)entry[i-1].original,p1)==0) |
117 | error("duplication_in_dictionary %s: %s.\n", |
103 | error("duplication_in_dictionary %s: %s.\n", |
118 | fname,p1); |
104 | fname,p1); |
119 | entry[i].original=(unsigned char*)p1; |
105 | entry[i].original=(unsigned char*)p1; |
120 | entry[i].replace=(unsigned char*)pp; |
106 | entry[i].replace=(unsigned char*)pp; |
121 | entry[i].olen=l=strlen(p1); entry[i].earlier=-1; |
107 | entry[i].olen=l=strlen(p1); entry[i].earlier=-1; |
122 | if(i>0) { |
108 | if(i>0) { |
123 | int l1,l2; |
109 | int l1,l2; |
124 | l1=entry[i-1].earlier; if(l1>=0) l2=entry[l1].olen; |
110 | l1=entry[i-1].earlier; if(l1>=0) l2=entry[l1].olen; |
125 | else {l2=entry[i-1].olen;l1=i-1;} |
111 | else {l2=entry[i-1].olen;l1=i-1;} |
126 | if(l>l2 && isspace(p1[l2]) |
112 | if(l>l2 && isspace(p1[l2]) |
127 | && strncmp((char*)entry[l1].original,p1,l2)==0) |
113 | && strncmp((char*)entry[l1].original,p1,l2)==0) |
128 | entry[i].earlier=entry[i-1].earlier=l1; |
114 | entry[i].earlier=entry[i-1].earlier=l1; |
129 | } |
115 | } |
130 | i++; |
116 | i++; |
131 | } |
117 | } |
132 | thisdic->len=i-entrycount; |
118 | thisdic->len=i-entrycount; |
Line 145... | Line 131... | ||
145 | if(debug) fprintf(stderr,"Dictionary %d: %s, %d entries.\n", |
131 | if(debug) fprintf(stderr,"Dictionary %d: %s, %d entries.\n", |
146 | diccnt,fname,thisdic->len); |
132 | diccnt,fname,thisdic->len); |
147 | return thisdic; |
133 | return thisdic; |
148 | } |
134 | } |
149 | 135 | ||
150 |
|
136 | /* make the translation. */ |
151 | void _translate(char *p, int i) |
137 | void _translate(char *p, int i) |
152 | { |
138 | { |
153 | char *p1, *p2, *pp; |
139 | char *p1, *p2, *pp; |
154 | int t; |
140 | int t; |
155 | 141 |