Blame


1 08708877 2003-11-25 devnull #include <u.h>
2 08708877 2003-11-25 devnull #include <libc.h>
3 08708877 2003-11-25 devnull #include <bio.h>
4 08708877 2003-11-25 devnull #include "dict.h"
5 08708877 2003-11-25 devnull
6 08708877 2003-11-25 devnull /*
7 08708877 2003-11-25 devnull * Routines for handling dictionaries in the "Paperback Collins"
8 08708877 2003-11-25 devnull * format (with tags surrounded by >....<)
9 08708877 2003-11-25 devnull */
10 08708877 2003-11-25 devnull enum {
11 cbeb0b26 2006-04-01 devnull Buflen=1000
12 08708877 2003-11-25 devnull };
13 08708877 2003-11-25 devnull
14 08708877 2003-11-25 devnull /* More special runes */
15 08708877 2003-11-25 devnull enum {
16 08708877 2003-11-25 devnull B = MULTIE+1, /* bold */
17 08708877 2003-11-25 devnull H, /* headword start */
18 08708877 2003-11-25 devnull I, /* italics */
19 08708877 2003-11-25 devnull Ps, /* pronunciation start */
20 08708877 2003-11-25 devnull Pe, /* pronunciation end */
21 08708877 2003-11-25 devnull R, /* roman */
22 cbeb0b26 2006-04-01 devnull X /* headword end */
23 08708877 2003-11-25 devnull };
24 08708877 2003-11-25 devnull
25 08708877 2003-11-25 devnull /* Assoc tables must be sorted on first field */
26 08708877 2003-11-25 devnull
27 08708877 2003-11-25 devnull static Assoc tagtab[] = {
28 08708877 2003-11-25 devnull {"AA", 0xc5},
29 08708877 2003-11-25 devnull {"AC", LACU},
30 08708877 2003-11-25 devnull {"B", B},
31 08708877 2003-11-25 devnull {"CE", LCED},
32 08708877 2003-11-25 devnull {"CI", LFRN},
33 08708877 2003-11-25 devnull {"Di", 0x131},
34 08708877 2003-11-25 devnull {"EL", 0x2d},
35 08708877 2003-11-25 devnull {"GR", LGRV},
36 08708877 2003-11-25 devnull {"H", H},
37 08708877 2003-11-25 devnull {"I", I},
38 08708877 2003-11-25 devnull {"OE", 0x152},
39 08708877 2003-11-25 devnull {"R", R},
40 08708877 2003-11-25 devnull {"TI", LTIL},
41 08708877 2003-11-25 devnull {"UM", LUML},
42 08708877 2003-11-25 devnull {"X", X},
43 08708877 2003-11-25 devnull {"[", Ps},
44 08708877 2003-11-25 devnull {"]", Pe},
45 08708877 2003-11-25 devnull {"ac", LACU},
46 08708877 2003-11-25 devnull {"ce", LCED},
47 08708877 2003-11-25 devnull {"ci", LFRN},
48 08708877 2003-11-25 devnull {"gr", LGRV},
49 08708877 2003-11-25 devnull {"oe", 0x153},
50 08708877 2003-11-25 devnull {"supe", 0x65}, /* should be raised */
51 08708877 2003-11-25 devnull {"supo", 0x6f}, /* should be raised */
52 08708877 2003-11-25 devnull {"ti", LTIL},
53 08708877 2003-11-25 devnull {"um", LUML},
54 08708877 2003-11-25 devnull {"{", Ps},
55 08708877 2003-11-25 devnull {"~", 0x7e},
56 cbeb0b26 2006-04-01 devnull {"~~", MTT}
57 08708877 2003-11-25 devnull };
58 08708877 2003-11-25 devnull
59 08708877 2003-11-25 devnull static Rune normtab[128] = {
60 08708877 2003-11-25 devnull /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
61 08708877 2003-11-25 devnull /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
62 08708877 2003-11-25 devnull NONE, NONE, 0x20, NONE, NONE, NONE, NONE, NONE,
63 08708877 2003-11-25 devnull /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
64 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
65 08708877 2003-11-25 devnull /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, '\'',
66 08708877 2003-11-25 devnull 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
67 08708877 2003-11-25 devnull /*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
68 08708877 2003-11-25 devnull 0x38, 0x39, 0x3a, 0x3b, TAGE, 0x3d, TAGS, 0x3f,
69 08708877 2003-11-25 devnull /*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
70 e2d62fb9 2005-07-13 devnull 0x48, 0x49, 0x4a, 0x4b, 'L', 0x4d, 0x4e, 0x4f,
71 08708877 2003-11-25 devnull /*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
72 e2d62fb9 2005-07-13 devnull 0x58, 0x59, 0x5a, 0x5b, '\\', 0x5d, 0x5e, 0x5f,
73 08708877 2003-11-25 devnull /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
74 08708877 2003-11-25 devnull 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
75 08708877 2003-11-25 devnull /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
76 cbeb0b26 2006-04-01 devnull 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE
77 08708877 2003-11-25 devnull };
78 08708877 2003-11-25 devnull
79 08708877 2003-11-25 devnull static char *gettag(char *, char *);
80 08708877 2003-11-25 devnull
81 08708877 2003-11-25 devnull static Entry curentry;
82 08708877 2003-11-25 devnull static char tag[Buflen];
83 08708877 2003-11-25 devnull #define cursize (curentry.end-curentry.start)
84 08708877 2003-11-25 devnull
85 08708877 2003-11-25 devnull void
86 08708877 2003-11-25 devnull pcollprintentry(Entry e, int cmd)
87 08708877 2003-11-25 devnull {
88 08708877 2003-11-25 devnull char *p, *pe;
89 08708877 2003-11-25 devnull long r, rprev, t, rlig;
90 08708877 2003-11-25 devnull int saveoi;
91 08708877 2003-11-25 devnull Rune *transtab;
92 08708877 2003-11-25 devnull
93 08708877 2003-11-25 devnull p = e.start;
94 08708877 2003-11-25 devnull pe = e.end;
95 08708877 2003-11-25 devnull transtab = normtab;
96 08708877 2003-11-25 devnull rprev = NONE;
97 08708877 2003-11-25 devnull changett(0, 0, 0);
98 08708877 2003-11-25 devnull curentry = e;
99 08708877 2003-11-25 devnull saveoi = 0;
100 08708877 2003-11-25 devnull if(cmd == 'h')
101 08708877 2003-11-25 devnull outinhibit = 1;
102 08708877 2003-11-25 devnull while(p < pe) {
103 08708877 2003-11-25 devnull if(cmd == 'r') {
104 08708877 2003-11-25 devnull outchar(*p++);
105 08708877 2003-11-25 devnull continue;
106 08708877 2003-11-25 devnull }
107 08708877 2003-11-25 devnull r = transtab[(*p++)&0x7F];
108 08708877 2003-11-25 devnull if(r < NONE) {
109 08708877 2003-11-25 devnull /* Emit the rune, but buffer in case of ligature */
110 08708877 2003-11-25 devnull if(rprev != NONE)
111 08708877 2003-11-25 devnull outrune(rprev);
112 08708877 2003-11-25 devnull rprev = r;
113 08708877 2003-11-25 devnull } else if(r == TAGS) {
114 08708877 2003-11-25 devnull p = gettag(p, pe);
115 08708877 2003-11-25 devnull t = lookassoc(tagtab, asize(tagtab), tag);
116 08708877 2003-11-25 devnull if(t == -1) {
117 08708877 2003-11-25 devnull if(debug && !outinhibit)
118 08708877 2003-11-25 devnull err("tag %ld %d %s",
119 08708877 2003-11-25 devnull e.doff, cursize, tag);
120 08708877 2003-11-25 devnull continue;
121 08708877 2003-11-25 devnull }
122 08708877 2003-11-25 devnull if(t < NONE) {
123 08708877 2003-11-25 devnull if(rprev != NONE)
124 08708877 2003-11-25 devnull outrune(rprev);
125 08708877 2003-11-25 devnull rprev = t;
126 08708877 2003-11-25 devnull } else if(t >= LIGS && t < LIGE) {
127 08708877 2003-11-25 devnull /* handle possible ligature */
128 08708877 2003-11-25 devnull rlig = liglookup(t, rprev);
129 08708877 2003-11-25 devnull if(rlig != NONE)
130 08708877 2003-11-25 devnull rprev = rlig; /* overwrite rprev */
131 08708877 2003-11-25 devnull else {
132 08708877 2003-11-25 devnull /* could print accent, but let's not */
133 08708877 2003-11-25 devnull if(rprev != NONE) outrune(rprev);
134 08708877 2003-11-25 devnull rprev = NONE;
135 08708877 2003-11-25 devnull }
136 08708877 2003-11-25 devnull } else if(t >= MULTI && t < MULTIE) {
137 08708877 2003-11-25 devnull if(rprev != NONE) {
138 08708877 2003-11-25 devnull outrune(rprev);
139 08708877 2003-11-25 devnull rprev = NONE;
140 08708877 2003-11-25 devnull }
141 08708877 2003-11-25 devnull outrunes(multitab[t-MULTI]);
142 08708877 2003-11-25 devnull } else {
143 08708877 2003-11-25 devnull if(rprev != NONE) {
144 08708877 2003-11-25 devnull outrune(rprev);
145 08708877 2003-11-25 devnull rprev = NONE;
146 08708877 2003-11-25 devnull }
147 08708877 2003-11-25 devnull switch(t){
148 08708877 2003-11-25 devnull case H:
149 08708877 2003-11-25 devnull if(cmd == 'h')
150 08708877 2003-11-25 devnull outinhibit = 0;
151 08708877 2003-11-25 devnull else
152 08708877 2003-11-25 devnull outnl(0);
153 08708877 2003-11-25 devnull break;
154 08708877 2003-11-25 devnull case X:
155 08708877 2003-11-25 devnull if(cmd == 'h')
156 08708877 2003-11-25 devnull outinhibit = 1;
157 08708877 2003-11-25 devnull else
158 08708877 2003-11-25 devnull outchars(". ");
159 08708877 2003-11-25 devnull break;
160 08708877 2003-11-25 devnull case Ps:
161 08708877 2003-11-25 devnull /* don't know enough of pron. key yet */
162 08708877 2003-11-25 devnull saveoi = outinhibit;
163 08708877 2003-11-25 devnull outinhibit = 1;
164 08708877 2003-11-25 devnull break;
165 08708877 2003-11-25 devnull case Pe:
166 08708877 2003-11-25 devnull outinhibit = saveoi;
167 08708877 2003-11-25 devnull break;
168 08708877 2003-11-25 devnull }
169 08708877 2003-11-25 devnull }
170 08708877 2003-11-25 devnull }
171 08708877 2003-11-25 devnull }
172 08708877 2003-11-25 devnull if(cmd == 'h')
173 08708877 2003-11-25 devnull outinhibit = 0;
174 08708877 2003-11-25 devnull outnl(0);
175 08708877 2003-11-25 devnull }
176 08708877 2003-11-25 devnull
177 08708877 2003-11-25 devnull long
178 08708877 2003-11-25 devnull pcollnextoff(long fromoff)
179 08708877 2003-11-25 devnull {
180 08708877 2003-11-25 devnull long a;
181 08708877 2003-11-25 devnull char *p;
182 08708877 2003-11-25 devnull
183 08708877 2003-11-25 devnull a = Bseek(bdict, fromoff, 0);
184 08708877 2003-11-25 devnull if(a < 0)
185 08708877 2003-11-25 devnull return -1;
186 08708877 2003-11-25 devnull for(;;) {
187 08708877 2003-11-25 devnull p = Brdline(bdict, '\n');
188 08708877 2003-11-25 devnull if(!p)
189 08708877 2003-11-25 devnull break;
190 08708877 2003-11-25 devnull if(p[0] == '>' && p[1] == 'H' && p[2] == '<')
191 08708877 2003-11-25 devnull return (Boffset(bdict)-Blinelen(bdict));
192 08708877 2003-11-25 devnull }
193 08708877 2003-11-25 devnull return -1;
194 08708877 2003-11-25 devnull }
195 08708877 2003-11-25 devnull
196 08708877 2003-11-25 devnull void
197 08708877 2003-11-25 devnull pcollprintkey(void)
198 08708877 2003-11-25 devnull {
199 08708877 2003-11-25 devnull Bprint(bout, "No pronunciation key yet\n");
200 08708877 2003-11-25 devnull }
201 08708877 2003-11-25 devnull
202 08708877 2003-11-25 devnull /*
203 08708877 2003-11-25 devnull * f points just after '>'; fe points at end of entry.
204 08708877 2003-11-25 devnull * Expect next characters from bin to match:
205 08708877 2003-11-25 devnull * [^ <]+<
206 08708877 2003-11-25 devnull * tag
207 08708877 2003-11-25 devnull * Accumulate the tag in tag[].
208 08708877 2003-11-25 devnull * Return pointer to after final '<'.
209 08708877 2003-11-25 devnull */
210 08708877 2003-11-25 devnull static char *
211 08708877 2003-11-25 devnull gettag(char *f, char *fe)
212 08708877 2003-11-25 devnull {
213 08708877 2003-11-25 devnull char *t;
214 08708877 2003-11-25 devnull int c, i;
215 08708877 2003-11-25 devnull
216 08708877 2003-11-25 devnull t = tag;
217 08708877 2003-11-25 devnull i = Buflen;
218 08708877 2003-11-25 devnull while(--i > 0) {
219 08708877 2003-11-25 devnull c = *f++;
220 08708877 2003-11-25 devnull if(c == '<' || f == fe)
221 08708877 2003-11-25 devnull break;
222 08708877 2003-11-25 devnull *t++ = c;
223 08708877 2003-11-25 devnull }
224 08708877 2003-11-25 devnull *t = 0;
225 08708877 2003-11-25 devnull return f;
226 08708877 2003-11-25 devnull }