Blob


1 #ifndef PLAN9
2 #include <sys/types.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6 #include <fcntl.h>
7 #include <string.h>
8 #include <errno.h>
9 #include "plan9.h"
10 #else /* PLAN9 */
11 #include <u.h>
12 #include <libc.h>
13 #include <bio.h>
14 #endif /* PLAN9 */
15 #include "cyrillic.h"
16 #include "misc.h"
17 #include "ms.h"
18 #include "8859.h"
19 #include "big5.h"
20 #include "gb.h"
21 #include "hdr.h"
22 #include "conv.h"
24 void usage(void);
25 void list(void);
26 int squawk = 1;
27 int clean = 0;
28 int verbose = 0;
29 long ninput, noutput, nrunes, nerrors;
30 char *file = "stdin";
31 char *argv0;
32 Rune runes[N];
33 char obuf[UTFmax*N]; /* maximum bloat from N runes */
34 long tab[NRUNE];
35 #ifndef PLAN9
36 extern char version[];
37 #endif
39 void intable(int, long *, struct convert *);
40 void unicode_in(int, long *, struct convert *);
41 void unicode_out(Rune *, int, long *);
43 int
44 main(int argc, char **argv)
45 {
46 char *from = "utf";
47 char *to = "utf";
48 int fd;
49 int listem = 0;
50 struct convert *t, *f;
52 ARGBEGIN {
53 case 'c':
54 clean = 1;
55 break;
56 case 'f':
57 from = EARGF(usage());
58 break;
59 case 'l':
60 listem = 1;
61 break;
62 case 's':
63 squawk = 0;
64 break;
65 case 't':
66 to = EARGF(usage());
67 break;
68 case 'v':
69 verbose = 1;
70 break;
71 default:
72 usage();
73 break;
74 } ARGEND
76 USED(argc);
77 if(verbose)
78 squawk = 1;
79 if(listem){
80 list();
81 EXIT(0, 0);
82 }
83 if(!from || !to)
84 usage();
85 f = conv(from, 1);
86 t = conv(to, 0);
87 #define PROC {if(f->flags&Table)\
88 intable(fd, (long *)f->data, t);\
89 else\
90 ((Infn)(f->fn))(fd, (long *)0, t);}
91 if(*argv){
92 while(*argv){
93 file = *argv;
94 #ifndef PLAN9
95 if((fd = open(*argv, 0)) < 0){
96 EPR "%s: %s: %s\n", argv0, *argv, strerror(errno));
97 #else /* PLAN9 */
98 if((fd = open(*argv, OREAD)) < 0){
99 EPR "%s: %s: %r\n", argv0, *argv);
100 #endif /* PLAN9 */
101 EXIT(1, "open failure");
103 PROC
104 close(fd);
105 argv++;
107 } else {
108 fd = 0;
109 PROC
111 if(verbose)
112 EPR "%s: %ld input bytes, %ld runes, %ld output bytes (%ld errors)\n", argv0,
113 ninput, nrunes, noutput, nerrors);
114 EXIT(((nerrors && squawk)? 1:0), ((nerrors && squawk)? "conversion error":0));
115 return(0); /* shut up compiler */
118 void
119 usage(void)
121 EPR "Usage: %s [-slv] [-f cs] [-t cs] [file ...]\n", argv0);
122 verbose = 1;
123 list();
124 EXIT(1, "usage");
127 void
128 list(void)
130 struct convert *c;
131 char ch = verbose?'\t':' ';
133 #ifndef PLAN9
134 EPR "%s version = '%s'\n", argv0, version);
135 #endif
136 if(verbose)
137 EPR "character sets:\n");
138 else
139 EPR "cs:");
140 for(c = convert; c->name; c++){
141 if((c->flags&From) && c[1].name && (strcmp(c[1].name, c->name) == 0)){
142 EPR "%c%s", ch, c->name);
143 c++;
144 } else if(c->flags&Table)
145 EPR "%c%s", ch, c->name);
146 else if(c->flags&From)
147 EPR "%c%s(from)", ch, c->name);
148 else
149 EPR "%c%s(to)", ch, c->name);
150 if(verbose)
151 EPR "\t%s\n", c->chatter);
153 if(!verbose)
154 EPR "\n");
157 struct convert *
158 conv(char *name, int from)
160 struct convert *c;
162 for(c = convert; c->name; c++){
163 if(cistrcmp(c->name, name) != 0)
164 continue;
165 if(c->flags&Table)
166 return(c);
167 if(((c->flags&From) == 0) == (from == 0))
168 return(c);
170 EPR "%s: charset `%s' unknown\n", argv0, name);
171 EXIT(1, "unknown character set");
172 return(0); /* just shut the compiler up */
175 void
176 swab2(char *b, int n)
178 char *e, p;
180 for(e = b+n; b < e; b++){
181 p = *b;
182 *b = b[1];
183 *++b = p;
187 void
188 unicode_in(int fd, long *notused, struct convert *out)
190 Rune buf[N];
191 int n;
192 int swabme;
194 USED(notused);
195 if(read(fd, (char *)buf, 2) != 2)
196 return;
197 ninput += 2;
198 switch(buf[0])
200 default:
201 OUT(out, buf, 1);
202 case 0xFEFF:
203 swabme = 0;
204 break;
205 case 0xFFFE:
206 swabme = 1;
207 break;
209 while((n = read(fd, (char *)buf, 2*N)) > 0){
210 ninput += n;
211 if(swabme)
212 swab2((char *)buf, n);
213 if(n&1){
214 if(squawk)
215 EPR "%s: odd byte count in %s\n", argv0, file);
216 nerrors++;
217 if(clean)
218 n--;
219 else
220 buf[n++/2] = Runeerror;
222 OUT(out, buf, n/2);
226 void
227 unicode_in_be(int fd, long *notused, struct convert *out)
229 int i, n;
230 Rune buf[N], r;
231 uchar *p;
233 USED(notused);
234 while((n = read(fd, (char *)buf, 2*N)) > 0){
235 ninput += n;
236 p = (uchar*)buf;
237 for(i=0; i<n/2; i++){
238 r = *p++<<8;
239 r |= *p++;
240 buf[i] = r;
242 if(n&1){
243 if(squawk)
244 EPR "%s: odd byte count in %s\n", argv0, file);
245 nerrors++;
246 if(clean)
247 n--;
248 else
249 buf[n++/2] = Runeerror;
251 OUT(out, buf, n/2);
253 OUT(out, buf, 0);
256 void
257 unicode_in_le(int fd, long *notused, struct convert *out)
259 int i, n;
260 Rune buf[N], r;
261 uchar *p;
263 USED(notused);
264 while((n = read(fd, (char *)buf, 2*N)) > 0){
265 ninput += n;
266 p = (uchar*)buf;
267 for(i=0; i<n/2; i++){
268 r = *p++;
269 r |= *p++<<8;
270 buf[i] = r;
272 if(n&1){
273 if(squawk)
274 EPR "%s: odd byte count in %s\n", argv0, file);
275 nerrors++;
276 if(clean)
277 n--;
278 else
279 buf[n++/2] = Runeerror;
281 OUT(out, buf, n/2);
283 OUT(out, buf, 0);
286 void
287 unicode_out(Rune *base, int n, long *notused)
289 static int first = 1;
291 USED(notused);
292 nrunes += n;
293 if(first){
294 unsigned short x = 0xFEFF;
295 noutput += 2;
296 write(1, (char *)&x, 2);
297 first = 0;
299 noutput += 2*n;
300 write(1, (char *)base, 2*n);
303 void
304 unicode_out_be(Rune *base, int n, long *notused)
306 int i;
307 uchar *p;
308 Rune r;
310 USED(notused);
311 p = (uchar*)base;
312 for(i=0; i<n; i++){
313 r = base[i];
314 *p++ = r>>8;
315 *p++ = r;
317 nrunes += n;
318 noutput += 2*n;
319 write(1, (char *)base, 2*n);
322 void
323 unicode_out_le(Rune *base, int n, long *notused)
325 int i;
326 uchar *p;
327 Rune r;
329 USED(notused);
330 p = (uchar*)base;
331 for(i=0; i<n; i++){
332 r = base[i];
333 *p++ = r;
334 *p++ = r>>8;
336 nrunes += n;
337 noutput += 2*n;
338 write(1, (char *)base, 2*n);
341 void
342 intable(int fd, long *table, struct convert *out)
344 uchar buf[N];
345 uchar *p, *e;
346 Rune *r;
347 int n;
348 long c;
350 while((n = read(fd, (char *)buf, N)) > 0){
351 ninput += n;
352 r = runes;
353 for(p = buf, e = buf+n; p < e; p++){
354 c = table[*p];
355 if(c < 0){
356 if(squawk)
357 EPR "%s: bad char 0x%x near byte %ld in %s\n", argv0, *p, ninput+(p-e), file);
358 nerrors++;
359 if(clean)
360 continue;
361 c = BADMAP;
363 *r++ = c;
365 OUT(out, runes, r-runes);
367 OUT(out, runes, 0);
368 if(n < 0){
369 #ifdef PLAN9
370 EPR "%s: input read: %r\n", argv0);
371 #else
372 EPR "%s: input read: %s\n", argv0, strerror(errno));
373 #endif
374 EXIT(1, "input read error");
378 void
379 outtable(Rune *base, int n, long *map)
381 long c;
382 char *p;
383 int i;
385 nrunes += n;
386 for(i = 0; i < NRUNE; i++)
387 tab[i] = -1;
388 for(i = 0; i < 256; i++)
389 if(map[i] >= 0)
390 tab[map[i]] = i;
391 for(i = 0, p = obuf; i < n; i++){
392 c = tab[base[i]];
393 if(c < 0){
394 if(squawk)
395 EPR "%s: rune 0x%x not in output cs\n", argv0, base[i]);
396 nerrors++;
397 if(clean)
398 continue;
399 c = BADMAP;
401 *p++ = c;
403 noutput += p-obuf;
404 write(1, obuf, p-obuf);
407 long tabascii[256] =
409 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
410 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
411 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
412 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
413 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
414 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
415 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
416 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
417 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
418 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
419 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
420 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
421 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
422 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
423 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
424 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
425 };
427 long tabmsdos[256] = /* from jhelling@cs.ruu.nl (Jeroen Hellingman) */
429 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
430 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
431 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
432 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
433 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
434 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
435 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
436 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
437 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, /* latin */
438 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
439 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
440 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
441 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
442 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
443 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* forms */
444 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
445 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
446 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
447 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
448 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
449 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, /* greek */
450 0x03a6, 0x0398, 0x2126, 0x03b4, 0x221e, 0x2205, 0x2208, 0x2229,
451 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, /* math */
452 0x00b0, 0x2022, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x220e, 0x00a0
453 };
454 long tabmsdos2[256] = /* from jhelling@cs.ruu.nl (Jeroen Hellingman) */
456 0x0000, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
457 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
458 0x25b6, 0x25c0, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x2043, 0x21a8,
459 0x2191, 0x2193, 0x2192, 0x2190, 0x2319, 0x2194, 0x25b2, 0x25bc,
460 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
461 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
462 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
463 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
464 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
465 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
466 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, /* latin */
467 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
468 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
469 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
470 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
471 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
472 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* forms */
473 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
474 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
475 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
476 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
477 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
478 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, /* greek */
479 0x03a6, 0x0398, 0x2126, 0x03b4, 0x221e, 0x2205, 0x2208, 0x2229,
480 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, /* math */
481 0x00b0, 0x2022, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x220e, 0x00a0
482 };
483 struct convert convert[] =
484 { /* if two entries have the same name, put the from one first */
485 { "8859-1", "Latin-1 (Western and Northern Europe including Italian)", Table, (void *)tab8859_1 },
486 { "8859-2", "Latin-2 (Eastern Europe except Turkey and the Baltic countries)", Table, (void *)tab8859_2 },
487 { "8859-3", "Latin-3 (Mediterranean, South Africa, Esperanto)", Table, (void *)tab8859_3 },
488 { "8859-4", "Latin-4 (Scandinavia and the Baltic countries; obsolete)", Table, (void *)tab8859_4 },
489 { "8859-5", "Part 5 (Cyrillic)", Table, (void *)tab8859_5 },
490 { "8859-6", "Part 6 (Arabic)", Table, (void *)tab8859_6 },
491 { "8859-7", "Part 7 (Greek)", Table, (void *)tab8859_7 },
492 { "8859-8", "Part 8 (Hebrew)", Table, (void *)tab8859_8 },
493 { "8859-9", "Latin-5 (Turkey, Western Europe except Icelandic and Faroese)", Table, (void *)tab8859_9 },
494 { "8859-10", "Latin-6 (Northern Europe)", Table, (void *)tab8859_10 },
495 { "8859-15", "Latin-9 (Western Europe)", Table, (void *)tab8859_15 },
496 { "ascii", "7-bit ASCII", Table, (void *)tabascii },
497 { "atari", "ATARI-ST character set", Table, (void *)tabatari },
498 { "av", "Alternativnyj Variant", Table, (void *)tabav },
499 { "big5", "Big 5 (HKU)", From|Func, 0, (Fnptr)big5_in },
500 { "big5", "Big 5 (HKU)", Func, 0, (Fnptr)big5_out },
501 { "ebcdic", "EBCDIC", Table, (void *)tabebcdic }, /* 6f is recommended bad map */
502 { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", From|Func, 0, (Fnptr)uksc_in },
503 { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", Func, 0, (Fnptr)uksc_out },
504 { "gb2312", "GB2312-80 (Chinese)", From|Func, 0, (Fnptr)gb_in },
505 { "gb2312", "GB2312-80 (Chinese)", Func, 0, (Fnptr)gb_out },
506 { "html", "HTML", From|Func, 0, (Fnptr)html_in },
507 { "html", "HTML", Func, 0, (Fnptr)html_out },
508 { "ibm437", "IBM Code Page 437 (US)", Table, (void*)tabcp437 },
509 { "ibm720", "IBM Code Page 720 (Arabic)", Table, (void*)tabcp720 },
510 { "ibm737", "IBM Code Page 737 (Greek)", Table, (void*)tabcp737 },
511 { "ibm775", "IBM Code Page 775 (Baltic)", Table, (void*)tabcp775 },
512 { "ibm850", "IBM Code Page 850 (Multilingual Latin I)", Table, (void*)tabcp850 },
513 { "ibm852", "IBM Code Page 852 (Latin II)", Table, (void*)tabcp852 },
514 { "ibm855", "IBM Code Page 855 (Cyrillic)", Table, (void*)tabcp855 },
515 { "ibm857", "IBM Code Page 857 (Turkish)", Table, (void*)tabcp857 },
516 { "ibm858", "IBM Code Page 858 (Multilingual Latin I+Euro)", Table, (void*)tabcp858 },
517 { "ibm862", "IBM Code Page 862 (Hebrew)", Table, (void*)tabcp862 },
518 { "ibm866", "IBM Code Page 866 (Russian)", Table, (void*)tabcp866 },
519 { "ibm874", "IBM Code Page 874 (Thai)", Table, (void*)tabcp874 },
520 { "iso-2022-jp", "alias for jis-kanji (MIME)", From|Func, 0, (Fnptr)jisjis_in },
521 { "iso-2022-jp", "alias for jis-kanji (MIME)", Func, 0, (Fnptr)jisjis_out },
522 { "iso-8859-1", "alias for 8859-1 (MIME)", Table, (void *)tab8859_1 },
523 { "iso-8859-2", "alias for 8859-2 (MIME)", Table, (void *)tab8859_2 },
524 { "iso-8859-3", "alias for 8859-3 (MIME)", Table, (void *)tab8859_3 },
525 { "iso-8859-4", "alias for 8859-4 (MIME)", Table, (void *)tab8859_4 },
526 { "iso-8859-5", "alias for 8859-5 (MIME)", Table, (void *)tab8859_5 },
527 { "iso-8859-6", "alias for 8859-6 (MIME)", Table, (void *)tab8859_6 },
528 { "iso-8859-7", "alias for 8859-7 (MIME)", Table, (void *)tab8859_7 },
529 { "iso-8859-8", "alias for 8859-8 (MIME)", Table, (void *)tab8859_8 },
530 { "iso-8859-9", "alias for 8859-9 (MIME)", Table, (void *)tab8859_9 },
531 { "iso-8859-10", "alias for 8859-10 (MIME)", Table, (void *)tab8859_10 },
532 { "iso-8859-15", "alias for 8859-15 (MIME)", Table, (void *)tab8859_15 },
533 { "jis", "guesses at the JIS encoding", From|Func, 0, (Fnptr)jis_in },
534 { "jis-kanji", "ISO 2022-JP (Japanese)", From|Func, 0, (Fnptr)jisjis_in },
535 { "jis-kanji", "ISO 2022-JP (Japanese)", Func, 0, (Fnptr)jisjis_out },
536 { "koi8", "KOI-8 (GOST 19769-74)", Table, (void *)tabkoi8 },
537 { "koi8-r", "alias for koi8 (MIME)", Table, (void *)tabkoi8 },
538 { "latin1", "alias for 8859-1", Table, (void *)tab8859_1 },
539 { "macrom", "Macintosh Standard Roman character set", Table, (void *)tabmacroman },
540 { "microsoft", "alias for windows1252", Table, (void *)tabcp1252 },
541 { "ms-kanji", "Microsoft, or Shift-JIS", From|Func, 0, (Fnptr)msjis_in },
542 { "ms-kanji", "Microsoft, or Shift-JIS", Func, 0, (Fnptr)msjis_out },
543 { "msdos", "IBM PC (alias for ibm437)", Table, (void *)tabcp437 },
544 { "msdos2", "IBM PC (ibm437 with graphics in C0)", Table, (void *)tabmsdos2 },
545 { "next", "NEXTSTEP character set", Table, (void *)tabnextstep },
546 { "ov", "Osnovnoj Variant", Table, (void *)tabov },
547 { "ps2", "IBM PS/2: (alias for ibm850)", Table, (void *)tabcp850 },
548 { "sf1", "ISO-646: Finnish/Swedish SF-1 variant", Table, (void *)tabsf1 },
549 { "sf2", "ISO-646: Finnish/Swedish SF-2 variant (recommended)", Table, (void *)tabsf2 },
550 { "tis-620", "Thai+ASCII (TIS 620-1986)", Table, (void *)tabtis620 },
551 { "tune", "TUNE (Tamil)", From|Func, 0, (Fnptr)tune_in },
552 { "tune", "TUNE (Tamil)", Func, 0, (Fnptr)tune_out },
553 { "ucode", "Russian U-code", Table, (void *)tabucode },
554 { "ujis", "EUC-JX: JIS 0208", From|Func, 0, (Fnptr)ujis_in },
555 { "ujis", "EUC-JX: JIS 0208", Func, 0, (Fnptr)ujis_out },
556 { "unicode", "Unicode 1.1", From|Func, 0, (Fnptr)unicode_in },
557 { "unicode", "Unicode 1.1", Func, 0, (Fnptr)unicode_out },
558 { "unicode-be", "Unicode 1.1 big-endian", From|Func, 0, (Fnptr)unicode_in_be },
559 { "unicode-be", "Unicode 1.1 big-endian", Func, 0, (Fnptr)unicode_out_be },
560 { "unicode-le", "Unicode 1.1 little-endian", From|Func, 0, (Fnptr)unicode_in_le },
561 { "unicode-le", "Unicode 1.1 little-endian", Func, 0, (Fnptr)unicode_out_le },
562 { "us-ascii", "alias for ascii (MIME)", Table, (void *)tabascii },
563 { "utf", "FSS-UTF a.k.a. UTF-8", From|Func, 0, (Fnptr)utf_in },
564 { "utf", "FSS-UTF a.k.a. UTF-8", Func, 0, (Fnptr)utf_out },
565 { "utf1", "UTF-1 (ISO 10646 Annex A)", From|Func, 0, (Fnptr)isoutf_in },
566 { "utf1", "UTF-1 (ISO 10646 Annex A)", Func, 0, (Fnptr)isoutf_out },
567 { "utf-8", "alias for utf (MIME)", From|Func, 0, (Fnptr)utf_in },
568 { "utf-8", "alias for utf (MIME)", Func, 0, (Fnptr)utf_out },
569 { "utf-16", "alias for unicode (MIME)", From|Func, 0, (Fnptr)unicode_in },
570 { "utf-16", "alias for unicode (MIME)", Func, 0, (Fnptr)unicode_out },
571 { "utf-16be", "alias for unicode-be (MIME)", From|Func, 0, (Fnptr)unicode_in_be },
572 { "utf-16be", "alias for unicode-be (MIME)", Func, 0, (Fnptr)unicode_out_be },
573 { "utf-16le", "alias for unicode-le (MIME)", From|Func, 0, (Fnptr)unicode_in_le },
574 { "utf-16le", "alias for unicode-le (MIME)", Func, 0, (Fnptr)unicode_out_le },
575 { "viet1", "Vietnamese VSCII-1 (1993)", Table, (void *)tabviet1 },
576 { "viet2", "Vietnamese VSCII-2 (1993)", Table, (void *)tabviet2 },
577 { "vscii", "Vietnamese VISCII 1.1 (1992)", Table, (void *)tabviscii },
578 { "windows-1250", "Windows Code Page 1250 (Central Europe)", Table, (void *)tabcp1250 },
579 { "windows-1251", "Windows Code Page 1251 (Cyrillic)", Table, (void *)tabcp1251 },
580 { "windows-1252", "Windows Code Page 1252 (Latin I)", Table, (void *)tabcp1252 },
581 { "windows-1253", "Windows Code Page 1253 (Greek)", Table, (void *)tabcp1253 },
582 { "windows-1254", "Windows Code Page 1254 (Turkish)", Table, (void *)tabcp1254 },
583 { "windows-1255", "Windows Code Page 1255 (Hebrew)", Table, (void *)tabcp1255 },
584 { "windows-1256", "Windows Code Page 1256 (Arabic)", Table, (void *)tabcp1256 },
585 { "windows-1257", "Windows Code Page 1257 (Baltic)", Table, (void *)tabcp1257 },
586 { "windows-1258", "Windows Code Page 1258 (Vietnam)", Table, (void *)tabcp1258 },
587 { 0 }
588 };