Blame


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>
5 a31db67d 2004-04-21 devnull #else
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"
9 a31db67d 2004-04-21 devnull #endif
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"
14 a31db67d 2004-04-21 devnull
15 a31db67d 2004-04-21 devnull /*
16 a31db67d 2004-04-21 devnull a state machine for interpreting all sorts of encodings
17 a31db67d 2004-04-21 devnull */
18 a31db67d 2004-04-21 devnull static void
19 a31db67d 2004-04-21 devnull alljis(int c, Rune **r, long input_loc)
20 a31db67d 2004-04-21 devnull {
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;
25 a31db67d 2004-04-21 devnull int n;
26 a31db67d 2004-04-21 devnull long l;
27 a31db67d 2004-04-21 devnull
28 a31db67d 2004-04-21 devnull again:
29 a31db67d 2004-04-21 devnull switch(state)
30 a31db67d 2004-04-21 devnull {
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)
37 a31db67d 2004-04-21 devnull {
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;
41 a31db67d 2004-04-21 devnull }
42 a31db67d 2004-04-21 devnull } else {
43 a31db67d 2004-04-21 devnull emit(c);
44 a31db67d 2004-04-21 devnull return;
45 a31db67d 2004-04-21 devnull }
46 a31db67d 2004-04-21 devnull }
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);
50 a31db67d 2004-04-21 devnull emit(c);
51 a31db67d 2004-04-21 devnull return;
52 a31db67d 2004-04-21 devnull }
53 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
54 a31db67d 2004-04-21 devnull
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;
59 a31db67d 2004-04-21 devnull
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;
63 a31db67d 2004-04-21 devnull }
64 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
65 a31db67d 2004-04-21 devnull
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;
70 a31db67d 2004-04-21 devnull }
71 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
72 a31db67d 2004-04-21 devnull
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);
78 a31db67d 2004-04-21 devnull }
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 */
83 a31db67d 2004-04-21 devnull } else
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);
91 a31db67d 2004-04-21 devnull } else {
92 a31db67d 2004-04-21 devnull if(l < 0){
93 a31db67d 2004-04-21 devnull l = -l;
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);
96 a31db67d 2004-04-21 devnull }
97 a31db67d 2004-04-21 devnull emit(l);
98 a31db67d 2004-04-21 devnull }
99 a31db67d 2004-04-21 devnull state = state0;
100 a31db67d 2004-04-21 devnull }
101 a31db67d 2004-04-21 devnull }
102 a31db67d 2004-04-21 devnull
103 a31db67d 2004-04-21 devnull /*
104 a31db67d 2004-04-21 devnull a state machine for interpreting ms-kanji == shift-jis.
105 a31db67d 2004-04-21 devnull */
106 a31db67d 2004-04-21 devnull static void
107 a31db67d 2004-04-21 devnull ms(int c, Rune **r, long input_loc)
108 a31db67d 2004-04-21 devnull {
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;
113 a31db67d 2004-04-21 devnull int n;
114 a31db67d 2004-04-21 devnull long l;
115 a31db67d 2004-04-21 devnull
116 a31db67d 2004-04-21 devnull again:
117 a31db67d 2004-04-21 devnull switch(state)
118 a31db67d 2004-04-21 devnull {
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)
125 a31db67d 2004-04-21 devnull {
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;
129 a31db67d 2004-04-21 devnull }
130 a31db67d 2004-04-21 devnull } else {
131 a31db67d 2004-04-21 devnull emit(c);
132 a31db67d 2004-04-21 devnull return;
133 a31db67d 2004-04-21 devnull }
134 a31db67d 2004-04-21 devnull }
135 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
136 a31db67d 2004-04-21 devnull
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;
141 a31db67d 2004-04-21 devnull
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;
145 a31db67d 2004-04-21 devnull }
146 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
147 a31db67d 2004-04-21 devnull
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;
152 a31db67d 2004-04-21 devnull }
153 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
154 a31db67d 2004-04-21 devnull
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);
160 a31db67d 2004-04-21 devnull }
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;
173 a31db67d 2004-04-21 devnull }
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){
182 a31db67d 2004-04-21 devnull l = -l;
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);
185 a31db67d 2004-04-21 devnull }
186 a31db67d 2004-04-21 devnull emit(l);
187 a31db67d 2004-04-21 devnull }
188 a31db67d 2004-04-21 devnull state = state0;
189 a31db67d 2004-04-21 devnull }
190 a31db67d 2004-04-21 devnull }
191 a31db67d 2004-04-21 devnull
192 a31db67d 2004-04-21 devnull /*
193 a31db67d 2004-04-21 devnull a state machine for interpreting ujis == EUC
194 a31db67d 2004-04-21 devnull */
195 a31db67d 2004-04-21 devnull static void
196 a31db67d 2004-04-21 devnull ujis(int c, Rune **r, long input_loc)
197 a31db67d 2004-04-21 devnull {
198 a31db67d 2004-04-21 devnull static enum { state0, state1 } state = state0;
199 a31db67d 2004-04-21 devnull static int lastc;
200 a31db67d 2004-04-21 devnull int n;
201 a31db67d 2004-04-21 devnull long l;
202 a31db67d 2004-04-21 devnull
203 a31db67d 2004-04-21 devnull switch(state)
204 a31db67d 2004-04-21 devnull {
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);
209 a31db67d 2004-04-21 devnull return;
210 a31db67d 2004-04-21 devnull }
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);
217 a31db67d 2004-04-21 devnull return;
218 a31db67d 2004-04-21 devnull }
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);
225 a31db67d 2004-04-21 devnull return;
226 a31db67d 2004-04-21 devnull }
227 a31db67d 2004-04-21 devnull lastc = c;
228 a31db67d 2004-04-21 devnull state = state1;
229 a31db67d 2004-04-21 devnull return;
230 a31db67d 2004-04-21 devnull
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;
236 a31db67d 2004-04-21 devnull }
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){
246 a31db67d 2004-04-21 devnull l = -l;
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);
249 a31db67d 2004-04-21 devnull }
250 a31db67d 2004-04-21 devnull emit(l);
251 a31db67d 2004-04-21 devnull }
252 a31db67d 2004-04-21 devnull state = state0;
253 a31db67d 2004-04-21 devnull }
254 a31db67d 2004-04-21 devnull }
255 a31db67d 2004-04-21 devnull
256 a31db67d 2004-04-21 devnull /*
257 a31db67d 2004-04-21 devnull a state machine for interpreting jis-kanji == 2022-JP
258 a31db67d 2004-04-21 devnull */
259 a31db67d 2004-04-21 devnull static void
260 a31db67d 2004-04-21 devnull jis(int c, Rune **r, long input_loc)
261 a31db67d 2004-04-21 devnull {
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;
266 a31db67d 2004-04-21 devnull int n;
267 a31db67d 2004-04-21 devnull long l;
268 a31db67d 2004-04-21 devnull
269 a31db67d 2004-04-21 devnull again:
270 a31db67d 2004-04-21 devnull switch(state)
271 a31db67d 2004-04-21 devnull {
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)
278 a31db67d 2004-04-21 devnull {
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;
282 a31db67d 2004-04-21 devnull }
283 a31db67d 2004-04-21 devnull } else {
284 a31db67d 2004-04-21 devnull emit(c);
285 a31db67d 2004-04-21 devnull return;
286 a31db67d 2004-04-21 devnull }
287 a31db67d 2004-04-21 devnull }
288 a31db67d 2004-04-21 devnull lastc = c; state = state4; return;
289 a31db67d 2004-04-21 devnull
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;
294 a31db67d 2004-04-21 devnull
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;
298 a31db67d 2004-04-21 devnull }
299 a31db67d 2004-04-21 devnull emit(ESC); emit('$'); state = state0; goto again;
300 a31db67d 2004-04-21 devnull
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;
305 a31db67d 2004-04-21 devnull }
306 a31db67d 2004-04-21 devnull emit(ESC); emit('('); state = state0; goto again;
307 a31db67d 2004-04-21 devnull
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);
313 a31db67d 2004-04-21 devnull }
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;
318 a31db67d 2004-04-21 devnull }
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){
328 a31db67d 2004-04-21 devnull l = -l;
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);
331 a31db67d 2004-04-21 devnull }
332 a31db67d 2004-04-21 devnull emit(l);
333 a31db67d 2004-04-21 devnull }
334 a31db67d 2004-04-21 devnull state = state0;
335 a31db67d 2004-04-21 devnull }
336 a31db67d 2004-04-21 devnull }
337 a31db67d 2004-04-21 devnull
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)
340 a31db67d 2004-04-21 devnull {
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;
346 a31db67d 2004-04-21 devnull
347 a31db67d 2004-04-21 devnull r = ob;
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);
355 a31db67d 2004-04-21 devnull r = ob;
356 a31db67d 2004-04-21 devnull }
357 a31db67d 2004-04-21 devnull }
358 a31db67d 2004-04-21 devnull if(r > ob){
359 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
360 a31db67d 2004-04-21 devnull r = ob;
361 a31db67d 2004-04-21 devnull }
362 a31db67d 2004-04-21 devnull }
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);
366 a31db67d 2004-04-21 devnull }
367 a31db67d 2004-04-21 devnull
368 a31db67d 2004-04-21 devnull void
369 a31db67d 2004-04-21 devnull jis_in(int fd, long *notused, struct convert *out)
370 a31db67d 2004-04-21 devnull {
371 a31db67d 2004-04-21 devnull USED(notused);
372 a31db67d 2004-04-21 devnull do_in(fd, alljis, out);
373 a31db67d 2004-04-21 devnull }
374 a31db67d 2004-04-21 devnull
375 a31db67d 2004-04-21 devnull void
376 a31db67d 2004-04-21 devnull ujis_in(int fd, long *notused, struct convert *out)
377 a31db67d 2004-04-21 devnull {
378 a31db67d 2004-04-21 devnull USED(notused);
379 a31db67d 2004-04-21 devnull do_in(fd, ujis, out);
380 a31db67d 2004-04-21 devnull }
381 a31db67d 2004-04-21 devnull
382 a31db67d 2004-04-21 devnull void
383 a31db67d 2004-04-21 devnull msjis_in(int fd, long *notused, struct convert *out)
384 a31db67d 2004-04-21 devnull {
385 a31db67d 2004-04-21 devnull USED(notused);
386 a31db67d 2004-04-21 devnull do_in(fd, ms, out);
387 a31db67d 2004-04-21 devnull }
388 a31db67d 2004-04-21 devnull
389 a31db67d 2004-04-21 devnull void
390 a31db67d 2004-04-21 devnull jisjis_in(int fd, long *notused, struct convert *out)
391 a31db67d 2004-04-21 devnull {
392 a31db67d 2004-04-21 devnull USED(notused);
393 a31db67d 2004-04-21 devnull do_in(fd, jis, out);
394 a31db67d 2004-04-21 devnull }
395 a31db67d 2004-04-21 devnull
396 a31db67d 2004-04-21 devnull static int first = 1;
397 a31db67d 2004-04-21 devnull
398 a31db67d 2004-04-21 devnull static void
399 a31db67d 2004-04-21 devnull tab_init(void)
400 a31db67d 2004-04-21 devnull {
401 a31db67d 2004-04-21 devnull int i;
402 a31db67d 2004-04-21 devnull long l;
403 a31db67d 2004-04-21 devnull
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;
411 a31db67d 2004-04-21 devnull else
412 a31db67d 2004-04-21 devnull tab[l] = i;
413 a31db67d 2004-04-21 devnull }
414 a31db67d 2004-04-21 devnull }
415 a31db67d 2004-04-21 devnull
416 a31db67d 2004-04-21 devnull
417 a31db67d 2004-04-21 devnull /* jis-kanji, or ISO 2022-JP */
418 a31db67d 2004-04-21 devnull void
419 a31db67d 2004-04-21 devnull jisjis_out(Rune *base, int n, long *notused)
420 a31db67d 2004-04-21 devnull {
421 a31db67d 2004-04-21 devnull char *p;
422 a31db67d 2004-04-21 devnull int i;
423 a31db67d 2004-04-21 devnull Rune r;
424 a31db67d 2004-04-21 devnull static enum { ascii, japan646, jp2022 } state = ascii;
425 a31db67d 2004-04-21 devnull
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;
437 a31db67d 2004-04-21 devnull }
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;
444 a31db67d 2004-04-21 devnull }
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;
448 a31db67d 2004-04-21 devnull }
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;
455 a31db67d 2004-04-21 devnull }
456 a31db67d 2004-04-21 devnull }
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);
460 a31db67d 2004-04-21 devnull }
461 a31db67d 2004-04-21 devnull
462 a31db67d 2004-04-21 devnull /* ms-kanji, or Shift-JIS */
463 a31db67d 2004-04-21 devnull void
464 a31db67d 2004-04-21 devnull msjis_out(Rune *base, int n, long *notused)
465 a31db67d 2004-04-21 devnull {
466 a31db67d 2004-04-21 devnull char *p;
467 a31db67d 2004-04-21 devnull int i, hi, lo;
468 a31db67d 2004-04-21 devnull Rune r;
469 a31db67d 2004-04-21 devnull
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;
479 a31db67d 2004-04-21 devnull else {
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;
487 a31db67d 2004-04-21 devnull }
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;
494 a31db67d 2004-04-21 devnull }
495 a31db67d 2004-04-21 devnull }
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);
499 a31db67d 2004-04-21 devnull }
500 a31db67d 2004-04-21 devnull
501 a31db67d 2004-04-21 devnull /* ujis, or EUC */
502 a31db67d 2004-04-21 devnull void
503 a31db67d 2004-04-21 devnull ujis_out(Rune *base, int n, long *notused)
504 a31db67d 2004-04-21 devnull {
505 a31db67d 2004-04-21 devnull char *p;
506 a31db67d 2004-04-21 devnull int i;
507 a31db67d 2004-04-21 devnull Rune r;
508 a31db67d 2004-04-21 devnull
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;
518 a31db67d 2004-04-21 devnull else {
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;
523 a31db67d 2004-04-21 devnull }
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;
530 a31db67d 2004-04-21 devnull }
531 a31db67d 2004-04-21 devnull }
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);
535 a31db67d 2004-04-21 devnull }