Blame


1 a31db67d 2004-04-21 devnull #ifndef PLAN9
2 a31db67d 2004-04-21 devnull #include <sys/types.h>
3 a31db67d 2004-04-21 devnull #include <stdio.h>
4 a31db67d 2004-04-21 devnull #include <unistd.h>
5 a31db67d 2004-04-21 devnull #include <stdlib.h>
6 a31db67d 2004-04-21 devnull #include <fcntl.h>
7 a31db67d 2004-04-21 devnull #include <string.h>
8 a31db67d 2004-04-21 devnull #include <errno.h>
9 a31db67d 2004-04-21 devnull #include "plan9.h"
10 a31db67d 2004-04-21 devnull #else /* PLAN9 */
11 a31db67d 2004-04-21 devnull #include <u.h>
12 a31db67d 2004-04-21 devnull #include <libc.h>
13 a31db67d 2004-04-21 devnull #include <bio.h>
14 a31db67d 2004-04-21 devnull #endif /* PLAN9 */
15 a31db67d 2004-04-21 devnull #include "cyrillic.h"
16 90557256 2006-01-19 devnull #include "misc.h"
17 90557256 2006-01-19 devnull #include "ms.h"
18 90557256 2006-01-19 devnull #include "8859.h"
19 a31db67d 2004-04-21 devnull #include "big5.h"
20 a31db67d 2004-04-21 devnull #include "gb.h"
21 a31db67d 2004-04-21 devnull #include "hdr.h"
22 a31db67d 2004-04-21 devnull #include "conv.h"
23 a31db67d 2004-04-21 devnull
24 a31db67d 2004-04-21 devnull void usage(void);
25 a31db67d 2004-04-21 devnull void list(void);
26 a31db67d 2004-04-21 devnull int squawk = 1;
27 a31db67d 2004-04-21 devnull int clean = 0;
28 a31db67d 2004-04-21 devnull int verbose = 0;
29 a31db67d 2004-04-21 devnull long ninput, noutput, nrunes, nerrors;
30 a31db67d 2004-04-21 devnull char *file = "stdin";
31 a31db67d 2004-04-21 devnull char *argv0;
32 a31db67d 2004-04-21 devnull Rune runes[N];
33 a31db67d 2004-04-21 devnull char obuf[UTFmax*N]; /* maximum bloat from N runes */
34 a31db67d 2004-04-21 devnull long tab[NRUNE];
35 a31db67d 2004-04-21 devnull #ifndef PLAN9
36 a31db67d 2004-04-21 devnull extern char version[];
37 a31db67d 2004-04-21 devnull #endif
38 a31db67d 2004-04-21 devnull
39 a31db67d 2004-04-21 devnull void intable(int, long *, struct convert *);
40 a31db67d 2004-04-21 devnull void unicode_in(int, long *, struct convert *);
41 a31db67d 2004-04-21 devnull void unicode_out(Rune *, int, long *);
42 a31db67d 2004-04-21 devnull
43 a31db67d 2004-04-21 devnull int
44 a31db67d 2004-04-21 devnull main(int argc, char **argv)
45 a31db67d 2004-04-21 devnull {
46 a31db67d 2004-04-21 devnull char *from = "utf";
47 a31db67d 2004-04-21 devnull char *to = "utf";
48 a31db67d 2004-04-21 devnull int fd;
49 a31db67d 2004-04-21 devnull int listem = 0;
50 a31db67d 2004-04-21 devnull struct convert *t, *f;
51 a31db67d 2004-04-21 devnull
52 a31db67d 2004-04-21 devnull ARGBEGIN {
53 a31db67d 2004-04-21 devnull case 'c':
54 a31db67d 2004-04-21 devnull clean = 1;
55 a31db67d 2004-04-21 devnull break;
56 a31db67d 2004-04-21 devnull case 'f':
57 a31db67d 2004-04-21 devnull from = ARGF();
58 a31db67d 2004-04-21 devnull break;
59 a31db67d 2004-04-21 devnull case 'l':
60 a31db67d 2004-04-21 devnull listem = 1;
61 a31db67d 2004-04-21 devnull break;
62 a31db67d 2004-04-21 devnull case 's':
63 a31db67d 2004-04-21 devnull squawk = 0;
64 a31db67d 2004-04-21 devnull break;
65 a31db67d 2004-04-21 devnull case 't':
66 a31db67d 2004-04-21 devnull to = ARGF();
67 a31db67d 2004-04-21 devnull break;
68 a31db67d 2004-04-21 devnull case 'v':
69 a31db67d 2004-04-21 devnull verbose = 1;
70 a31db67d 2004-04-21 devnull break;
71 a31db67d 2004-04-21 devnull default:
72 a31db67d 2004-04-21 devnull usage();
73 a31db67d 2004-04-21 devnull break;
74 a31db67d 2004-04-21 devnull } ARGEND
75 a31db67d 2004-04-21 devnull
76 a31db67d 2004-04-21 devnull USED(argc);
77 a31db67d 2004-04-21 devnull if(verbose)
78 a31db67d 2004-04-21 devnull squawk = 1;
79 a31db67d 2004-04-21 devnull if(listem){
80 a31db67d 2004-04-21 devnull list();
81 a31db67d 2004-04-21 devnull EXIT(0, 0);
82 a31db67d 2004-04-21 devnull }
83 a31db67d 2004-04-21 devnull if(!from || !to)
84 a31db67d 2004-04-21 devnull usage();
85 a31db67d 2004-04-21 devnull f = conv(from, 1);
86 a31db67d 2004-04-21 devnull t = conv(to, 0);
87 a31db67d 2004-04-21 devnull #define PROC {if(f->flags&Table)\
88 a31db67d 2004-04-21 devnull intable(fd, (long *)f->data, t);\
89 a31db67d 2004-04-21 devnull else\
90 a31db67d 2004-04-21 devnull ((Infn)(f->fn))(fd, (long *)0, t);}
91 a31db67d 2004-04-21 devnull if(*argv){
92 a31db67d 2004-04-21 devnull while(*argv){
93 a31db67d 2004-04-21 devnull file = *argv;
94 a31db67d 2004-04-21 devnull #ifndef PLAN9
95 a31db67d 2004-04-21 devnull if((fd = open(*argv, 0)) < 0){
96 a31db67d 2004-04-21 devnull EPR "%s: %s: %s\n", argv0, *argv, strerror(errno));
97 a31db67d 2004-04-21 devnull #else /* PLAN9 */
98 a31db67d 2004-04-21 devnull if((fd = open(*argv, OREAD)) < 0){
99 a31db67d 2004-04-21 devnull EPR "%s: %s: %r\n", argv0, *argv);
100 a31db67d 2004-04-21 devnull #endif /* PLAN9 */
101 a31db67d 2004-04-21 devnull EXIT(1, "open failure");
102 a31db67d 2004-04-21 devnull }
103 a31db67d 2004-04-21 devnull PROC
104 a31db67d 2004-04-21 devnull close(fd);
105 a31db67d 2004-04-21 devnull argv++;
106 a31db67d 2004-04-21 devnull }
107 a31db67d 2004-04-21 devnull } else {
108 a31db67d 2004-04-21 devnull fd = 0;
109 a31db67d 2004-04-21 devnull PROC
110 a31db67d 2004-04-21 devnull }
111 a31db67d 2004-04-21 devnull if(verbose)
112 a31db67d 2004-04-21 devnull EPR "%s: %ld input bytes, %ld runes, %ld output bytes (%ld errors)\n", argv0,
113 a31db67d 2004-04-21 devnull ninput, nrunes, noutput, nerrors);
114 a31db67d 2004-04-21 devnull EXIT(((nerrors && squawk)? 1:0), ((nerrors && squawk)? "conversion error":0));
115 a31db67d 2004-04-21 devnull return(0); /* shut up compiler */
116 a31db67d 2004-04-21 devnull }
117 a31db67d 2004-04-21 devnull
118 a31db67d 2004-04-21 devnull void
119 a31db67d 2004-04-21 devnull usage(void)
120 a31db67d 2004-04-21 devnull {
121 a31db67d 2004-04-21 devnull EPR "Usage: %s [-slv] [-f cs] [-t cs] [file ...]\n", argv0);
122 1a8bd157 2006-02-14 devnull verbose = 1;
123 a31db67d 2004-04-21 devnull list();
124 a31db67d 2004-04-21 devnull EXIT(1, "usage");
125 a31db67d 2004-04-21 devnull }
126 a31db67d 2004-04-21 devnull
127 a31db67d 2004-04-21 devnull void
128 a31db67d 2004-04-21 devnull list(void)
129 a31db67d 2004-04-21 devnull {
130 a31db67d 2004-04-21 devnull struct convert *c;
131 a31db67d 2004-04-21 devnull char ch = verbose?'\t':' ';
132 a31db67d 2004-04-21 devnull
133 a31db67d 2004-04-21 devnull #ifndef PLAN9
134 a31db67d 2004-04-21 devnull EPR "%s version = '%s'\n", argv0, version);
135 a31db67d 2004-04-21 devnull #endif
136 a31db67d 2004-04-21 devnull if(verbose)
137 a31db67d 2004-04-21 devnull EPR "character sets:\n");
138 a31db67d 2004-04-21 devnull else
139 a31db67d 2004-04-21 devnull EPR "cs:");
140 a31db67d 2004-04-21 devnull for(c = convert; c->name; c++){
141 a31db67d 2004-04-21 devnull if((c->flags&From) && c[1].name && (strcmp(c[1].name, c->name) == 0)){
142 a31db67d 2004-04-21 devnull EPR "%c%s", ch, c->name);
143 a31db67d 2004-04-21 devnull c++;
144 a31db67d 2004-04-21 devnull } else if(c->flags&Table)
145 a31db67d 2004-04-21 devnull EPR "%c%s", ch, c->name);
146 a31db67d 2004-04-21 devnull else if(c->flags&From)
147 a31db67d 2004-04-21 devnull EPR "%c%s(from)", ch, c->name);
148 a31db67d 2004-04-21 devnull else
149 a31db67d 2004-04-21 devnull EPR "%c%s(to)", ch, c->name);
150 a31db67d 2004-04-21 devnull if(verbose)
151 a31db67d 2004-04-21 devnull EPR "\t%s\n", c->chatter);
152 a31db67d 2004-04-21 devnull }
153 a31db67d 2004-04-21 devnull if(!verbose)
154 a31db67d 2004-04-21 devnull EPR "\n");
155 a31db67d 2004-04-21 devnull }
156 a31db67d 2004-04-21 devnull
157 a31db67d 2004-04-21 devnull struct convert *
158 a31db67d 2004-04-21 devnull conv(char *name, int from)
159 a31db67d 2004-04-21 devnull {
160 a31db67d 2004-04-21 devnull struct convert *c;
161 a31db67d 2004-04-21 devnull
162 a31db67d 2004-04-21 devnull for(c = convert; c->name; c++){
163 a31db67d 2004-04-21 devnull if(strcmp(c->name, name) != 0)
164 a31db67d 2004-04-21 devnull continue;
165 a31db67d 2004-04-21 devnull if(c->flags&Table)
166 a31db67d 2004-04-21 devnull return(c);
167 a31db67d 2004-04-21 devnull if(((c->flags&From) == 0) == (from == 0))
168 a31db67d 2004-04-21 devnull return(c);
169 a31db67d 2004-04-21 devnull }
170 a31db67d 2004-04-21 devnull EPR "%s: charset `%s' unknown\n", argv0, name);
171 a31db67d 2004-04-21 devnull EXIT(1, "unknown character set");
172 a31db67d 2004-04-21 devnull return(0); /* just shut the compiler up */
173 a31db67d 2004-04-21 devnull }
174 a31db67d 2004-04-21 devnull
175 a31db67d 2004-04-21 devnull void
176 a31db67d 2004-04-21 devnull swab2(char *b, int n)
177 a31db67d 2004-04-21 devnull {
178 a31db67d 2004-04-21 devnull char *e, p;
179 a31db67d 2004-04-21 devnull
180 a31db67d 2004-04-21 devnull for(e = b+n; b < e; b++){
181 a31db67d 2004-04-21 devnull p = *b;
182 a31db67d 2004-04-21 devnull *b = b[1];
183 a31db67d 2004-04-21 devnull *++b = p;
184 a31db67d 2004-04-21 devnull }
185 a31db67d 2004-04-21 devnull }
186 a31db67d 2004-04-21 devnull
187 a31db67d 2004-04-21 devnull void
188 a31db67d 2004-04-21 devnull unicode_in(int fd, long *notused, struct convert *out)
189 a31db67d 2004-04-21 devnull {
190 a31db67d 2004-04-21 devnull Rune buf[N];
191 a31db67d 2004-04-21 devnull int n;
192 a31db67d 2004-04-21 devnull int swabme;
193 a31db67d 2004-04-21 devnull
194 a31db67d 2004-04-21 devnull USED(notused);
195 a31db67d 2004-04-21 devnull if(read(fd, (char *)buf, 2) != 2)
196 a31db67d 2004-04-21 devnull return;
197 a31db67d 2004-04-21 devnull ninput += 2;
198 a31db67d 2004-04-21 devnull switch(buf[0])
199 a31db67d 2004-04-21 devnull {
200 a31db67d 2004-04-21 devnull default:
201 a31db67d 2004-04-21 devnull OUT(out, buf, 1);
202 a31db67d 2004-04-21 devnull case 0xFEFF:
203 a31db67d 2004-04-21 devnull swabme = 0;
204 a31db67d 2004-04-21 devnull break;
205 a31db67d 2004-04-21 devnull case 0xFFFE:
206 a31db67d 2004-04-21 devnull swabme = 1;
207 a31db67d 2004-04-21 devnull break;
208 a31db67d 2004-04-21 devnull }
209 a31db67d 2004-04-21 devnull while((n = read(fd, (char *)buf, 2*N)) > 0){
210 a31db67d 2004-04-21 devnull ninput += n;
211 a31db67d 2004-04-21 devnull if(n&1){
212 a31db67d 2004-04-21 devnull if(squawk)
213 a31db67d 2004-04-21 devnull EPR "%s: odd byte count in %s\n", argv0, file);
214 a31db67d 2004-04-21 devnull nerrors++;
215 a31db67d 2004-04-21 devnull if(clean)
216 a31db67d 2004-04-21 devnull n--;
217 a31db67d 2004-04-21 devnull else {
218 a31db67d 2004-04-21 devnull n++;
219 a31db67d 2004-04-21 devnull buf[n/2] = Runeerror;
220 a31db67d 2004-04-21 devnull if(swabme) /* swab so later swab undoes it */
221 a31db67d 2004-04-21 devnull swab2((char *)&buf[n/2], 2);
222 a31db67d 2004-04-21 devnull }
223 a31db67d 2004-04-21 devnull }
224 a31db67d 2004-04-21 devnull if(swabme)
225 a31db67d 2004-04-21 devnull swab2((char *)buf, n);
226 a31db67d 2004-04-21 devnull OUT(out, buf, n/2);
227 a31db67d 2004-04-21 devnull }
228 a31db67d 2004-04-21 devnull }
229 a31db67d 2004-04-21 devnull
230 a31db67d 2004-04-21 devnull void
231 a31db67d 2004-04-21 devnull unicode_out(Rune *base, int n, long *notused)
232 a31db67d 2004-04-21 devnull {
233 a31db67d 2004-04-21 devnull static int first = 1;
234 a31db67d 2004-04-21 devnull
235 a31db67d 2004-04-21 devnull USED(notused);
236 a31db67d 2004-04-21 devnull nrunes += n;
237 a31db67d 2004-04-21 devnull if(first){
238 a31db67d 2004-04-21 devnull unsigned short x = 0xFEFF;
239 a31db67d 2004-04-21 devnull noutput += 2;
240 a31db67d 2004-04-21 devnull write(1, (char *)&x, 2);
241 a31db67d 2004-04-21 devnull first = 0;
242 a31db67d 2004-04-21 devnull }
243 a31db67d 2004-04-21 devnull noutput += 2*n;
244 a31db67d 2004-04-21 devnull write(1, (char *)base, 2*n);
245 a31db67d 2004-04-21 devnull }
246 a31db67d 2004-04-21 devnull
247 a31db67d 2004-04-21 devnull void
248 a31db67d 2004-04-21 devnull intable(int fd, long *table, struct convert *out)
249 a31db67d 2004-04-21 devnull {
250 a31db67d 2004-04-21 devnull uchar buf[N];
251 a31db67d 2004-04-21 devnull uchar *p, *e;
252 a31db67d 2004-04-21 devnull Rune *r;
253 a31db67d 2004-04-21 devnull int n;
254 a31db67d 2004-04-21 devnull long c;
255 a31db67d 2004-04-21 devnull
256 a31db67d 2004-04-21 devnull while((n = read(fd, (char *)buf, N)) > 0){
257 a31db67d 2004-04-21 devnull ninput += n;
258 a31db67d 2004-04-21 devnull r = runes;
259 a31db67d 2004-04-21 devnull for(p = buf, e = buf+n; p < e; p++){
260 a31db67d 2004-04-21 devnull c = table[*p];
261 a31db67d 2004-04-21 devnull if(c < 0){
262 a31db67d 2004-04-21 devnull if(squawk)
263 a31db67d 2004-04-21 devnull EPR "%s: bad char 0x%x near byte %ld in %s\n", argv0, *p, ninput+(p-e), file);
264 a31db67d 2004-04-21 devnull nerrors++;
265 a31db67d 2004-04-21 devnull if(clean)
266 a31db67d 2004-04-21 devnull continue;
267 a31db67d 2004-04-21 devnull c = BADMAP;
268 a31db67d 2004-04-21 devnull }
269 a31db67d 2004-04-21 devnull *r++ = c;
270 a31db67d 2004-04-21 devnull }
271 a31db67d 2004-04-21 devnull OUT(out, runes, r-runes);
272 a31db67d 2004-04-21 devnull }
273 a31db67d 2004-04-21 devnull if(n < 0){
274 a31db67d 2004-04-21 devnull #ifdef PLAN9
275 a31db67d 2004-04-21 devnull EPR "%s: input read: %r\n", argv0);
276 a31db67d 2004-04-21 devnull #else
277 a31db67d 2004-04-21 devnull EPR "%s: input read: %s\n", argv0, strerror(errno));
278 a31db67d 2004-04-21 devnull #endif
279 a31db67d 2004-04-21 devnull EXIT(1, "input read error");
280 a31db67d 2004-04-21 devnull }
281 a31db67d 2004-04-21 devnull }
282 a31db67d 2004-04-21 devnull
283 a31db67d 2004-04-21 devnull void
284 a31db67d 2004-04-21 devnull outtable(Rune *base, int n, long *map)
285 a31db67d 2004-04-21 devnull {
286 a31db67d 2004-04-21 devnull long c;
287 a31db67d 2004-04-21 devnull char *p;
288 a31db67d 2004-04-21 devnull int i;
289 a31db67d 2004-04-21 devnull
290 a31db67d 2004-04-21 devnull nrunes += n;
291 a31db67d 2004-04-21 devnull for(i = 0; i < NRUNE; i++)
292 a31db67d 2004-04-21 devnull tab[i] = -1;
293 a31db67d 2004-04-21 devnull for(i = 0; i < 256; i++)
294 a31db67d 2004-04-21 devnull if(map[i] >= 0)
295 a31db67d 2004-04-21 devnull tab[map[i]] = i;
296 a31db67d 2004-04-21 devnull for(i = 0, p = obuf; i < n; i++){
297 a31db67d 2004-04-21 devnull c = tab[base[i]];
298 a31db67d 2004-04-21 devnull if(c < 0){
299 a31db67d 2004-04-21 devnull if(squawk)
300 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, base[i]);
301 a31db67d 2004-04-21 devnull nerrors++;
302 a31db67d 2004-04-21 devnull if(clean)
303 a31db67d 2004-04-21 devnull continue;
304 a31db67d 2004-04-21 devnull c = BADMAP;
305 a31db67d 2004-04-21 devnull }
306 a31db67d 2004-04-21 devnull *p++ = c;
307 a31db67d 2004-04-21 devnull }
308 a31db67d 2004-04-21 devnull noutput += p-obuf;
309 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);
310 a31db67d 2004-04-21 devnull }
311 a31db67d 2004-04-21 devnull
312 a31db67d 2004-04-21 devnull long tabascii[256] =
313 a31db67d 2004-04-21 devnull {
314 a31db67d 2004-04-21 devnull 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
315 a31db67d 2004-04-21 devnull 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
316 a31db67d 2004-04-21 devnull 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
317 a31db67d 2004-04-21 devnull 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
318 a31db67d 2004-04-21 devnull 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
319 a31db67d 2004-04-21 devnull 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
320 a31db67d 2004-04-21 devnull 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
321 a31db67d 2004-04-21 devnull 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
322 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
323 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
324 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
325 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
326 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
327 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
328 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
329 a31db67d 2004-04-21 devnull -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
330 a31db67d 2004-04-21 devnull };
331 a31db67d 2004-04-21 devnull
332 a31db67d 2004-04-21 devnull long tabmsdos[256] = /* from jhelling@cs.ruu.nl (Jeroen Hellingman) */
333 a31db67d 2004-04-21 devnull {
334 a31db67d 2004-04-21 devnull 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
335 a31db67d 2004-04-21 devnull 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
336 a31db67d 2004-04-21 devnull 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
337 a31db67d 2004-04-21 devnull 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
338 a31db67d 2004-04-21 devnull 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
339 a31db67d 2004-04-21 devnull 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
340 a31db67d 2004-04-21 devnull 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
341 a31db67d 2004-04-21 devnull 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
342 a31db67d 2004-04-21 devnull 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, /* latin */
343 a31db67d 2004-04-21 devnull 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
344 a31db67d 2004-04-21 devnull 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
345 a31db67d 2004-04-21 devnull 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
346 a31db67d 2004-04-21 devnull 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
347 a31db67d 2004-04-21 devnull 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
348 a31db67d 2004-04-21 devnull 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* forms */
349 a31db67d 2004-04-21 devnull 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
350 a31db67d 2004-04-21 devnull 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
351 a31db67d 2004-04-21 devnull 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
352 a31db67d 2004-04-21 devnull 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
353 a31db67d 2004-04-21 devnull 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
354 a31db67d 2004-04-21 devnull 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, /* greek */
355 a31db67d 2004-04-21 devnull 0x03a6, 0x0398, 0x2126, 0x03b4, 0x221e, 0x2205, 0x2208, 0x2229,
356 a31db67d 2004-04-21 devnull 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, /* math */
357 a31db67d 2004-04-21 devnull 0x00b0, 0x2022, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x220e, 0x00a0,
358 a31db67d 2004-04-21 devnull };
359 a31db67d 2004-04-21 devnull long tabmsdos2[256] = /* from jhelling@cs.ruu.nl (Jeroen Hellingman) */
360 a31db67d 2004-04-21 devnull {
361 a31db67d 2004-04-21 devnull 0x0000, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
362 a31db67d 2004-04-21 devnull 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
363 a31db67d 2004-04-21 devnull 0x25b6, 0x25c0, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x2043, 0x21a8,
364 a31db67d 2004-04-21 devnull 0x2191, 0x2193, 0x2192, 0x2190, 0x2319, 0x2194, 0x25b2, 0x25bc,
365 a31db67d 2004-04-21 devnull 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
366 a31db67d 2004-04-21 devnull 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
367 a31db67d 2004-04-21 devnull 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
368 a31db67d 2004-04-21 devnull 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
369 a31db67d 2004-04-21 devnull 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
370 a31db67d 2004-04-21 devnull 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
371 a31db67d 2004-04-21 devnull 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, /* latin */
372 a31db67d 2004-04-21 devnull 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
373 a31db67d 2004-04-21 devnull 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
374 a31db67d 2004-04-21 devnull 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
375 a31db67d 2004-04-21 devnull 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
376 a31db67d 2004-04-21 devnull 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
377 a31db67d 2004-04-21 devnull 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* forms */
378 a31db67d 2004-04-21 devnull 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
379 a31db67d 2004-04-21 devnull 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
380 a31db67d 2004-04-21 devnull 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
381 a31db67d 2004-04-21 devnull 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
382 a31db67d 2004-04-21 devnull 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
383 a31db67d 2004-04-21 devnull 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, /* greek */
384 a31db67d 2004-04-21 devnull 0x03a6, 0x0398, 0x2126, 0x03b4, 0x221e, 0x2205, 0x2208, 0x2229,
385 a31db67d 2004-04-21 devnull 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, /* math */
386 a31db67d 2004-04-21 devnull 0x00b0, 0x2022, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x220e, 0x00a0,
387 a31db67d 2004-04-21 devnull };
388 a31db67d 2004-04-21 devnull struct convert convert[] =
389 a31db67d 2004-04-21 devnull { /* if two entries have the same name, put the from one first */
390 a31db67d 2004-04-21 devnull { "8859-1", "Latin-1 (Western and Northern Europe including Italian)", Table, (void *)tab8859_1 },
391 a31db67d 2004-04-21 devnull { "8859-2", "Latin-2 (Eastern Europe except Turkey and the Baltic countries)", Table, (void *)tab8859_2 },
392 a31db67d 2004-04-21 devnull { "8859-3", "Latin-3 (Mediterranean, South Africa, Esperanto)", Table, (void *)tab8859_3 },
393 a31db67d 2004-04-21 devnull { "8859-4", "Latin-4 (Scandinavia and the Baltic countries; obsolete)", Table, (void *)tab8859_4 },
394 a31db67d 2004-04-21 devnull { "8859-5", "Part 5 (Cyrillic)", Table, (void *)tab8859_5 },
395 a31db67d 2004-04-21 devnull { "8859-6", "Part 6 (Arabic)", Table, (void *)tab8859_6 },
396 a31db67d 2004-04-21 devnull { "8859-7", "Part 7 (Greek)", Table, (void *)tab8859_7 },
397 a31db67d 2004-04-21 devnull { "8859-8", "Part 8 (Hebrew)", Table, (void *)tab8859_8 },
398 a31db67d 2004-04-21 devnull { "8859-9", "Latin-5 (Turkey, Western Europe except Icelandic and Faroese)", Table, (void *)tab8859_9 },
399 a31db67d 2004-04-21 devnull { "8859-10", "Latin-6 (Northern Europe)", Table, (void *)tab8859_10 },
400 a31db67d 2004-04-21 devnull { "8859-15", "Latin-9 (Western Europe)", Table, (void *)tab8859_15 },
401 35d26aa3 2005-12-26 devnull { "ascii", "7-bit ASCII", Table, (void *)tabascii },
402 35d26aa3 2005-12-26 devnull { "atari", "ATARI-ST character set", Table, (void *)tabatari },
403 a31db67d 2004-04-21 devnull { "av", "Alternativnyj Variant", Table, (void *)tabav },
404 35d26aa3 2005-12-26 devnull { "big5", "Big 5 (HKU)", From|Func, 0, (Fnptr)big5_in },
405 35d26aa3 2005-12-26 devnull { "big5", "Big 5 (HKU)", Func, 0, (Fnptr)big5_out },
406 90557256 2006-01-19 devnull { "cp437", "Code Page 437 (US)", Table, (void*)tabcp437 },
407 90557256 2006-01-19 devnull { "cp720", "Code Page 720 (Arabic)", Table, (void*)tabcp720 },
408 90557256 2006-01-19 devnull { "cp737", "Code Page 737 (Greek)", Table, (void*)tabcp737 },
409 90557256 2006-01-19 devnull { "cp775", "Code Page 775 (Baltic)", Table, (void*)tabcp775 },
410 90557256 2006-01-19 devnull { "cp850", "Code Page 850 (Multilingual Latin I)", Table, (void*)tabcp850 },
411 90557256 2006-01-19 devnull { "cp852", "Code Page 852 (Latin II)", Table, (void*)tabcp852 },
412 90557256 2006-01-19 devnull { "cp855", "Code Page 855 (Cyrillic)", Table, (void*)tabcp855 },
413 90557256 2006-01-19 devnull { "cp857", "Code Page 857 (Turkish)", Table, (void*)tabcp857 },
414 90557256 2006-01-19 devnull { "cp858", "Code Page 858 (Multilingual Latin I+Euro)", Table, (void*)tabcp858 },
415 90557256 2006-01-19 devnull { "cp862", "Code Page 862 (Hebrew)", Table, (void*)tabcp862 },
416 90557256 2006-01-19 devnull { "cp866", "Code Page 866 (Russian)", Table, (void*)tabcp866 },
417 90557256 2006-01-19 devnull { "cp874", "Code Page 874 (Thai)", Table, (void*)tabcp874 },
418 90557256 2006-01-19 devnull { "cp1250", "Code Page 1250 (Central Europe)", Table, (void *)tabcp1250 },
419 90557256 2006-01-19 devnull { "cp1251", "Code Page 1251 (Cyrillic)", Table, (void *)tabcp1251 },
420 90557256 2006-01-19 devnull { "cp1252", "Code Page 1252 (Latin I)", Table, (void *)tabcp1252 },
421 90557256 2006-01-19 devnull { "cp1253", "Code Page 1253 (Greek)", Table, (void *)tabcp1253 },
422 90557256 2006-01-19 devnull { "cp1254", "Code Page 1254 (Turkish)", Table, (void *)tabcp1254 },
423 90557256 2006-01-19 devnull { "cp1255", "Code Page 1255 (Hebrew)", Table, (void *)tabcp1255 },
424 90557256 2006-01-19 devnull { "cp1256", "Code Page 1256 (Arabic)", Table, (void *)tabcp1256 },
425 90557256 2006-01-19 devnull { "cp1257", "Code Page 1257 (Baltic)", Table, (void *)tabcp1257 },
426 90557256 2006-01-19 devnull { "cp1258", "Code Page 1258 (Vietnam)", Table, (void *)tabcp1258 },
427 35d26aa3 2005-12-26 devnull { "ebcdic", "EBCDIC", Table, (void *)tabebcdic }, /* 6f is recommended bad map */
428 35d26aa3 2005-12-26 devnull { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", From|Func, 0, (Fnptr)uksc_in },
429 35d26aa3 2005-12-26 devnull { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", Func, 0, (Fnptr)uksc_out },
430 1a8bd157 2006-02-14 devnull { "gb", "GB2312-80 (Chinese)", From|Func, 0, (Fnptr)gb_in },
431 1a8bd157 2006-02-14 devnull { "gb", "GB2312-80 (Chinese)", Func, 0, (Fnptr)gb_out },
432 35d26aa3 2005-12-26 devnull { "html", "HTML", From|Func, 0, (Fnptr)html_in },
433 35d26aa3 2005-12-26 devnull { "html", "HTML", Func, 0, (Fnptr)html_out },
434 a31db67d 2004-04-21 devnull { "jis", "guesses at the JIS encoding", From|Func, 0, (Fnptr)jis_in },
435 1a8bd157 2006-02-14 devnull { "jis-kanji", "ISO 2022-JP (Japanese)", From|Func, 0, (Fnptr)jisjis_in },
436 1a8bd157 2006-02-14 devnull { "jis-kanji", "ISO 2022-JP (Japanese)", Func, 0, (Fnptr)jisjis_out },
437 35d26aa3 2005-12-26 devnull { "koi8", "KOI-8 (GOST 19769-74)", Table, (void *)tabkoi8 },
438 35d26aa3 2005-12-26 devnull { "latin1", "ISO 8859-1", Table, (void *)tab8859_1 },
439 90557256 2006-01-19 devnull { "macrom", "Macintosh Standard Roman character set", Table, (void *)tabmacroman },
440 90557256 2006-01-19 devnull { "microsoft", "Windows (CP 1252)", Table, (void *)tabcp1252 },
441 90557256 2006-01-19 devnull { "msdos", "IBM PC (CP 437)", Table, (void *)tabcp437 },
442 90557256 2006-01-19 devnull { "msdos2", "IBM PC (CP 437 with graphics in C0)", Table, (void *)tabmsdos2 },
443 a31db67d 2004-04-21 devnull { "ms-kanji", "Microsoft, or Shift-JIS", From|Func, 0, (Fnptr)msjis_in },
444 a31db67d 2004-04-21 devnull { "ms-kanji", "Microsoft, or Shift-JIS", Func, 0, (Fnptr)msjis_out },
445 a31db67d 2004-04-21 devnull { "next", "NEXTSTEP character set", Table, (void *)tabnextstep },
446 35d26aa3 2005-12-26 devnull { "ov", "Osnovnoj Variant", Table, (void *)tabov },
447 90557256 2006-01-19 devnull { "ps2", "IBM PS/2: (CP 850)", Table, (void *)tabcp850 },
448 35d26aa3 2005-12-26 devnull { "sf1", "ISO-646: Finnish/Swedish SF-1 variant", Table, (void *)tabsf1 },
449 35d26aa3 2005-12-26 devnull { "sf2", "ISO-646: Finnish/Swedish SF-2 variant (recommended)", Table, (void *)tabsf2 },
450 35d26aa3 2005-12-26 devnull { "tis", "Thai+ASCII (TIS 620-1986)", Table, (void *)tabtis620 },
451 35d26aa3 2005-12-26 devnull { "ucode", "Russian U-code", Table, (void *)tabucode },
452 35d26aa3 2005-12-26 devnull { "ujis", "EUC-JX: JIS 0208", From|Func, 0, (Fnptr)ujis_in },
453 35d26aa3 2005-12-26 devnull { "ujis", "EUC-JX: JIS 0208", Func, 0, (Fnptr)ujis_out },
454 a31db67d 2004-04-21 devnull { "unicode", "Unicode 1.1", From|Func, 0, (Fnptr)unicode_in },
455 a31db67d 2004-04-21 devnull { "unicode", "Unicode 1.1", Func, 0, (Fnptr)unicode_out },
456 35d26aa3 2005-12-26 devnull { "utf1", "UTF-1 (ISO 10646 Annex A)", From|Func, 0, (Fnptr)isoutf_in },
457 35d26aa3 2005-12-26 devnull { "utf1", "UTF-1 (ISO 10646 Annex A)", Func, 0, (Fnptr)isoutf_out },
458 35d26aa3 2005-12-26 devnull { "utf", "FSS-UTF a.k.a. UTF-8", From|Func, 0, (Fnptr)utf_in },
459 35d26aa3 2005-12-26 devnull { "utf", "FSS-UTF a.k.a. UTF-8", Func, 0, (Fnptr)utf_out },
460 a31db67d 2004-04-21 devnull { "utf-l2", "from", From|Func, 0, (Fnptr)utf_in },
461 a31db67d 2004-04-21 devnull { "utf-l2", "to", Func, 0, (Fnptr)utf_out },
462 35d26aa3 2005-12-26 devnull { "viet1", "Vietnamese VSCII-1 (1993)", Table, (void *)tabviet1 },
463 35d26aa3 2005-12-26 devnull { "viet2", "Vietnamese VSCII-2 (1993)", Table, (void *)tabviet2 },
464 35d26aa3 2005-12-26 devnull { "viscii", "Vietnamese VISCII 1.1 (1992)", Table, (void *)tabviscii },
465 a31db67d 2004-04-21 devnull { 0 },
466 a31db67d 2004-04-21 devnull };