Mercurial > hg > xemacs-beta
comparison lib-src/mule/coco.c @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
69:804d1389bcd6 | 70:131b0175ea99 |
---|---|
1 #include <stdio.h> | |
2 #include "mulelib.h" | |
3 | |
4 #define IN_BUF_SIZE 4096 | |
5 #define OUT_BUF_SIZE (IN_BUF_SIZE * 5 + CONV_BUF_EXTRA) | |
6 | |
7 static char *coco_version = "2.2"; | |
8 | |
9 static int | |
10 strpcmp(p0, p1) | |
11 char **p0, **p1; | |
12 { | |
13 return strcmp(*p0, *p1); | |
14 } | |
15 | |
16 coco_list(stream) | |
17 FILE *stream; | |
18 { | |
19 int i, j, k, clm, len, maxlen; | |
20 char **names; | |
21 | |
22 names = (char **)malloc((sizeof names[0]) * n_base_coding_system); | |
23 maxlen = 0; | |
24 for (i = 0; i < n_base_coding_system; i++) { | |
25 names[i] = coding_system_table[i].name; | |
26 len = strlen(names[i]); | |
27 if (len > maxlen) maxlen = len; | |
28 } | |
29 qsort (names, n_base_coding_system, sizeof names[0], strpcmp); | |
30 | |
31 maxlen += 2; | |
32 clm = 79 / maxlen; | |
33 k = n_base_coding_system / clm; | |
34 if (n_base_coding_system % clm) k++; | |
35 fprintf (stream, "You can specify the following coding-systems:\n"); | |
36 for (i = 0; i < k; i++) { | |
37 len = 0; | |
38 for (j = 0; j < clm; j++) { | |
39 if (i + j * k < n_base_coding_system) { | |
40 if (len < maxlen * j) | |
41 while (len < maxlen * j) { | |
42 putc(' ', stream); | |
43 len++; | |
44 } | |
45 fprintf (stream, " %s", names[i + j * k]); | |
46 len += strlen(names[i + j * k]) + 2; | |
47 } | |
48 } | |
49 putc ('\n', stream); | |
50 } | |
51 fprintf (stream, "You can add \"unix*\", \"dos*\", or \"mac*\""); | |
52 fprintf (stream, " at the tail of these names\n"); | |
53 fprintf (stream, " to specify type of end-of-line"); | |
54 fprintf (stream, "(LF[default], CRLF, or CR).\n"); | |
55 | |
56 free(names); | |
57 | |
58 return 0; | |
59 } | |
60 | |
61 main(argc, argv) | |
62 int argc; | |
63 char **argv; | |
64 { | |
65 int help = 0, list = 0, verbose = 0, query = 0; | |
66 int in_total = 0, out_total = 0, n; | |
67 char inbuf[IN_BUF_SIZE], outbuf[OUT_BUF_SIZE]; | |
68 char *inname = NULL, *outname = NULL; | |
69 coding_type incode, outcode; | |
70 | |
71 if (mulelib_initialize(argc, argv, NULL, NULL) < 0) { | |
72 fprintf(stderr, "Initialization of Mule libarary failed.\n"); | |
73 exit(1); | |
74 } | |
75 | |
76 while (--argc > 0) { | |
77 argv++; | |
78 if (!strcmp(*argv, "-h")) { help = list = 1; break; } | |
79 if (!strcmp(*argv, "-l")) { list = 1; break; } | |
80 if (!strcmp(*argv, "-v")) { verbose = 1; continue; } | |
81 if (!strcmp(*argv, "-q")) { query = 1; continue; } | |
82 if (!query) { | |
83 if (outname != NULL) inname = outname; | |
84 outname = *argv; | |
85 } | |
86 } | |
87 | |
88 if (help) { | |
89 printf("Version %s (mulelib version %s)\n", | |
90 coco_version, mule_library_version); | |
91 printf("Usage: coco [-h|-l|-v|-q] [[INCODE] OUTCODE] <INFILE >OUTFILE\n"); | |
92 printf(" -h: print this message\n"); | |
93 printf(" -l: list valid INCODE and OUTCODE\n"); | |
94 printf(" -v: print information about conversion\n"); | |
95 printf(" -q: just investigate how INFILE is encoded\n"); | |
96 printf(" INCODE: coding-system of INFILE, defaults to `*autoconv*'\n"); | |
97 printf(" OUTCODE: coding-system of OUTFILE, defaults to `*internal*'\n"); | |
98 } | |
99 | |
100 if (list) { | |
101 coco_list(stdout); | |
102 exit(0); | |
103 } | |
104 | |
105 if (set_coding_system(inname, &incode, outname, &outcode) < 0) { | |
106 fprintf(stderr, "%s\n", mule_error_msg); | |
107 exit(1); | |
108 } | |
109 | |
110 while ((n = read(0, inbuf, sizeof inbuf)) > 0) { | |
111 in_total += n; | |
112 if ((n = code_conversion(&incode, inbuf, n, &outcode, outbuf, | |
113 OUT_BUF_SIZE)) < 0) { | |
114 if (!query) write(1, outbuf, OUT_BUF_SIZE); | |
115 exit(1); | |
116 } | |
117 if (!query && n > 0) write(1, outbuf, n); | |
118 out_total += n; | |
119 } | |
120 | |
121 if (query) { | |
122 fprintf(stderr, "In (%s): %6d bytes\n", incode.name, in_total); | |
123 exit(0); | |
124 } | |
125 | |
126 /* Flush out an unfinished state (e.g. terminating with "ESC ( B"). */ | |
127 n = code_conversion(&incode, inbuf, 0, &outcode, outbuf, OUT_BUF_SIZE); | |
128 if (n > 0) write(1, outbuf, n); | |
129 out_total += n; | |
130 | |
131 if (verbose) | |
132 fprintf(stderr, "In :%6d bytes of %s\nOut:%6d bytes of %s\n", | |
133 in_total, incode.name, out_total, outcode.name); | |
134 exit(0); | |
135 } |