File: jconv.c

package info (click to toggle)
libjconv 2.8-4.0
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 124 kB
  • ctags: 46
  • sloc: ansic: 567; makefile: 99
file content (89 lines) | stat: -rw-r--r-- 1,983 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

/* $Id: jconv.c,v 1.3 2000/04/13 22:07:31 a Exp $ */

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <errno.h>
#include "jconv.h"

void
usage (const char *argv0)
{
	fprintf(stderr,
		"Usage: %s [-v] [-c config_file] "
		"[to_codeset [from_codeset ...]]\n",
		argv0);
	exit(1);
}

int
main (int argc, char **argv)
{
	int i, num_src_codesets = 0, verbose = 0, actual_codeset;
	char *conffile = NULL;
	char **src_codesets = NULL;
	char *dest_codeset = NULL;
	int error_code;
        char *src, *dest;
        size_t len, dlen;

        setlocale(LC_ALL, "");
	
	for (i = 1; i < argc; i++) {
		if (strcmp(argv[i], "-c") == 0) {
			i++;
			if (i >= argc)
				usage(argv[0]);
			conffile = argv[2];
		} else if (strcmp(argv[i], "-v") == 0) {
			verbose = 1;
		} else if (argv[i][0] == '-') {
			usage(argv[0]);
		} else if (dest_codeset == NULL) {
			dest_codeset = argv[i];
		} else {
			src_codesets = realloc(src_codesets,
					       (num_src_codesets + 1) *
					       sizeof (*src_codesets));
			src_codesets[num_src_codesets++] = argv[i];
		}
	}
	if (conffile)
		jconv_info_init(conffile);
	
        for (len = 0, src = NULL; !feof(stdin); ) {
                src = realloc(src, len + 4096);
                len += fread(src + len, 1, 4096, stdin);
        }
	if (ferror(stdin)) {
		perror("jconv(stdin)");
		exit(1);
	}
        src[len] = 0;
	
	error_code = jconv_alloc_conv_autodetect(src, len, &dest, &dlen,
						 (const char **)src_codesets,
						 num_src_codesets,
						 &actual_codeset,
						 dest_codeset);
	if (verbose) {
		if (num_src_codesets == 0)
			src_codesets = (void *)jconv_info_get_pref_codesets (
				&num_src_codesets);
		fprintf(stderr, "jconv: actual codeset: %s\n",
			src_codesets[actual_codeset]);
	}
	if (error_code) {
		errno = error_code;
		perror("jconv(jconv_alloc_conv_autodetect)");
		exit(1);
	}
	fwrite(dest, dlen, 1, stdout);
	fflush(stdout);
	if (ferror(stdout)) {
		perror("jconv(stdout)");
		exit(1);
	}
	return 0;
}