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 * `German' format (with tags surrounded by \5⋯\6 and \xba⋯\xba)
9 08708877 2003-11-25 devnull */
10 08708877 2003-11-25 devnull
11 08708877 2003-11-25 devnull /*
12 08708877 2003-11-25 devnull * \5...\6 escapes (fonts, mostly)
13 08708877 2003-11-25 devnull *
14 08708877 2003-11-25 devnull * h headword (helvetica 7 pt)
15 08708877 2003-11-25 devnull * c clause (helvetica 7 pt)
16 08708877 2003-11-25 devnull * 3 helvetica 7 pt
17 08708877 2003-11-25 devnull * 4 helvetica 6.5 pt
18 08708877 2003-11-25 devnull * s helvetica 8 pt
19 08708877 2003-11-25 devnull * x helvetica 8 pt
20 08708877 2003-11-25 devnull * y helvetica 5 pt
21 08708877 2003-11-25 devnull * m helvetica 30 pt
22 08708877 2003-11-25 devnull * 1 roman 6 pt
23 08708877 2003-11-25 devnull * 9 roman 4.5 pt
24 08708877 2003-11-25 devnull * p roman 7 pt
25 08708877 2003-11-25 devnull * q roman 4.5 pt
26 08708877 2003-11-25 devnull * 2 italic 6 pt
27 08708877 2003-11-25 devnull * 7 italic 4.5 pt
28 08708877 2003-11-25 devnull * b bold 6 pt
29 08708877 2003-11-25 devnull * a `indent 0:4 left'
30 08708877 2003-11-25 devnull * k `keep 9'
31 08708877 2003-11-25 devnull * l `size 12'
32 08708877 2003-11-25 devnull */
33 08708877 2003-11-25 devnull
34 08708877 2003-11-25 devnull enum {
35 08708877 2003-11-25 devnull IBASE=0x69, /* dotless i */
36 cbeb0b26 2006-04-01 devnull Taglen=32
37 08708877 2003-11-25 devnull };
38 08708877 2003-11-25 devnull
39 08708877 2003-11-25 devnull static Rune intab[256] = {
40 08708877 2003-11-25 devnull /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
41 08708877 2003-11-25 devnull /*00*/ NONE, NONE, NONE, NONE, NONE, TAGS, TAGE, NONE,
42 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, 0x20, NONE, NONE,
43 08708877 2003-11-25 devnull /*10*/ NONE, 0x2d, 0x20, 0x20, NONE, NONE, NONE, NONE,
44 08708877 2003-11-25 devnull 0x20, NONE, NONE, NONE, 0x20, NONE, NONE, 0x2d,
45 08708877 2003-11-25 devnull /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, '\'',
46 08708877 2003-11-25 devnull 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
47 08708877 2003-11-25 devnull /*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
48 08708877 2003-11-25 devnull 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
49 08708877 2003-11-25 devnull /*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
50 e2d62fb9 2005-07-13 devnull 0x48, 0x49, 0x4a, 0x4b,'L', 0x4d, 0x4e, 0x4f,
51 08708877 2003-11-25 devnull /*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
52 e2d62fb9 2005-07-13 devnull 0x58, 0x59, 0x5a, 0x5b,'\\', 0x5d, 0x5e, 0x5f,
53 08708877 2003-11-25 devnull /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
54 08708877 2003-11-25 devnull 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
55 08708877 2003-11-25 devnull /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
56 08708877 2003-11-25 devnull 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
57 08708877 2003-11-25 devnull /*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
58 08708877 2003-11-25 devnull NONE, NONE, 0x20, NONE, NONE, NONE, NONE, NONE,
59 08708877 2003-11-25 devnull /*90*/ 0xdf, 0xe6, NONE, MOE, NONE, NONE, NONE, 0xf8,
60 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
61 08708877 2003-11-25 devnull /*A0*/ NONE, NONE, 0x22, 0xa3, NONE, NONE, NONE, NONE,
62 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
63 08708877 2003-11-25 devnull /*B0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x7e,
64 08708877 2003-11-25 devnull NONE, IBASE, SPCS, NONE, NONE, NONE, NONE, NONE,
65 08708877 2003-11-25 devnull /*C0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
66 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
67 08708877 2003-11-25 devnull /*D0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
68 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
69 08708877 2003-11-25 devnull /*E0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
70 08708877 2003-11-25 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
71 08708877 2003-11-25 devnull /*F0*/ 0x20, 0x20, NONE, NONE, NONE, NONE, NONE, NONE,
72 cbeb0b26 2006-04-01 devnull NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE
73 08708877 2003-11-25 devnull };
74 08708877 2003-11-25 devnull
75 08708877 2003-11-25 devnull static Nassoc numtab[] = {
76 08708877 2003-11-25 devnull {1, 0x2b},
77 08708877 2003-11-25 devnull {4, 0x3d},
78 08708877 2003-11-25 devnull {7, 0xb0},
79 08708877 2003-11-25 devnull {11, 0x2248},
80 08708877 2003-11-25 devnull {69, 0x2666},
81 08708877 2003-11-25 devnull {114, 0xae},
82 08708877 2003-11-25 devnull {340, 0x25b},
83 08708877 2003-11-25 devnull {341, 0x254},
84 08708877 2003-11-25 devnull {342, 0x28c},
85 08708877 2003-11-25 devnull {343, 0x259},
86 08708877 2003-11-25 devnull {345, 0x292},
87 08708877 2003-11-25 devnull {346, 0x283},
88 08708877 2003-11-25 devnull {347, 0x275},
89 08708877 2003-11-25 devnull {348, 0x28a},
90 08708877 2003-11-25 devnull {349, 0x2c8},
91 08708877 2003-11-25 devnull {351, 0x26a},
92 08708877 2003-11-25 devnull {352, 0x25c},
93 08708877 2003-11-25 devnull {354, 0x251},
94 08708877 2003-11-25 devnull {355, 0x7e},
95 08708877 2003-11-25 devnull {356, 0x252},
96 08708877 2003-11-25 devnull {384, 0x273},
97 08708877 2003-11-25 devnull {445, 0xf0}, /* BUG -- should be script eth */
98 08708877 2003-11-25 devnull };
99 08708877 2003-11-25 devnull
100 08708877 2003-11-25 devnull static Nassoc overtab[] = {
101 08708877 2003-11-25 devnull {0x2c, LCED},
102 08708877 2003-11-25 devnull {0x2f, LACU},
103 08708877 2003-11-25 devnull {0x3a, LUML},
104 e2d62fb9 2005-07-13 devnull {'\\', LGRV},
105 08708877 2003-11-25 devnull {0x5e, LFRN},
106 cbeb0b26 2006-04-01 devnull {0x7e, LTIL}
107 08708877 2003-11-25 devnull };
108 08708877 2003-11-25 devnull
109 08708877 2003-11-25 devnull static uchar *reach(uchar*, int);
110 08708877 2003-11-25 devnull
111 08708877 2003-11-25 devnull static Entry curentry;
112 08708877 2003-11-25 devnull static char tag[Taglen];
113 08708877 2003-11-25 devnull
114 08708877 2003-11-25 devnull void
115 08708877 2003-11-25 devnull pcollgprintentry(Entry e, int cmd)
116 08708877 2003-11-25 devnull {
117 08708877 2003-11-25 devnull uchar *p, *pe;
118 08708877 2003-11-25 devnull int r, rprev = NONE, rx, over = 0, font;
119 08708877 2003-11-25 devnull char buf[16];
120 08708877 2003-11-25 devnull
121 08708877 2003-11-25 devnull p = (uchar *)e.start;
122 08708877 2003-11-25 devnull pe = (uchar *)e.end;
123 08708877 2003-11-25 devnull curentry = e;
124 08708877 2003-11-25 devnull if(cmd == 'h')
125 08708877 2003-11-25 devnull outinhibit = 1;
126 08708877 2003-11-25 devnull while(p < pe){
127 08708877 2003-11-25 devnull if(cmd == 'r'){
128 08708877 2003-11-25 devnull outchar(*p++);
129 08708877 2003-11-25 devnull continue;
130 08708877 2003-11-25 devnull }
131 08708877 2003-11-25 devnull switch(r = intab[*p++]){ /* assign = */
132 08708877 2003-11-25 devnull case TAGS:
133 08708877 2003-11-25 devnull if(rprev != NONE){
134 08708877 2003-11-25 devnull outrune(rprev);
135 08708877 2003-11-25 devnull rprev = NONE;
136 08708877 2003-11-25 devnull }
137 08708877 2003-11-25 devnull p = reach(p, 0x06);
138 08708877 2003-11-25 devnull font = tag[0];
139 08708877 2003-11-25 devnull if(cmd == 'h')
140 08708877 2003-11-25 devnull outinhibit = (font != 'h');
141 08708877 2003-11-25 devnull break;
142 08708877 2003-11-25 devnull
143 08708877 2003-11-25 devnull case TAGE: /* an extra one */
144 08708877 2003-11-25 devnull break;
145 fa325e9b 2020-01-10 cross
146 08708877 2003-11-25 devnull case SPCS:
147 08708877 2003-11-25 devnull p = reach(p, 0xba);
148 08708877 2003-11-25 devnull r = looknassoc(numtab, asize(numtab), strtol(tag,0,0));
149 08708877 2003-11-25 devnull if(r < 0){
150 08708877 2003-11-25 devnull if(rprev != NONE){
151 08708877 2003-11-25 devnull outrune(rprev);
152 08708877 2003-11-25 devnull rprev = NONE;
153 08708877 2003-11-25 devnull }
154 08708877 2003-11-25 devnull sprint(buf, "\\N'%s'", tag);
155 08708877 2003-11-25 devnull outchars(buf);
156 08708877 2003-11-25 devnull break;
157 08708877 2003-11-25 devnull }
158 08708877 2003-11-25 devnull /* else fall through */
159 08708877 2003-11-25 devnull
160 08708877 2003-11-25 devnull default:
161 08708877 2003-11-25 devnull if(over){
162 08708877 2003-11-25 devnull rx = looknassoc(overtab, asize(overtab), r);
163 08708877 2003-11-25 devnull if(rx > 0)
164 08708877 2003-11-25 devnull rx = liglookup(rx, rprev);
165 08708877 2003-11-25 devnull if(rx > 0 && rx != NONE)
166 08708877 2003-11-25 devnull outrune(rx);
167 08708877 2003-11-25 devnull else{
168 08708877 2003-11-25 devnull outrune(rprev);
169 08708877 2003-11-25 devnull if(r == ':')
170 08708877 2003-11-25 devnull outrune(0xa8);
171 08708877 2003-11-25 devnull else{
172 08708877 2003-11-25 devnull outrune(0x5e);
173 08708877 2003-11-25 devnull outrune(r);
174 08708877 2003-11-25 devnull }
175 08708877 2003-11-25 devnull }
176 08708877 2003-11-25 devnull over = 0;
177 08708877 2003-11-25 devnull rprev = NONE;
178 08708877 2003-11-25 devnull }else if(r == '^'){
179 08708877 2003-11-25 devnull over = 1;
180 08708877 2003-11-25 devnull }else{
181 08708877 2003-11-25 devnull if(rprev != NONE)
182 08708877 2003-11-25 devnull outrune(rprev);
183 08708877 2003-11-25 devnull rprev = r;
184 08708877 2003-11-25 devnull }
185 08708877 2003-11-25 devnull }
186 fa325e9b 2020-01-10 cross
187 08708877 2003-11-25 devnull }
188 08708877 2003-11-25 devnull if(rprev != NONE)
189 08708877 2003-11-25 devnull outrune(rprev);
190 08708877 2003-11-25 devnull if(cmd == 'h')
191 08708877 2003-11-25 devnull outinhibit = 0;
192 08708877 2003-11-25 devnull outnl(0);
193 08708877 2003-11-25 devnull }
194 08708877 2003-11-25 devnull
195 08708877 2003-11-25 devnull long
196 08708877 2003-11-25 devnull pcollgnextoff(long fromoff)
197 08708877 2003-11-25 devnull {
198 08708877 2003-11-25 devnull int c, state = 0, defoff = -1;
199 08708877 2003-11-25 devnull
200 08708877 2003-11-25 devnull if(Bseek(bdict, fromoff, 0) < 0)
201 08708877 2003-11-25 devnull return -1;
202 08708877 2003-11-25 devnull while((c = Bgetc(bdict)) >= 0){
203 08708877 2003-11-25 devnull if(c == '\r')
204 08708877 2003-11-25 devnull defoff = Boffset(bdict);
205 08708877 2003-11-25 devnull switch(state){
206 08708877 2003-11-25 devnull case 0:
207 08708877 2003-11-25 devnull if(c == 0x05)
208 08708877 2003-11-25 devnull state = 1;
209 08708877 2003-11-25 devnull break;
210 08708877 2003-11-25 devnull case 1:
211 08708877 2003-11-25 devnull if(c == 'h')
212 08708877 2003-11-25 devnull state = 2;
213 08708877 2003-11-25 devnull else
214 08708877 2003-11-25 devnull state = 0;
215 08708877 2003-11-25 devnull break;
216 08708877 2003-11-25 devnull case 2:
217 08708877 2003-11-25 devnull if(c == 0x06)
218 08708877 2003-11-25 devnull return (Boffset(bdict)-3);
219 08708877 2003-11-25 devnull else
220 08708877 2003-11-25 devnull state = 0;
221 08708877 2003-11-25 devnull break;
222 08708877 2003-11-25 devnull }
223 08708877 2003-11-25 devnull }
224 08708877 2003-11-25 devnull return defoff;
225 08708877 2003-11-25 devnull }
226 08708877 2003-11-25 devnull
227 08708877 2003-11-25 devnull void
228 08708877 2003-11-25 devnull pcollgprintkey(void)
229 08708877 2003-11-25 devnull {
230 08708877 2003-11-25 devnull Bprint(bout, "No pronunciation key yet\n");
231 08708877 2003-11-25 devnull }
232 08708877 2003-11-25 devnull
233 08708877 2003-11-25 devnull static uchar *
234 08708877 2003-11-25 devnull reach(uchar *p, int tagchar)
235 08708877 2003-11-25 devnull {
236 08708877 2003-11-25 devnull int c; char *q=tag;
237 08708877 2003-11-25 devnull
238 08708877 2003-11-25 devnull while(p < (uchar *)curentry.end){
239 08708877 2003-11-25 devnull c = *p++;
240 08708877 2003-11-25 devnull if(c == tagchar)
241 08708877 2003-11-25 devnull break;
242 08708877 2003-11-25 devnull *q++ = c;
243 08708877 2003-11-25 devnull if(q >= &tag[sizeof tag-1])
244 08708877 2003-11-25 devnull break;
245 08708877 2003-11-25 devnull }
246 08708877 2003-11-25 devnull *q = 0;
247 08708877 2003-11-25 devnull return p;
248 08708877 2003-11-25 devnull }