Blame


1 8d713330 2006-05-21 devnull #include <u.h>
2 8d713330 2006-05-21 devnull #include <libc.h>
3 8d713330 2006-05-21 devnull #include <bio.h>
4 8d713330 2006-05-21 devnull #include "hdr.h"
5 8d713330 2006-05-21 devnull #include "conv.h"
6 8d713330 2006-05-21 devnull
7 8d713330 2006-05-21 devnull typedef struct Tmap Tmap;
8 8d713330 2006-05-21 devnull struct Tmap
9 8d713330 2006-05-21 devnull {
10 8d713330 2006-05-21 devnull Rune u;
11 8d713330 2006-05-21 devnull Rune t;
12 8d713330 2006-05-21 devnull };
13 8d713330 2006-05-21 devnull
14 8d713330 2006-05-21 devnull static Tmap t1[] =
15 8d713330 2006-05-21 devnull {
16 8d713330 2006-05-21 devnull {0x0b85/*அ*/, 0xe201/**/},
17 8d713330 2006-05-21 devnull {0x0b86/*ஆ*/, 0xe202/**/},
18 8d713330 2006-05-21 devnull {0x0b87/*இ*/, 0xe203/**/},
19 8d713330 2006-05-21 devnull {0x0b88/*ஈ*/, 0xe204/**/},
20 8d713330 2006-05-21 devnull {0x0b89/*உ*/, 0xe205/**/},
21 8d713330 2006-05-21 devnull {0x0b8a/*ஊ*/, 0xe206/**/},
22 8d713330 2006-05-21 devnull {0x0b8e/*எ*/, 0xe207/**/},
23 8d713330 2006-05-21 devnull {0x0b8f/*ஏ*/, 0xe208/**/},
24 8d713330 2006-05-21 devnull {0x0b90/*ஐ*/, 0xe209/**/},
25 8d713330 2006-05-21 devnull {0x0b92/*ஒ*/, 0xe20a/**/},
26 8d713330 2006-05-21 devnull {0x0b93/*ஓ*/, 0xe20b/**/},
27 8d713330 2006-05-21 devnull {0x0b94/*ஔ*/, 0xe20c/**/},
28 8d713330 2006-05-21 devnull {0x0b83/*ஃ*/, 0xe20d/**/}
29 8d713330 2006-05-21 devnull };
30 8d713330 2006-05-21 devnull
31 8d713330 2006-05-21 devnull static Rune t2[] =
32 8d713330 2006-05-21 devnull {
33 8d713330 2006-05-21 devnull 0x0bcd/*்*/,
34 8d713330 2006-05-21 devnull 0x0bcd/*்*/, // filler
35 8d713330 2006-05-21 devnull 0x0bbe/*ா*/,
36 8d713330 2006-05-21 devnull 0x0bbf/*ி*/,
37 8d713330 2006-05-21 devnull 0x0bc0/*ீ*/,
38 8d713330 2006-05-21 devnull 0x0bc1/*ு*/,
39 8d713330 2006-05-21 devnull 0x0bc2/*ூ*/,
40 8d713330 2006-05-21 devnull 0x0bc6/*ெ*/,
41 8d713330 2006-05-21 devnull 0x0bc7/*ே*/,
42 8d713330 2006-05-21 devnull 0x0bc8/*ை*/,
43 8d713330 2006-05-21 devnull 0x0bca/*ொ*/,
44 8d713330 2006-05-21 devnull 0x0bcb/*ோ*/,
45 8d713330 2006-05-21 devnull 0x0bcc/*ௌ*/
46 8d713330 2006-05-21 devnull };
47 8d713330 2006-05-21 devnull
48 8d713330 2006-05-21 devnull static Tmap t3[] =
49 8d713330 2006-05-21 devnull {
50 8d713330 2006-05-21 devnull {0x0b95/*க*/, 0xe211/**/},
51 8d713330 2006-05-21 devnull {0x0b99/*ங*/, 0xe221/**/},
52 8d713330 2006-05-21 devnull {0x0b9a/*ச*/, 0xe231/**/},
53 8d713330 2006-05-21 devnull {0x0b9c/*ஜ*/, 0xe331/**/},
54 8d713330 2006-05-21 devnull {0x0b9e/*ஞ*/, 0xe241/**/},
55 8d713330 2006-05-21 devnull {0x0b9f/*ட*/, 0xe251/**/},
56 8d713330 2006-05-21 devnull {0x0ba3/*ண*/, 0xe261/**/},
57 8d713330 2006-05-21 devnull {0x0ba4/*த*/, 0xe271/**/},
58 8d713330 2006-05-21 devnull {0x0ba8/*ந*/, 0xe281/**/},
59 8d713330 2006-05-21 devnull {0x0ba9/*ன*/, 0xe321/**/},
60 8d713330 2006-05-21 devnull {0x0baa/*ப*/, 0xe291/**/},
61 8d713330 2006-05-21 devnull {0x0bae/*ம*/, 0xe2a1/**/},
62 8d713330 2006-05-21 devnull {0x0baf/*ய*/, 0xe2b1/**/},
63 8d713330 2006-05-21 devnull {0x0bb0/*ர*/, 0xe2c1/**/},
64 8d713330 2006-05-21 devnull {0x0bb1/*ற*/, 0xe311/**/},
65 8d713330 2006-05-21 devnull {0x0bb2/*ல*/, 0xe2d1/**/},
66 8d713330 2006-05-21 devnull {0x0bb3/*ள*/, 0xe301/**/},
67 8d713330 2006-05-21 devnull {0x0bb4/*ழ*/, 0xe2f1/**/},
68 8d713330 2006-05-21 devnull {0x0bb5/*வ*/, 0xe2e1/**/},
69 8d713330 2006-05-21 devnull {0x0bb6/*ஶ*/, 0xe341/**/},
70 8d713330 2006-05-21 devnull {0x0bb7/*ஷ*/, 0xe351/**/},
71 8d713330 2006-05-21 devnull {0x0bb8/*ஸ*/, 0xe361/**/},
72 8d713330 2006-05-21 devnull {0x0bb9/*ஹ*/, 0xe371/**/}
73 8d713330 2006-05-21 devnull };
74 8d713330 2006-05-21 devnull
75 8d713330 2006-05-21 devnull static Rune
76 8d713330 2006-05-21 devnull findbytune(Tmap *tab, int size, Rune t)
77 8d713330 2006-05-21 devnull {
78 8d713330 2006-05-21 devnull int i;
79 8d713330 2006-05-21 devnull
80 8d713330 2006-05-21 devnull for(i = 0; i < size; i++)
81 8d713330 2006-05-21 devnull if(tab[i].t == t)
82 8d713330 2006-05-21 devnull return tab[i].u;
83 8d713330 2006-05-21 devnull return Runeerror;
84 8d713330 2006-05-21 devnull }
85 8d713330 2006-05-21 devnull
86 8d713330 2006-05-21 devnull static Rune
87 8d713330 2006-05-21 devnull findbyuni(Tmap *tab, int size, Rune u)
88 8d713330 2006-05-21 devnull {
89 8d713330 2006-05-21 devnull int i;
90 8d713330 2006-05-21 devnull
91 8d713330 2006-05-21 devnull for(i = 0; i < size; i++)
92 8d713330 2006-05-21 devnull if(tab[i].u == u)
93 8d713330 2006-05-21 devnull return tab[i].t;
94 8d713330 2006-05-21 devnull return Runeerror;
95 8d713330 2006-05-21 devnull }
96 8d713330 2006-05-21 devnull
97 8d713330 2006-05-21 devnull static int
98 8d713330 2006-05-21 devnull findindex(Rune *rstr, int size, Rune r)
99 8d713330 2006-05-21 devnull {
100 8d713330 2006-05-21 devnull int i;
101 8d713330 2006-05-21 devnull
102 8d713330 2006-05-21 devnull for(i = 0; i < size; i++)
103 8d713330 2006-05-21 devnull if(rstr[i] == r)
104 8d713330 2006-05-21 devnull return i;
105 8d713330 2006-05-21 devnull return -1;
106 8d713330 2006-05-21 devnull }
107 8d713330 2006-05-21 devnull
108 8d713330 2006-05-21 devnull void
109 8d713330 2006-05-21 devnull tune_in(int fd, long *x, struct convert *out)
110 8d713330 2006-05-21 devnull {
111 8d713330 2006-05-21 devnull Biobuf b;
112 8d713330 2006-05-21 devnull Rune rbuf[N];
113 8d713330 2006-05-21 devnull Rune *r, *er, tr;
114 8d713330 2006-05-21 devnull int c, i;
115 8d713330 2006-05-21 devnull
116 8d713330 2006-05-21 devnull USED(x);
117 8d713330 2006-05-21 devnull r = rbuf;
118 8d713330 2006-05-21 devnull er = rbuf+N-3;
119 8d713330 2006-05-21 devnull Binit(&b, fd, OREAD);
120 8d713330 2006-05-21 devnull while((c = Bgetrune(&b)) != Beof){
121 8d713330 2006-05-21 devnull ninput += b.runesize;
122 8d713330 2006-05-21 devnull if(r >= er){
123 8d713330 2006-05-21 devnull OUT(out, rbuf, r-rbuf);
124 8d713330 2006-05-21 devnull r = rbuf;
125 8d713330 2006-05-21 devnull }
126 8d713330 2006-05-21 devnull if(c>=0xe210/**/ && c <= 0xe38c/**/ && (i = c%16) < nelem(t2)){
127 8d713330 2006-05-21 devnull if(c >= 0xe380/**/){
128 8d713330 2006-05-21 devnull *r++ = 0x0b95/*க*/;
129 8d713330 2006-05-21 devnull *r++ = 0x0bcd/*்*/;
130 8d713330 2006-05-21 devnull *r++ = 0x0bb7/*ஷ*/;
131 8d713330 2006-05-21 devnull }else
132 8d713330 2006-05-21 devnull *r++ = findbytune(t3, nelem(t3), c-i+1);
133 8d713330 2006-05-21 devnull if(i != 1)
134 8d713330 2006-05-21 devnull *r++ = t2[i];
135 8d713330 2006-05-21 devnull }else if((tr = findbytune(t1, nelem(t1), c)) != Runeerror)
136 8d713330 2006-05-21 devnull *r++ = tr;
137 8d713330 2006-05-21 devnull else switch(c){
138 8d713330 2006-05-21 devnull case 0xe3d0/**/:
139 8d713330 2006-05-21 devnull *r++ = 0x0ba3/*ண*/; *r++ = 0x0bbe/*ா*/;
140 8d713330 2006-05-21 devnull break;
141 8d713330 2006-05-21 devnull case 0xe3d1/**/:
142 8d713330 2006-05-21 devnull *r++ = 0x0bb1/*ற*/; *r++ = 0x0bbe/*ா*/;
143 8d713330 2006-05-21 devnull break;
144 8d713330 2006-05-21 devnull case 0xe3d2/**/:
145 8d713330 2006-05-21 devnull *r++ = 0x0ba9/*ன*/; *r++ = 0x0bbe/*ா*/;
146 8d713330 2006-05-21 devnull break;
147 8d713330 2006-05-21 devnull case 0xe3d4/**/:
148 8d713330 2006-05-21 devnull *r++ = 0x0ba3/*ண*/; *r++ = 0x0bc8/*ை*/;
149 8d713330 2006-05-21 devnull break;
150 8d713330 2006-05-21 devnull case 0xe3d5/**/:
151 8d713330 2006-05-21 devnull *r++ = 0x0bb2/*ல*/; *r++ = 0x0bc8/*ை*/;
152 8d713330 2006-05-21 devnull break;
153 8d713330 2006-05-21 devnull case 0xe3d6/**/:
154 8d713330 2006-05-21 devnull *r++ = 0x0bb3/*ள*/; *r++ = 0x0bc8/*ை*/;
155 8d713330 2006-05-21 devnull break;
156 8d713330 2006-05-21 devnull case 0xe3d7/**/:
157 8d713330 2006-05-21 devnull *r++ = 0x0ba9/*ன*/; *r++ = 0x0bc8/*ை*/;
158 8d713330 2006-05-21 devnull break;
159 8d713330 2006-05-21 devnull case 0xe38d/**/:
160 8d713330 2006-05-21 devnull *r++ = 0x0bb6/*ஶ*/; *r++ = 0x0bcd/*்*/; *r++ = 0x0bb0/*ர*/; *r++ = 0x0bc0/*ீ*/;
161 8d713330 2006-05-21 devnull break;
162 8d713330 2006-05-21 devnull default:
163 8d713330 2006-05-21 devnull if(c >= 0xe200 && c <= 0xe3ff){
164 8d713330 2006-05-21 devnull if(squawk)
165 8d713330 2006-05-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, c);
166 8d713330 2006-05-21 devnull nerrors++;
167 8d713330 2006-05-21 devnull if(clean)
168 8d713330 2006-05-21 devnull break;
169 8d713330 2006-05-21 devnull c = BADMAP;
170 8d713330 2006-05-21 devnull }
171 8d713330 2006-05-21 devnull *r++ = c;
172 8d713330 2006-05-21 devnull break;
173 8d713330 2006-05-21 devnull }
174 8d713330 2006-05-21 devnull }
175 8d713330 2006-05-21 devnull if(r > rbuf)
176 8d713330 2006-05-21 devnull OUT(out, rbuf, r-rbuf);
177 8d713330 2006-05-21 devnull OUT(out, rbuf, 0);
178 8d713330 2006-05-21 devnull }
179 8d713330 2006-05-21 devnull
180 8d713330 2006-05-21 devnull void
181 8d713330 2006-05-21 devnull tune_out(Rune *r, int n, long *x)
182 8d713330 2006-05-21 devnull {
183 8d713330 2006-05-21 devnull static int state = 0;
184 8d713330 2006-05-21 devnull static Rune lastr;
185 8d713330 2006-05-21 devnull Rune *er, tr, rr;
186 8d713330 2006-05-21 devnull char *p;
187 8d713330 2006-05-21 devnull int i;
188 8d713330 2006-05-21 devnull
189 8d713330 2006-05-21 devnull USED(x);
190 8d713330 2006-05-21 devnull nrunes += n;
191 8d713330 2006-05-21 devnull er = r+n;
192 8d713330 2006-05-21 devnull for(p = obuf; r < er; r++){
193 8d713330 2006-05-21 devnull switch(state){
194 8d713330 2006-05-21 devnull case 0:
195 8d713330 2006-05-21 devnull case0:
196 8d713330 2006-05-21 devnull if((tr = findbyuni(t3, nelem(t3), *r)) != Runeerror){
197 8d713330 2006-05-21 devnull lastr = tr;
198 8d713330 2006-05-21 devnull state = 1;
199 8d713330 2006-05-21 devnull }else if(*r == 0x0b92/*ஒ*/){
200 8d713330 2006-05-21 devnull lastr = 0xe20a/**/;
201 8d713330 2006-05-21 devnull state = 3;
202 8d713330 2006-05-21 devnull }else if((tr = findbyuni(t1, nelem(t1), *r)) != Runeerror)
203 8d713330 2006-05-21 devnull p += runetochar(p, &tr);
204 8d713330 2006-05-21 devnull else
205 8d713330 2006-05-21 devnull p += runetochar(p, r);
206 8d713330 2006-05-21 devnull break;
207 8d713330 2006-05-21 devnull case 1:
208 8d713330 2006-05-21 devnull case1:
209 8d713330 2006-05-21 devnull if((i = findindex(t2, nelem(t2), *r)) != -1){
210 8d713330 2006-05-21 devnull if(lastr && lastr != Runeerror)
211 8d713330 2006-05-21 devnull lastr += i-1;
212 8d713330 2006-05-21 devnull if(*r ==0x0bc6/*ெ*/)
213 8d713330 2006-05-21 devnull state = 5;
214 8d713330 2006-05-21 devnull else if(*r ==0x0bc7/*ே*/)
215 8d713330 2006-05-21 devnull state = 4;
216 8d713330 2006-05-21 devnull else if(lastr == 0xe210/**/)
217 8d713330 2006-05-21 devnull state = 2;
218 8d713330 2006-05-21 devnull else if(lastr == 0xe340/**/)
219 8d713330 2006-05-21 devnull state = 6;
220 8d713330 2006-05-21 devnull else{
221 8d713330 2006-05-21 devnull if(lastr)
222 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
223 8d713330 2006-05-21 devnull state = 0;
224 8d713330 2006-05-21 devnull }
225 8d713330 2006-05-21 devnull }else if(lastr && lastr != Runeerror && (*r == 0x00b2/*²*/ || *r == 0x00b3/*³*/ || *r == 0x2074/*⁴*/)){
226 8d713330 2006-05-21 devnull if(squawk)
227 8d713330 2006-05-21 devnull EPR "%s: character <U+%.4X, U+%.4X> not in output cs\n", argv0, lastr, *r);
228 8d713330 2006-05-21 devnull lastr = clean ? 0 : Runeerror;
229 8d713330 2006-05-21 devnull nerrors++;
230 8d713330 2006-05-21 devnull }else{
231 8d713330 2006-05-21 devnull if(lastr)
232 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
233 8d713330 2006-05-21 devnull state = 0;
234 8d713330 2006-05-21 devnull goto case0;
235 8d713330 2006-05-21 devnull }
236 8d713330 2006-05-21 devnull break;
237 8d713330 2006-05-21 devnull case 2:
238 8d713330 2006-05-21 devnull if(*r == 0x0bb7/*ஷ*/){
239 8d713330 2006-05-21 devnull lastr = 0xe381/**/;
240 8d713330 2006-05-21 devnull state = 1;
241 8d713330 2006-05-21 devnull break;
242 8d713330 2006-05-21 devnull }
243 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
244 8d713330 2006-05-21 devnull state = 0;
245 8d713330 2006-05-21 devnull goto case0;
246 8d713330 2006-05-21 devnull case 3:
247 8d713330 2006-05-21 devnull state = 0;
248 8d713330 2006-05-21 devnull if(*r == 0x0bd7/*ௗ*/){
249 8d713330 2006-05-21 devnull rr = 0xe20c/**/;
250 8d713330 2006-05-21 devnull p += runetochar(p, &rr);
251 8d713330 2006-05-21 devnull break;
252 8d713330 2006-05-21 devnull }
253 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
254 8d713330 2006-05-21 devnull goto case0;
255 8d713330 2006-05-21 devnull case 4:
256 8d713330 2006-05-21 devnull state = 0;
257 8d713330 2006-05-21 devnull if(*r == 0x0bbe/*ா*/){
258 8d713330 2006-05-21 devnull if(lastr){
259 8d713330 2006-05-21 devnull if(lastr != Runeerror)
260 8d713330 2006-05-21 devnull lastr += 3;
261 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
262 8d713330 2006-05-21 devnull }
263 8d713330 2006-05-21 devnull break;
264 8d713330 2006-05-21 devnull }
265 8d713330 2006-05-21 devnull if(lastr)
266 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
267 8d713330 2006-05-21 devnull goto case0;
268 8d713330 2006-05-21 devnull case 5:
269 8d713330 2006-05-21 devnull state = 0;
270 8d713330 2006-05-21 devnull if(*r == 0x0bbe/*ா*/ || *r == 0x0bd7/*ௗ*/){
271 8d713330 2006-05-21 devnull if(lastr){
272 8d713330 2006-05-21 devnull if(lastr != Runeerror)
273 8d713330 2006-05-21 devnull lastr += *r == 0x0bbe/*ா*/ ? 3 : 5;
274 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
275 8d713330 2006-05-21 devnull }
276 8d713330 2006-05-21 devnull break;
277 8d713330 2006-05-21 devnull }
278 8d713330 2006-05-21 devnull if(lastr)
279 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
280 8d713330 2006-05-21 devnull goto case0;
281 8d713330 2006-05-21 devnull case 6:
282 8d713330 2006-05-21 devnull if(*r == 0x0bb0/*ர*/){
283 8d713330 2006-05-21 devnull state = 7;
284 8d713330 2006-05-21 devnull break;
285 8d713330 2006-05-21 devnull }
286 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
287 8d713330 2006-05-21 devnull state = 0;
288 8d713330 2006-05-21 devnull goto case0;
289 8d713330 2006-05-21 devnull case 7:
290 8d713330 2006-05-21 devnull if(*r == 0x0bc0/*ீ*/){
291 8d713330 2006-05-21 devnull rr = 0xe38d/**/;
292 8d713330 2006-05-21 devnull p += runetochar(p, &rr);
293 8d713330 2006-05-21 devnull state = 0;
294 8d713330 2006-05-21 devnull break;
295 8d713330 2006-05-21 devnull }
296 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
297 8d713330 2006-05-21 devnull lastr = 0xe2c1/**/;
298 8d713330 2006-05-21 devnull state = 1;
299 8d713330 2006-05-21 devnull goto case1;
300 8d713330 2006-05-21 devnull }
301 8d713330 2006-05-21 devnull }
302 8d713330 2006-05-21 devnull if(n == 0 && state != 0){
303 8d713330 2006-05-21 devnull if(lastr)
304 8d713330 2006-05-21 devnull p += runetochar(p, &lastr);
305 8d713330 2006-05-21 devnull state = 0;
306 8d713330 2006-05-21 devnull }
307 8d713330 2006-05-21 devnull noutput += p-obuf;
308 8d713330 2006-05-21 devnull write(1, obuf, p-obuf);
309 8d713330 2006-05-21 devnull }