Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib-src/mule/coco.c Mon Aug 13 09:02:59 2007 +0200 @@ -0,0 +1,135 @@ +#include <stdio.h> +#include "mulelib.h" + +#define IN_BUF_SIZE 4096 +#define OUT_BUF_SIZE (IN_BUF_SIZE * 5 + CONV_BUF_EXTRA) + +static char *coco_version = "2.2"; + +static int +strpcmp(p0, p1) + char **p0, **p1; +{ + return strcmp(*p0, *p1); +} + +coco_list(stream) + FILE *stream; +{ + int i, j, k, clm, len, maxlen; + char **names; + + names = (char **)malloc((sizeof names[0]) * n_base_coding_system); + maxlen = 0; + for (i = 0; i < n_base_coding_system; i++) { + names[i] = coding_system_table[i].name; + len = strlen(names[i]); + if (len > maxlen) maxlen = len; + } + qsort (names, n_base_coding_system, sizeof names[0], strpcmp); + + maxlen += 2; + clm = 79 / maxlen; + k = n_base_coding_system / clm; + if (n_base_coding_system % clm) k++; + fprintf (stream, "You can specify the following coding-systems:\n"); + for (i = 0; i < k; i++) { + len = 0; + for (j = 0; j < clm; j++) { + if (i + j * k < n_base_coding_system) { + if (len < maxlen * j) + while (len < maxlen * j) { + putc(' ', stream); + len++; + } + fprintf (stream, " %s", names[i + j * k]); + len += strlen(names[i + j * k]) + 2; + } + } + putc ('\n', stream); + } + fprintf (stream, "You can add \"unix*\", \"dos*\", or \"mac*\""); + fprintf (stream, " at the tail of these names\n"); + fprintf (stream, " to specify type of end-of-line"); + fprintf (stream, "(LF[default], CRLF, or CR).\n"); + + free(names); + + return 0; +} + +main(argc, argv) + int argc; + char **argv; +{ + int help = 0, list = 0, verbose = 0, query = 0; + int in_total = 0, out_total = 0, n; + char inbuf[IN_BUF_SIZE], outbuf[OUT_BUF_SIZE]; + char *inname = NULL, *outname = NULL; + coding_type incode, outcode; + + if (mulelib_initialize(argc, argv, NULL, NULL) < 0) { + fprintf(stderr, "Initialization of Mule libarary failed.\n"); + exit(1); + } + + while (--argc > 0) { + argv++; + if (!strcmp(*argv, "-h")) { help = list = 1; break; } + if (!strcmp(*argv, "-l")) { list = 1; break; } + if (!strcmp(*argv, "-v")) { verbose = 1; continue; } + if (!strcmp(*argv, "-q")) { query = 1; continue; } + if (!query) { + if (outname != NULL) inname = outname; + outname = *argv; + } + } + + if (help) { + printf("Version %s (mulelib version %s)\n", + coco_version, mule_library_version); + printf("Usage: coco [-h|-l|-v|-q] [[INCODE] OUTCODE] <INFILE >OUTFILE\n"); + printf(" -h: print this message\n"); + printf(" -l: list valid INCODE and OUTCODE\n"); + printf(" -v: print information about conversion\n"); + printf(" -q: just investigate how INFILE is encoded\n"); + printf(" INCODE: coding-system of INFILE, defaults to `*autoconv*'\n"); + printf(" OUTCODE: coding-system of OUTFILE, defaults to `*internal*'\n"); + } + + if (list) { + coco_list(stdout); + exit(0); + } + + if (set_coding_system(inname, &incode, outname, &outcode) < 0) { + fprintf(stderr, "%s\n", mule_error_msg); + exit(1); + } + + while ((n = read(0, inbuf, sizeof inbuf)) > 0) { + in_total += n; + if ((n = code_conversion(&incode, inbuf, n, &outcode, outbuf, + OUT_BUF_SIZE)) < 0) { + if (!query) write(1, outbuf, OUT_BUF_SIZE); + exit(1); + } + if (!query && n > 0) write(1, outbuf, n); + out_total += n; + } + + if (query) { + fprintf(stderr, "In (%s): %6d bytes\n", incode.name, in_total); + exit(0); + } + + /* Flush out an unfinished state (e.g. terminating with "ESC ( B"). */ + n = code_conversion(&incode, inbuf, 0, &outcode, outbuf, OUT_BUF_SIZE); + if (n > 0) write(1, outbuf, n); + out_total += n; + + if (verbose) + fprintf(stderr, "In :%6d bytes of %s\nOut:%6d bytes of %s\n", + in_total, incode.name, out_total, outcode.name); + exit(0); +}