src/cmd/idnconv/idnconv.c
author Andrzej Szeszo <aszeszo@gmail.com>
Sun, 17 Apr 2011 01:37:32 +0100
changeset 565 459f0c0bc498
parent 86 a71e5e19f4e9
permissions -rw-r--r--
Removed tag oi148b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
86
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     1
/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     2
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     3
 * Use is subject to license terms.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     4
 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     5
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     6
#pragma ident	"@(#)idnconv.c	1.2	04/06/18 SMI"
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     7
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     8
#include <stdlib.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
     9
#include <stdio.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    10
#include <errno.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    11
#include <sys/types.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    12
#include <sys/utsname.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    13
#include <ctype.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    14
#include <strings.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    15
#include <string.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    16
#include <idn/api.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    17
#include <locale.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    18
#include <langinfo.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    19
#include <limits.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    20
#include <iconv.h>
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    21
#include "idnconv.h"
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    22
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    23
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    24
/* Function prototypes: */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    25
void idnconv_usage(int);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    26
void idnconv_version(void);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    27
void doit(FILE *, int, char *, char *);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    28
char *increase_sz(char *, size_t *, FILE *, iconv_t);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    29
void really_doit(int, char *, char *, size_t, FILE *);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    30
char *simpler_iconv(char *, size_t *, char *, char *, FILE *);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    31
void cleanup_and_exit(int, FILE *, iconv_t);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    32
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    33
/* File-scope global variables: */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    34
static char *cs;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    35
static char *name;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    36
static size_t namesz;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    37
static char *icvbuf;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    38
static size_t icvbufsz;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    39
static char *outbuf;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    40
static size_t outbufsz;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    41
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    42
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    43
int
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    44
main(int ac, char **av)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    45
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    46
	int actions;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    47
	char *fromcode = (char *)NULL;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    48
	char *tocode = (char *)NULL;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    49
	int i;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    50
	char *p;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    51
	FILE *fi;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    52
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    53
	(void) setlocale(LC_ALL, "");
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    54
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    55
#if !defined(TEXT_DOMAIN)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    56
#define	TEXT_DOMAIN	"TEST_SUNW_I18N_CMD"
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    57
#endif
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    58
	(void) textdomain(TEXT_DOMAIN);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    59
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    60
	/* The default actions for the IDN conversions. */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    61
	actions = IDN_DELIMMAP | IDN_NAMEPREP | IDN_UNASCHECK | \
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    62
			IDN_ASCCHECK | IDN_IDNCONV | IDN_LENCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    63
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    64
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    65
	 * Let's process options and option arguments first; if there is
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    66
	 * anything that starts without '-', that means it's the start of
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    67
	 * operand(s).
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    68
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    69
	for (i = 1; i < ac; i++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    70
		if (av[i][0] == '-' && av[i][1] == '-') {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    71
			/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    72
			 * The "--" alone means there will be no more
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    73
			 * options but operand(s) from now on.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    74
			 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    75
			if (av[i][2] == '\0') {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    76
				++i;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    77
				break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    78
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    79
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    80
			if (OPTION("in") || OPTION("from")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    81
				if (++i >= ac) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    82
					(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    83
						"idnconv: error: in-code option argument is missing.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    84
					idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    85
					exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    86
				}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    87
				fromcode = av[i];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    88
			} else if (OPTION("out") || OPTION("to")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    89
				if (++i >= ac) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    90
					(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    91
						"idnconv: error: out-code option argument is missing.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    92
					idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    93
					exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    94
				}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    95
				tocode = av[i];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    96
			} else if (OPTION("asciicheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    97
				   OPTION("ascii-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    98
				actions |= IDN_ASCCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
    99
			} else if (OPTION("noasciicheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   100
				   OPTION("no-ascii-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   101
				actions &= (~(IDN_ASCCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   102
			} else if (OPTION("bidicheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   103
				   OPTION("bidi-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   104
				actions |= IDN_BIDICHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   105
			} else if (OPTION("nobidicheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   106
				   OPTION("no-bidi-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   107
				actions &= (~(IDN_BIDICHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   108
			} else if (OPTION("lengthcheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   109
				   OPTION("length-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   110
				actions |= IDN_LENCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   111
			} else if (OPTION("nolengthcheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   112
				   OPTION("no-length-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   113
				actions &= (~(IDN_LENCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   114
			} else if (OPTION("nameprep")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   115
				actions |= IDN_NAMEPREP;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   116
			} else if (OPTION("nonameprep") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   117
				   OPTION("no-nameprep")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   118
				actions &= (~(IDN_NAMEPREP));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   119
			} else if (OPTION("unassigncheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   120
				   OPTION("unassign-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   121
				actions |= IDN_UNASCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   122
			} else if (OPTION("nounassigncheck") ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   123
				   OPTION("no-unassign-check")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   124
				actions &= (~(IDN_UNASCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   125
			} else if (OPTION("help")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   126
				idnconv_usage(1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   127
				exit(IDNCONV_SUCCESS);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   128
			} else if (OPTION("version")) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   129
				idnconv_version();
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   130
				exit(IDNCONV_SUCCESS);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   131
			} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   132
				(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   133
					"idnconv: error: unknown option \"%s\" specified.\n"), av[i]);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   134
				idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   135
				exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   136
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   137
		} else if (av[i][0] == '-') {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   138
			if (av[i][1] == '\0') {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   139
				(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   140
					"idnconv: error: option letter missing.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   141
				idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   142
				exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   143
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   144
			for (p = av[i] + 1; *p; p++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   145
				switch (*p) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   146
				case 'i':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   147
				case 'f':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   148
					if (++i >= ac) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   149
						(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   150
							"idnconv: error: in-code option argument is missing.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   151
						idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   152
						exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   153
					}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   154
					fromcode = av[i];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   155
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   156
				case 'o':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   157
				case 't':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   158
					if (++i >= ac) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   159
						(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   160
							"idnconv: error: out-code option argument is missing.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   161
						idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   162
						exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   163
					}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   164
					tocode = av[i];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   165
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   166
				case 'a':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   167
					actions |= IDN_ASCCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   168
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   169
				case 'A':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   170
					actions &= (~(IDN_ASCCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   171
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   172
				case 'b':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   173
					actions |= IDN_BIDICHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   174
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   175
				case 'B':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   176
					actions &= (~(IDN_BIDICHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   177
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   178
				case 'l':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   179
					actions |= IDN_LENCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   180
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   181
				case 'L':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   182
					actions &= (~(IDN_LENCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   183
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   184
				case 'n':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   185
					actions |= IDN_NAMEPREP;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   186
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   187
				case 'N':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   188
					actions &= (~(IDN_NAMEPREP));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   189
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   190
				case 'u':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   191
					actions |= IDN_UNASCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   192
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   193
				case 'U':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   194
					actions &= (~(IDN_UNASCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   195
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   196
				case 'h':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   197
					idnconv_usage(1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   198
					exit(IDNCONV_SUCCESS);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   199
				case 'v':
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   200
					idnconv_version();
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   201
					exit(IDNCONV_SUCCESS);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   202
				default:
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   203
					(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   204
						"idnconv: error: unknown option letter '%c' specified.\n"), *p);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   205
					idnconv_usage(0);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   206
					exit(IDNCONV_ILLEGAL_OPTION);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   207
				}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   208
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   209
		} else
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   210
			break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   211
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   212
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   213
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   214
	 * Allocate the first memory blocks for the buffers that will be used.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   215
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   216
	namesz = icvbufsz = outbufsz = BUFSIZ;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   217
	name = (char *)malloc(namesz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   218
	icvbuf = (char *)malloc(icvbufsz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   219
	outbuf = (char *)malloc(outbufsz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   220
	if (name == (char *)NULL || icvbuf == (char *)NULL ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   221
	    outbuf == (char *)NULL) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   222
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   223
			"idnconv: error: no more memory.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   224
		exit(IDNCONV_NOT_ENOUGH_MEMORY);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   225
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   226
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   227
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   228
	 * Collect the codeset name of the current locale for later uses.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   229
	 * In some old systems, the nl_langinfo(CODESET) will return NULL or
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   230
	 * an empty string. For that case, we fallback to C locale's "646" for
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   231
	 * the completeness and correctness.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   232
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   233
	cs = nl_langinfo(CODESET);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   234
	if (cs == (char *)NULL || *cs == '\0') {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   235
		cs = "646";
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   236
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   237
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   238
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   239
	 * If there is no fromcode or tocode specified by the user, use
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   240
	 * the current locale's codeset.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   241
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   242
	if (fromcode == (char *)NULL)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   243
		fromcode = cs;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   244
	if (tocode == (char *)NULL)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   245
		tocode = cs;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   246
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   247
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   248
	 * Process any possible operand(s) and then do the actual conversion(s)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   249
	 * for each operand.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   250
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   251
	if (i >= ac) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   252
		doit(stdin, actions, fromcode, tocode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   253
	} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   254
		for (; i < ac; i++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   255
			fi = fopen(av[i], "r");
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   256
			if (fi == (FILE *)NULL) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   257
				(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   258
					"idnconv: error: cannot access the file \"%s\".\n"), av[i]);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   259
				cleanup_and_exit(IDNCONV_INPUT_FILE_NOT_FOUND,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   260
					fi, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   261
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   262
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   263
			doit(fi, actions, fromcode, tocode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   264
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   265
			(void) fclose(fi);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   266
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   267
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   268
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   269
	cleanup_and_exit(IDNCONV_SUCCESS, (FILE *)NULL, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   270
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   271
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   272
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   273
void
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   274
idnconv_usage(int help)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   275
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   276
	(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   277
"Usage: idnconv [ -i in-code | --in in-code | -f in-code | --from in-code ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   278
	[ -o out-code | --out out-code | -t out-code | --to out-code ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   279
	[ -a | --asciicheck | --ascii-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   280
	[ -A | --noasciicheck | --no-ascii-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   281
	[ -b | --bidicheck | --bidi-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   282
	[ -B | --nobidicheck | --no-bidi-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   283
	[ -l | --lengthcheck | --length-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   284
	[ -L | --nolengthcheck | --no-length-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   285
	[ -n | --nameprep ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   286
	[ -N | --nonameprep | --no-nameprep ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   287
	[ -u | --unassigncheck | --unassign-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   288
	[ -U | --nounassigncheck | --no-unassign-check ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   289
	[ -h | --help ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   290
	[ -v | --version ]\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   291
	[ file ... ]\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   292
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   293
	if (help) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   294
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   295
"\nThe 'idnconv' Internationalized Domain Name encoding conversion utility\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   296
reads from specified file(s) or stdin and writes converted result to stdout.\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   297
Refer to idnconv(1) man page for more detail.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   298
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   299
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   300
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   301
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   302
void
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   303
idnconv_version(void)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   304
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   305
	(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   306
"idnconv 1.0\n\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   307
Copyright 2004 Sun Microsystems, Inc.  All rights reserved.\n\
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   308
Use is subject to license terms.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   309
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   310
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   311
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   312
void
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   313
doit(FILE *fi, int actions, char *from, char *to)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   314
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   315
	char ib[BUFSIZ];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   316
	size_t len;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   317
	size_t i, j;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   318
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   319
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   320
	 * Initialize the indices and then continuously read a buffer amount
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   321
	 * and process name(s) in the input buffer; sometimes, a name could be
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   322
	 * splitted between two input buffer contents over two fread(3C) calls.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   323
	 * For each end of the process, reset the 'i' index for the next
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   324
	 * new input buffer.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   325
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   326
	for (i = j = 0; (len = fread((void *)ib, 1, BUFSIZ, fi)) > 0; i = 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   327
		for (; i < len; i++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   328
			/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   329
			 * In each loop, this extracts and accumulates a byte
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   330
			 * as a part of a name until there is either
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   331
			 * a white-space character of the POSIX/C locale or
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   332
			 * a user-supplied NULL byte embedded in the input,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   333
			 * i.e., a delimiter.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   334
			 *
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   335
			 * Any non-printables such as control characters
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   336
			 * will be screened out by idn_encodename(3EXT) and
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   337
			 * idn_decodename(3EXT) functions so don't worry
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   338
			 * about such characters here.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   339
			 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   340
			if (ib[i] == '\0' || WHITESPACE(ib[i])) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   341
				if (j > 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   342
					really_doit(actions, from, to, j, fi);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   343
					j = 0;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   344
				}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   345
				/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   346
				 * We make sure to putchar whatever we've
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   347
				 * gotten at here so that the output will
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   348
				 * resemble as much as possible of the input
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   349
				 * except the IDN names.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   350
				 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   351
				putchar(ib[i]);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   352
			} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   353
				if (j >= namesz)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   354
					name = increase_sz(name, &namesz, fi,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   355
						(iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   356
				name[j++] = ib[i];
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   357
			}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   358
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   359
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   360
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   361
	/* We might still have a name to process. */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   362
	if (j > 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   363
		really_doit(actions, from, to, j, fi);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   364
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   365
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   366
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   367
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   368
char *
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   369
increase_sz(char *s, size_t *sz, FILE *fi, iconv_t cd)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   370
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   371
	*sz += BUFSIZ;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   372
	s = (char *)realloc((void *)s, *sz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   373
	if (s == (char *)NULL) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   374
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   375
			"idnconv: error: no more memory.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   376
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   377
		cleanup_and_exit(IDNCONV_NOT_ENOUGH_MEMORY, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   378
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   379
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   380
	return (s);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   381
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   382
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   383
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   384
void
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   385
really_doit(int actions, char *from, char *to, size_t len, FILE *fi)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   386
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   387
	char *ib;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   388
	char *tmpp;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   389
	idn_result_t idnres;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   390
	int ret;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   391
	int i;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   392
	int to_encode;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   393
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   394
	/* First, we properly terminate the name. */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   395
	if (len >= namesz)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   396
		name = increase_sz(name, &namesz, fi, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   397
	name[len] = '\0';
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   398
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   399
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   400
	 * The idn_encodename(3EXT) and the idn_decodename(3EXT) expect
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   401
	 * a UTF-8 input argument string; if the "from" isn't UTF-8, then,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   402
	 * it need to be converted to a UTF-8 string via simpler_iconv().
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   403
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   404
	if (strcasecmp(from, "UTF-8") == 0 || strcasecmp(from, "UTF8") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   405
	    strcasecmp(from, "ACE") == 0 || strcasecmp(from, "Punycode") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   406
	    strcasecmp(from, "ASCII") == 0 || strcasecmp(from, "646") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   407
	    strcasecmp(from, "US-ASCII") == 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   408
		ib = name;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   409
	} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   410
		ib = simpler_iconv(name, &len, "UTF-8", from, fi);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   411
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   412
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   413
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   414
	 * Let's find out on whether to use the idn_decodename(3EXT), i.e.,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   415
	 * ACE name to non-ACE IDN name, or the idn_encodename(3EXT),
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   416
	 * non-ACE IDN name to ACE name.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   417
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   418
	if (strcasecmp(from, "ACE") == 0 || strcasecmp(from, "Punycode") == 0)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   419
		to_encode = 0;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   420
	else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   421
		to_encode = 1;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   422
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   423
		/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   424
		 * Need to also check actual contents of the name and
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   425
		 * decide if it should be a decode or an encode process.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   426
		 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   427
		if (len > 4 && strncasecmp(ib, ACE_PREFIX, 4) == 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   428
			to_encode = 0;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   429
			for (tmpp = ib + 4; *tmpp; tmpp++)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   430
				if (! isascii(*tmpp)) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   431
					to_encode = 1;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   432
					break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   433
				}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   434
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   435
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   436
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   437
	/* And, the "to" value finally decides on what to do. */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   438
	if (strcasecmp(to, "ACE") == 0 || strcasecmp(to, "Punycode") == 0)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   439
		to_encode = 1;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   440
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   441
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   442
	 * Do the IDN conversion.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   443
	 *
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   444
	 * If output buffer size is too small, we increase the output buffer
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   445
	 * size and then do the IDN conversion again. We only repeat such for
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   446
	 * MAX_CONV_LOOP times since doing such for the same input buffer
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   447
	 * for more than the MAX_CONV_LOOP times wouldn't really possible.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   448
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   449
	for (i = 0; i <= MAX_CONV_LOOP; i++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   450
		if (to_encode) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   451
			/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   452
			 * For the encoding process, we also do local mappings.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   453
			 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   454
			actions |= IDN_LOCALMAP;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   455
			idnres = idn_encodename(actions, ib, outbuf, outbufsz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   456
		} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   457
			/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   458
			 * For the decoding process, we also do round trip
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   459
			 * checking as specified in the RFC 3490. 
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   460
			 * We also clean IDN_LENCHECK bit since it is not
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   461
			 * a valid action for idn_decodename(3EXT).
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   462
			 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   463
			actions |= IDN_RTCHECK;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   464
			actions &= (~(IDN_LENCHECK));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   465
			idnres = idn_decodename(actions, ib, outbuf, outbufsz);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   466
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   467
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   468
		if (idnres != idn_buffer_overflow)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   469
			break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   470
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   471
		outbuf = increase_sz(outbuf, &outbufsz, fi, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   472
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   473
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   474
	if (idnres == idn_success) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   475
		if (strcasecmp(to, "UTF-8") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   476
		    strcasecmp(to, "UTF8") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   477
		    strcasecmp(to, "ACE") == 0 ||
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   478
		    strcasecmp(to, "Punycode") == 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   479
			tmpp = outbuf;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   480
		} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   481
			len = strlen(outbuf);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   482
			tmpp = simpler_iconv(outbuf, &len, to, "UTF-8", fi);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   483
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   484
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   485
		/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   486
		 * Since fprintf(3C) functions use locale methods, we better
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   487
		 * use fputc(3C) to avoid any possible collision with
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   488
		 * underlying locale methods.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   489
		 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   490
		while (*tmpp)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   491
			(void) putc(*tmpp++, stdout);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   492
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   493
		return;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   494
	} else  if (idnres == idn_invalid_encoding || idnres == idn_nomapping) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   495
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   496
			"idnconv: error: internal code conversion failed due to possible incomplete or illegal character(s).\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   497
		ret = IDNCONV_ICONV_INTERNAL_ERROR;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   498
	} else if (idnres == idn_invalid_name) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   499
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   500
			"idnconv: error: not supported internal code conversion name.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   501
		ret = IDNCONV_UNSUPPORTED_INCODE_OR_OUTCODE;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   502
	} else if (idnres == idn_invalid_length) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   503
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   504
			"idnconv: error: label length checking has failed.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   505
		ret = IDNCONV_LABEL_LENGTH_CHECK_FAILED;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   506
	} else if (idnres == idn_nomemory) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   507
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   508
			"idnconv: error: no more memory.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   509
		ret = IDNCONV_NOT_ENOUGH_MEMORY;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   510
	} else if (idnres == idn_prohibited) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   511
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   512
			"idnconv: error: prohibited, not allowed, or unassigned character(s) found.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   513
		ret = IDNCONV_UNASSIGNED_CHARACTER_FOUND;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   514
	} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   515
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   516
			"idnconv: error: unspecified failure happened.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   517
		ret = IDNCONV_UNKNOWN_FAILURE;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   518
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   519
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   520
	cleanup_and_exit(ret, fi, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   521
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   522
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   523
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   524
char *
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   525
simpler_iconv(char *s, size_t *len, char *tocode, char *fromcode, FILE *fi)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   526
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   527
	iconv_t cd;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   528
	char *ibp;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   529
	char *obp;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   530
	size_t ileft, oleft;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   531
	size_t ret;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   532
	int i, j;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   533
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   534
	cd = iconv_open((const char *)tocode, (const char *)fromcode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   535
	if (cd == (iconv_t)-1) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   536
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   537
			"idnconv: error: iconv from \"%s\" to \"%s\" is not supported.\n"), fromcode, tocode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   538
		cleanup_and_exit(IDNCONV_UNSUPPORTED_INCODE_OR_OUTCODE, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   539
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   540
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   541
	ibp = s;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   542
	ileft = *len;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   543
	obp = icvbuf;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   544
	oleft = icvbufsz;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   545
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   546
	for (i = 0; i <= MAX_CONV_LOOP; i++) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   547
		ret = iconv(cd, (const char **)&ibp, &ileft, &obp, &oleft);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   548
		if (ret == 0)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   549
			break;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   550
		else if (ret > 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   551
			/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   552
			 * We had non-identical code conversion and that ain't
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   553
			 * good to be used as host or domain name; as the man
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   554
			 * page specifies, exit with a failure code.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   555
			 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   556
			(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   557
				"idnconv: error: internal iconv code conversion encountered character(s) that cannot be converted to \"%s\" codeset.\n"), tocode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   558
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   559
			cleanup_and_exit(IDNCONV_ICONV_NON_IDENTICAL_MAPPING,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   560
				fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   561
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   562
		
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   563
		/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   564
		 * The only valid errno that we expect is E2BIG; if that's
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   565
		 * the case indeed, we increase the output buffer size and
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   566
		 * try again. (We will do this only MAX_CONV_LOOP times;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   567
		 * if it needs more than MAX_CONV_LOOP times of output buffer
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   568
		 * size increases, that means the underlying iconv code
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   569
		 * conversion is most likely bad or something like that;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   570
		 * we abort in that case.)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   571
		 *
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   572
		 * Any other errno means we have encountered a problem, e.g.,
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   573
		 * an illegal character in the input buffer, an incomplete
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   574
		 * character at the end of the input buffer, conversion
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   575
		 * descriptor 'cd' is somehow bad or corrupted, or something
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   576
		 * unknown.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   577
		 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   578
		if (errno == E2BIG) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   579
			j = icvbufsz - oleft;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   580
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   581
			icvbuf = increase_sz(icvbuf, &icvbufsz, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   582
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   583
			obp = icvbuf + j;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   584
			oleft += BUFSIZ;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   585
		} else {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   586
			(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   587
				"idnconv: error: internal iconv code conversion failed.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   588
			cleanup_and_exit(IDNCONV_ICONV_INTERNAL_ERROR, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   589
		}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   590
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   591
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   592
	if (i > MAX_CONV_LOOP) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   593
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   594
			"idnconv: error: internal iconv code conversion failed.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   595
		cleanup_and_exit(IDNCONV_ICONV_INTERNAL_ERROR, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   596
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   597
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   598
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   599
	 * We now reset the conversion state and collect any state reset
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   600
	 * values or remnants in the conversion before closing the iconv.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   601
	 * It is quite unlikely that we will get out more than 256 bytes
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   602
	 * for the reset operation; if so, it will be treated as an error...
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   603
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   604
	ibp = (char *)NULL;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   605
	ileft = 0;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   606
	if (oleft < 256) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   607
		j = icvbufsz - oleft;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   608
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   609
		icvbuf = increase_sz(icvbuf, &icvbufsz, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   610
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   611
		obp = icvbuf + j;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   612
		oleft += BUFSIZ;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   613
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   614
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   615
	ret = iconv(cd, (const char **)&ibp, &ileft, &obp, &oleft);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   616
	if (ret > 0) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   617
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   618
			"idnconv: error: internal iconv code conversion encountered character(s) that cannot be converted to \"%s\".\n"), tocode);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   619
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   620
		cleanup_and_exit(IDNCONV_ICONV_NON_IDENTICAL_MAPPING, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   621
	} else if (ret == (size_t)-1) {
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   622
		(void) fprintf(stderr, gettext(
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   623
			"idnconv: error: internal iconv code conversion failed.\n"));
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   624
		cleanup_and_exit(IDNCONV_ICONV_INTERNAL_ERROR, fi, cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   625
	}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   626
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   627
	(void) iconv_close(cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   628
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   629
	/*
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   630
	 * Now calculate the length and then append '\0' at the end of
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   631
	 * the icvbuf to make it a string.
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   632
	 */
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   633
	*len = icvbufsz - oleft;
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   634
	if (*len >= icvbufsz)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   635
		icvbuf = increase_sz(icvbuf, &icvbufsz, fi, (iconv_t)-1);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   636
	icvbuf[*len] = '\0';
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   637
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   638
	return (icvbuf);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   639
}
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   640
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   641
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   642
void
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   643
cleanup_and_exit(int ret, FILE *fp, iconv_t cd)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   644
{
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   645
	free((void *)name);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   646
	free((void *)icvbuf);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   647
	free((void *)outbuf);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   648
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   649
	(void) fflush(stdout);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   650
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   651
	if (fp)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   652
		(void) fclose(fp);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   653
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   654
	if (cd != (iconv_t)-1)
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   655
		(void) iconv_close(cd);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   656
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   657
	exit(ret);
a71e5e19f4e9 import idnconv cmd from en_US.UTF-8 ws
jenda
parents:
diff changeset
   658
}