1 a31db67d 2004-04-21 devnull #ifdef PLAN9
2 a31db67d 2004-04-21 devnull #include <u.h>
3 a31db67d 2004-04-21 devnull #include <libc.h>
4 a31db67d 2004-04-21 devnull #include <bio.h>
6 a31db67d 2004-04-21 devnull #include <stdio.h>
7 a31db67d 2004-04-21 devnull #include <unistd.h>
8 a31db67d 2004-04-21 devnull #include "plan9.h"
10 a31db67d 2004-04-21 devnull #include "hdr.h"
11 a31db67d 2004-04-21 devnull #include "conv.h"
12 a31db67d 2004-04-21 devnull #include "kuten208.h"
13 a31db67d 2004-04-21 devnull #include "jis.h"
16 a31db67d 2004-04-21 devnull a state machine for interpreting all sorts of encodings
18 a31db67d 2004-04-21 devnull static void
19 a31db67d 2004-04-21 devnull alljis(int c, Rune **r, long input_loc)
21 a31db67d 2004-04-21 devnull static enum { state0, state1, state2, state3, state4 } state = state0;
22 a31db67d 2004-04-21 devnull static int set8 = 0;
23 a31db67d 2004-04-21 devnull static int japan646 = 0;
24 a31db67d 2004-04-21 devnull static int lastc;
29 a31db67d 2004-04-21 devnull switch(state)
31 a31db67d 2004-04-21 devnull case state0: /* idle state */
32 a31db67d 2004-04-21 devnull if(c == ESC){ state = state1; return; }
33 a31db67d 2004-04-21 devnull if(c < 0) return;
34 a31db67d 2004-04-21 devnull if(!set8 && (c < 128)){
35 a31db67d 2004-04-21 devnull if(japan646){
36 a31db67d 2004-04-21 devnull switch(c)
38 a31db67d 2004-04-21 devnull case '\\': emit(0xA5); return; /* yen */
39 a31db67d 2004-04-21 devnull case '~': emit(0xAF); return; /* spacing macron */
40 a31db67d 2004-04-21 devnull default: emit(c); return;
47 a31db67d 2004-04-21 devnull if(c < 0x21){ /* guard against bogus characters in JIS mode */
48 a31db67d 2004-04-21 devnull if(squawk)
49 a31db67d 2004-04-21 devnull EPR "%s: non-JIS character %02x in %s near byte %ld\n", argv0, c, file, input_loc);
53 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
55 a31db67d 2004-04-21 devnull case state1: /* seen an escape */
56 a31db67d 2004-04-21 devnull if(c == '$'){ state = state2; return; }
57 a31db67d 2004-04-21 devnull if(c == '('){ state = state3; return; }
58 a31db67d 2004-04-21 devnull emit(ESC); state = state0; goto again;
60 a31db67d 2004-04-21 devnull case state2: /* may be shifting into JIS */
61 a31db67d 2004-04-21 devnull if((c == '@') || (c == 'B')){
62 a31db67d 2004-04-21 devnull set8 = 1; state = state0; return;
64 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
66 a31db67d 2004-04-21 devnull case state3: /* may be shifting out of JIS */
67 a31db67d 2004-04-21 devnull if((c == 'J') || (c == 'H') || (c == 'B')){
68 a31db67d 2004-04-21 devnull japan646 = (c == 'J');
69 a31db67d 2004-04-21 devnull set8 = 0; state = state0; return;
71 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
73 a31db67d 2004-04-21 devnull case state4: /* two part char */
74 a31db67d 2004-04-21 devnull if(c < 0){
75 a31db67d 2004-04-21 devnull if(squawk)
76 a31db67d 2004-04-21 devnull EPR "%s: unexpected EOF in %s\n", argv0, file);
77 a31db67d 2004-04-21 devnull c = 0x21 | (lastc&0x80);
79 a31db67d 2004-04-21 devnull if(CANS2J(lastc, c)){ /* ms dos sjis */
80 a31db67d 2004-04-21 devnull int hi = lastc, lo = c;
81 a31db67d 2004-04-21 devnull S2J(hi, lo); /* convert to 208 */
82 a31db67d 2004-04-21 devnull n = hi*100 + lo - 3232; /* convert to kuten208 */
84 a31db67d 2004-04-21 devnull n = (lastc&0x7F)*100 + (c&0x7f) - 3232; /* kuten208 */
85 a31db67d 2004-04-21 devnull if((n >= KUTEN208MAX) || ((l = tabkuten208[n]) == -1)){
86 a31db67d 2004-04-21 devnull nerrors++;
87 a31db67d 2004-04-21 devnull if(squawk)
88 a31db67d 2004-04-21 devnull EPR "%s: unknown kuten208 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
89 a31db67d 2004-04-21 devnull if(!clean)
90 a31db67d 2004-04-21 devnull emit(BADMAP);
92 a31db67d 2004-04-21 devnull if(l < 0){
94 a31db67d 2004-04-21 devnull if(squawk)
95 a31db67d 2004-04-21 devnull EPR "%s: ambiguous kuten208 %d (mapped to 0x%lx) near byte %ld in %s\n", argv0, n, l, input_loc, file);
99 a31db67d 2004-04-21 devnull state = state0;
104 a31db67d 2004-04-21 devnull a state machine for interpreting ms-kanji == shift-jis.
106 a31db67d 2004-04-21 devnull static void
107 a31db67d 2004-04-21 devnull ms(int c, Rune **r, long input_loc)
109 a31db67d 2004-04-21 devnull static enum { state0, state1, state2, state3, state4 } state = state0;
110 a31db67d 2004-04-21 devnull static int set8 = 0;
111 a31db67d 2004-04-21 devnull static int japan646 = 0;
112 a31db67d 2004-04-21 devnull static int lastc;
117 a31db67d 2004-04-21 devnull switch(state)
119 a31db67d 2004-04-21 devnull case state0: /* idle state */
120 a31db67d 2004-04-21 devnull if(c == ESC){ state = state1; return; }
121 a31db67d 2004-04-21 devnull if(c < 0) return;
122 a31db67d 2004-04-21 devnull if(!set8 && (c < 128)){
123 a31db67d 2004-04-21 devnull if(japan646){
124 a31db67d 2004-04-21 devnull switch(c)
126 a31db67d 2004-04-21 devnull case '\\': emit(0xA5); return; /* yen */
127 a31db67d 2004-04-21 devnull case '~': emit(0xAF); return; /* spacing macron */
128 a31db67d 2004-04-21 devnull default: emit(c); return;
130 a31db67d 2004-04-21 devnull } else {
131 a31db67d 2004-04-21 devnull emit(c);
135 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
137 a31db67d 2004-04-21 devnull case state1: /* seen an escape */
138 a31db67d 2004-04-21 devnull if(c == '$'){ state = state2; return; }
139 a31db67d 2004-04-21 devnull if(c == '('){ state = state3; return; }
140 a31db67d 2004-04-21 devnull emit(ESC); state = state0; goto again;
142 a31db67d 2004-04-21 devnull case state2: /* may be shifting into JIS */
143 a31db67d 2004-04-21 devnull if((c == '@') || (c == 'B')){
144 a31db67d 2004-04-21 devnull set8 = 1; state = state0; return;
146 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
148 a31db67d 2004-04-21 devnull case state3: /* may be shifting out of JIS */
149 a31db67d 2004-04-21 devnull if((c == 'J') || (c == 'H') || (c == 'B')){
150 a31db67d 2004-04-21 devnull japan646 = (c == 'J');
151 a31db67d 2004-04-21 devnull set8 = 0; state = state0; return;
153 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
155 a31db67d 2004-04-21 devnull case state4: /* two part char */
156 a31db67d 2004-04-21 devnull if(c < 0){
157 a31db67d 2004-04-21 devnull if(squawk)
158 a31db67d 2004-04-21 devnull EPR "%s: unexpected EOF in %s\n", argv0, file);
159 a31db67d 2004-04-21 devnull c = 0x21 | (lastc&0x80);
161 a31db67d 2004-04-21 devnull if(CANS2J(lastc, c)){ /* ms dos sjis */
162 a31db67d 2004-04-21 devnull int hi = lastc, lo = c;
163 a31db67d 2004-04-21 devnull S2J(hi, lo); /* convert to 208 */
164 a31db67d 2004-04-21 devnull n = hi*100 + lo - 3232; /* convert to kuten208 */
165 a31db67d 2004-04-21 devnull } else {
166 a31db67d 2004-04-21 devnull nerrors++;
167 a31db67d 2004-04-21 devnull if(squawk)
168 a31db67d 2004-04-21 devnull EPR "%s: illegal byte pair (0x%x,0x%x) near byte %ld in %s\n", argv0, lastc, c, input_loc, file);
169 a31db67d 2004-04-21 devnull if(!clean)
170 a31db67d 2004-04-21 devnull emit(BADMAP);
171 a31db67d 2004-04-21 devnull state = state0;
172 a31db67d 2004-04-21 devnull goto again;
174 a31db67d 2004-04-21 devnull if((n >= KUTEN208MAX) || ((l = tabkuten208[n]) == -1)){
175 a31db67d 2004-04-21 devnull nerrors++;
176 a31db67d 2004-04-21 devnull if(squawk)
177 a31db67d 2004-04-21 devnull EPR "%s: unknown kuten208 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
178 a31db67d 2004-04-21 devnull if(!clean)
179 a31db67d 2004-04-21 devnull emit(BADMAP);
180 a31db67d 2004-04-21 devnull } else {
181 a31db67d 2004-04-21 devnull if(l < 0){
183 a31db67d 2004-04-21 devnull if(squawk)
184 a31db67d 2004-04-21 devnull EPR "%s: ambiguous kuten208 %d (mapped to 0x%lx) near byte %ld in %s\n", argv0, n, l, input_loc, file);
186 a31db67d 2004-04-21 devnull emit(l);
188 a31db67d 2004-04-21 devnull state = state0;
193 a31db67d 2004-04-21 devnull a state machine for interpreting ujis == EUC
195 a31db67d 2004-04-21 devnull static void
196 a31db67d 2004-04-21 devnull ujis(int c, Rune **r, long input_loc)
198 a31db67d 2004-04-21 devnull static enum { state0, state1 } state = state0;
199 a31db67d 2004-04-21 devnull static int lastc;
203 a31db67d 2004-04-21 devnull switch(state)
205 a31db67d 2004-04-21 devnull case state0: /* idle state */
206 a31db67d 2004-04-21 devnull if(c < 0) return;
207 a31db67d 2004-04-21 devnull if(c < 128){
208 a31db67d 2004-04-21 devnull emit(c);
211 a31db67d 2004-04-21 devnull if(c == 0x8e){ /* codeset 2 */
212 a31db67d 2004-04-21 devnull nerrors++;
213 a31db67d 2004-04-21 devnull if(squawk)
214 a31db67d 2004-04-21 devnull EPR "%s: unknown codeset 2 near byte %ld in %s\n", argv0, input_loc, file);
215 a31db67d 2004-04-21 devnull if(!clean)
216 a31db67d 2004-04-21 devnull emit(BADMAP);
219 a31db67d 2004-04-21 devnull if(c == 0x8f){ /* codeset 3 */
220 a31db67d 2004-04-21 devnull nerrors++;
221 a31db67d 2004-04-21 devnull if(squawk)
222 a31db67d 2004-04-21 devnull EPR "%s: unknown codeset 3 near byte %ld in %s\n", argv0, input_loc, file);
223 a31db67d 2004-04-21 devnull if(!clean)
224 a31db67d 2004-04-21 devnull emit(BADMAP);
227 a31db67d 2004-04-21 devnull lastc = c;
228 a31db67d 2004-04-21 devnull state = state1;
231 a31db67d 2004-04-21 devnull case state1: /* two part char */
232 a31db67d 2004-04-21 devnull if(c < 0){
233 a31db67d 2004-04-21 devnull if(squawk)
234 a31db67d 2004-04-21 devnull EPR "%s: unexpected EOF in %s\n", argv0, file);
235 a31db67d 2004-04-21 devnull c = 0xA1;
237 a31db67d 2004-04-21 devnull n = (lastc&0x7F)*100 + (c&0x7F) - 3232; /* kuten208 */
238 a31db67d 2004-04-21 devnull if((n >= KUTEN208MAX) || ((l = tabkuten208[n]) == -1)){
239 a31db67d 2004-04-21 devnull nerrors++;
240 a31db67d 2004-04-21 devnull if(squawk)
241 a31db67d 2004-04-21 devnull EPR "%s: unknown kuten208 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
242 a31db67d 2004-04-21 devnull if(!clean)
243 a31db67d 2004-04-21 devnull emit(BADMAP);
244 a31db67d 2004-04-21 devnull } else {
245 a31db67d 2004-04-21 devnull if(l < 0){
247 a31db67d 2004-04-21 devnull if(squawk)
248 a31db67d 2004-04-21 devnull EPR "%s: ambiguous kuten208 %d (mapped to 0x%lx) near byte %ld in %s\n", argv0, n, l, input_loc, file);
250 a31db67d 2004-04-21 devnull emit(l);
252 a31db67d 2004-04-21 devnull state = state0;
257 a31db67d 2004-04-21 devnull a state machine for interpreting jis-kanji == 2022-JP
259 a31db67d 2004-04-21 devnull static void
260 a31db67d 2004-04-21 devnull jis(int c, Rune **r, long input_loc)
262 a31db67d 2004-04-21 devnull static enum { state0, state1, state2, state3, state4 } state = state0;
263 a31db67d 2004-04-21 devnull static int set8 = 0;
264 a31db67d 2004-04-21 devnull static int japan646 = 0;
265 a31db67d 2004-04-21 devnull static int lastc;
270 a31db67d 2004-04-21 devnull switch(state)
272 a31db67d 2004-04-21 devnull case state0: /* idle state */
273 a31db67d 2004-04-21 devnull if(c == ESC){ state = state1; return; }
274 a31db67d 2004-04-21 devnull if(c < 0) return;
275 a31db67d 2004-04-21 devnull if(!set8 && (c < 128)){
276 a31db67d 2004-04-21 devnull if(japan646){
277 a31db67d 2004-04-21 devnull switch(c)
279 a31db67d 2004-04-21 devnull case '\\': emit(0xA5); return; /* yen */
280 a31db67d 2004-04-21 devnull case '~': emit(0xAF); return; /* spacing macron */
281 a31db67d 2004-04-21 devnull default: emit(c); return;
283 a31db67d 2004-04-21 devnull } else {
284 a31db67d 2004-04-21 devnull emit(c);
288 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
290 a31db67d 2004-04-21 devnull case state1: /* seen an escape */
291 a31db67d 2004-04-21 devnull if(c == '$'){ state = state2; return; }
292 a31db67d 2004-04-21 devnull if(c == '('){ state = state3; return; }
293 a31db67d 2004-04-21 devnull emit(ESC); state = state0; goto again;
295 a31db67d 2004-04-21 devnull case state2: /* may be shifting into JIS */
296 a31db67d 2004-04-21 devnull if((c == '@') || (c == 'B')){
297 a31db67d 2004-04-21 devnull set8 = 1; state = state0; return;
299 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
301 a31db67d 2004-04-21 devnull case state3: /* may be shifting out of JIS */
302 a31db67d 2004-04-21 devnull if((c == 'J') || (c == 'H') || (c == 'B')){
303 a31db67d 2004-04-21 devnull japan646 = (c == 'J');
304 a31db67d 2004-04-21 devnull set8 = 0; state = state0; return;
306 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
308 a31db67d 2004-04-21 devnull case state4: /* two part char */
309 a31db67d 2004-04-21 devnull if(c < 0){
310 a31db67d 2004-04-21 devnull if(squawk)
311 a31db67d 2004-04-21 devnull EPR "%s: unexpected EOF in %s\n", argv0, file);
312 a31db67d 2004-04-21 devnull c = 0x21 | (lastc&0x80);
314 a31db67d 2004-04-21 devnull if((lastc&0x80) != (c&0x80)){ /* guard against latin1 in jis */
315 a31db67d 2004-04-21 devnull emit(lastc);
316 a31db67d 2004-04-21 devnull state = state0;
317 a31db67d 2004-04-21 devnull goto again;
319 a31db67d 2004-04-21 devnull n = (lastc&0x7F)*100 + (c&0x7f) - 3232; /* kuten208 */
320 a31db67d 2004-04-21 devnull if((n >= KUTEN208MAX) || ((l = tabkuten208[n]) == -1)){
321 a31db67d 2004-04-21 devnull nerrors++;
322 a31db67d 2004-04-21 devnull if(squawk)
323 a31db67d 2004-04-21 devnull EPR "%s: unknown kuten208 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
324 a31db67d 2004-04-21 devnull if(!clean)
325 a31db67d 2004-04-21 devnull emit(BADMAP);
326 a31db67d 2004-04-21 devnull } else {
327 a31db67d 2004-04-21 devnull if(l < 0){
329 a31db67d 2004-04-21 devnull if(squawk)
330 a31db67d 2004-04-21 devnull EPR "%s: ambiguous kuten208 %d (mapped to 0x%lx) near byte %ld in %s\n", argv0, n, l, input_loc, file);
332 a31db67d 2004-04-21 devnull emit(l);
334 a31db67d 2004-04-21 devnull state = state0;
338 a31db67d 2004-04-21 devnull static void
339 a31db67d 2004-04-21 devnull do_in(int fd, void (*procfn)(int, Rune **, long), struct convert *out)
341 a31db67d 2004-04-21 devnull Rune ob[N];
342 a31db67d 2004-04-21 devnull Rune *r, *re;
343 a31db67d 2004-04-21 devnull uchar ibuf[N];
344 a31db67d 2004-04-21 devnull int n, i;
345 a31db67d 2004-04-21 devnull long nin;
348 a31db67d 2004-04-21 devnull re = ob+N-3;
349 a31db67d 2004-04-21 devnull nin = 0;
350 a31db67d 2004-04-21 devnull while((n = read(fd, ibuf, sizeof ibuf)) > 0){
351 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
352 a31db67d 2004-04-21 devnull (*procfn)(ibuf[i], &r, nin++);
353 a31db67d 2004-04-21 devnull if(r >= re){
354 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
358 a31db67d 2004-04-21 devnull if(r > ob){
359 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
363 a31db67d 2004-04-21 devnull (*procfn)(-1, &r, nin);
364 a31db67d 2004-04-21 devnull if(r > ob)
365 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
369 a31db67d 2004-04-21 devnull jis_in(int fd, long *notused, struct convert *out)
371 a31db67d 2004-04-21 devnull USED(notused);
372 a31db67d 2004-04-21 devnull do_in(fd, alljis, out);
376 a31db67d 2004-04-21 devnull ujis_in(int fd, long *notused, struct convert *out)
378 a31db67d 2004-04-21 devnull USED(notused);
379 a31db67d 2004-04-21 devnull do_in(fd, ujis, out);
383 a31db67d 2004-04-21 devnull msjis_in(int fd, long *notused, struct convert *out)
385 a31db67d 2004-04-21 devnull USED(notused);
386 a31db67d 2004-04-21 devnull do_in(fd, ms, out);
390 a31db67d 2004-04-21 devnull jisjis_in(int fd, long *notused, struct convert *out)
392 a31db67d 2004-04-21 devnull USED(notused);
393 a31db67d 2004-04-21 devnull do_in(fd, jis, out);
396 a31db67d 2004-04-21 devnull static int first = 1;
398 a31db67d 2004-04-21 devnull static void
399 a31db67d 2004-04-21 devnull tab_init(void)
404 a31db67d 2004-04-21 devnull first = 0;
405 a31db67d 2004-04-21 devnull for(i = 0; i < NRUNE; i++)
406 a31db67d 2004-04-21 devnull tab[i] = -1;
407 a31db67d 2004-04-21 devnull for(i = 0; i < KUTEN208MAX; i++)
408 a31db67d 2004-04-21 devnull if((l = tabkuten208[i]) != -1){
409 a31db67d 2004-04-21 devnull if(l < 0)
410 a31db67d 2004-04-21 devnull tab[-l] = i;
412 a31db67d 2004-04-21 devnull tab[l] = i;
417 a31db67d 2004-04-21 devnull /* jis-kanji, or ISO 2022-JP */
419 a31db67d 2004-04-21 devnull jisjis_out(Rune *base, int n, long *notused)
421 a31db67d 2004-04-21 devnull char *p;
424 a31db67d 2004-04-21 devnull static enum { ascii, japan646, jp2022 } state = ascii;
426 a31db67d 2004-04-21 devnull USED(notused);
427 a31db67d 2004-04-21 devnull if(first)
428 a31db67d 2004-04-21 devnull tab_init();
429 a31db67d 2004-04-21 devnull nrunes += n;
430 a31db67d 2004-04-21 devnull p = obuf;
431 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
432 a31db67d 2004-04-21 devnull r = base[i];
433 a31db67d 2004-04-21 devnull if(r < 128){
434 a31db67d 2004-04-21 devnull if(state == jp2022){
435 a31db67d 2004-04-21 devnull *p++ = ESC; *p++ = '('; *p++ = 'B';
436 a31db67d 2004-04-21 devnull state = ascii;
438 a31db67d 2004-04-21 devnull *p++ = r;
439 a31db67d 2004-04-21 devnull } else {
440 a31db67d 2004-04-21 devnull if(tab[r] != -1){
441 a31db67d 2004-04-21 devnull if(state != jp2022){
442 a31db67d 2004-04-21 devnull *p++ = ESC; *p++ = '$'; *p++ = 'B';
443 a31db67d 2004-04-21 devnull state = jp2022;
445 a31db67d 2004-04-21 devnull *p++ = tab[r]/100 + ' ';
446 a31db67d 2004-04-21 devnull *p++ = tab[r]%100 + ' ';
447 a31db67d 2004-04-21 devnull continue;
449 a31db67d 2004-04-21 devnull if(squawk)
450 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, r);
451 a31db67d 2004-04-21 devnull nerrors++;
452 a31db67d 2004-04-21 devnull if(clean)
453 a31db67d 2004-04-21 devnull continue;
454 a31db67d 2004-04-21 devnull *p++ = BYTEBADMAP;
457 a31db67d 2004-04-21 devnull noutput += p-obuf;
458 a31db67d 2004-04-21 devnull if(p > obuf)
459 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);
462 a31db67d 2004-04-21 devnull /* ms-kanji, or Shift-JIS */
464 a31db67d 2004-04-21 devnull msjis_out(Rune *base, int n, long *notused)
466 a31db67d 2004-04-21 devnull char *p;
467 a31db67d 2004-04-21 devnull int i, hi, lo;
470 a31db67d 2004-04-21 devnull USED(notused);
471 a31db67d 2004-04-21 devnull if(first)
472 a31db67d 2004-04-21 devnull tab_init();
473 a31db67d 2004-04-21 devnull nrunes += n;
474 a31db67d 2004-04-21 devnull p = obuf;
475 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
476 a31db67d 2004-04-21 devnull r = base[i];
477 a31db67d 2004-04-21 devnull if(r < 128)
478 a31db67d 2004-04-21 devnull *p++ = r;
480 a31db67d 2004-04-21 devnull if(tab[r] != -1){
481 a31db67d 2004-04-21 devnull hi = tab[r]/100 + ' ';
482 a31db67d 2004-04-21 devnull lo = tab[r]%100 + ' ';
483 a31db67d 2004-04-21 devnull J2S(hi, lo);
484 a31db67d 2004-04-21 devnull *p++ = hi;
485 a31db67d 2004-04-21 devnull *p++ = lo;
486 a31db67d 2004-04-21 devnull continue;
488 a31db67d 2004-04-21 devnull if(squawk)
489 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, r);
490 a31db67d 2004-04-21 devnull nerrors++;
491 a31db67d 2004-04-21 devnull if(clean)
492 a31db67d 2004-04-21 devnull continue;
493 a31db67d 2004-04-21 devnull *p++ = BYTEBADMAP;
496 a31db67d 2004-04-21 devnull noutput += p-obuf;
497 a31db67d 2004-04-21 devnull if(p > obuf)
498 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);
501 a31db67d 2004-04-21 devnull /* ujis, or EUC */
503 a31db67d 2004-04-21 devnull ujis_out(Rune *base, int n, long *notused)
505 a31db67d 2004-04-21 devnull char *p;
509 a31db67d 2004-04-21 devnull USED(notused);
510 a31db67d 2004-04-21 devnull if(first)
511 a31db67d 2004-04-21 devnull tab_init();
512 a31db67d 2004-04-21 devnull nrunes += n;
513 a31db67d 2004-04-21 devnull p = obuf;
514 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
515 a31db67d 2004-04-21 devnull r = base[i];
516 a31db67d 2004-04-21 devnull if(r < 128)
517 a31db67d 2004-04-21 devnull *p++ = r;
519 a31db67d 2004-04-21 devnull if(tab[r] != -1){
520 a31db67d 2004-04-21 devnull *p++ = 0x80 | (tab[r]/100 + ' ');
521 a31db67d 2004-04-21 devnull *p++ = 0x80 | (tab[r]%100 + ' ');
522 a31db67d 2004-04-21 devnull continue;
524 a31db67d 2004-04-21 devnull if(squawk)
525 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, r);
526 a31db67d 2004-04-21 devnull nerrors++;
527 a31db67d 2004-04-21 devnull if(clean)
528 a31db67d 2004-04-21 devnull continue;
529 a31db67d 2004-04-21 devnull *p++ = BYTEBADMAP;
532 a31db67d 2004-04-21 devnull noutput += p-obuf;
533 a31db67d 2004-04-21 devnull if(p > obuf)
534 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);