48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * This file and its contents are supplied under the terms of the
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * You may only use this file in accordance with the terms of version
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * 1.0 of the CDDL.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * A full copy of the text of the CDDL should have accompanied this
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * source. A copy of the CDDL is also available via the Internet at
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * iconv(1) command.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Rossextern int list_codesets(void);
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Rosssize_t (*pconv)(const char **iptr, size_t *ileft,
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Rosslib_iconv(const char **iptr, size_t *ileft, char **optr, size_t *oleft)
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross "usage: %s [-cs] [-f from-codeset] [-t to-codeset] "
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross (void) fprintf(stderr, gettext("\t%s -l\n"), progname);
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross while ((c = getopt(argc, argv, "cdlsf:t:")) != EOF) {
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross switch (c) {
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross if (from_cs != NULL || to_cs != NULL || optind != argc)
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * If either "from" or "to" contains a slash,
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * then we're using charmaps.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("Not supported %s to %s\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("iconv_open failed: %s\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross (optind == argc - 1 && 0 == strcmp(argv[optind], "-"))) {
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Conversion buffer sizes:
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * The input buffer has room to prepend one mbs character if needed for
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * handling a left-over at the end of a previous conversion buffer.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Conversions may grow or shrink data, so using a larger output buffer
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * to reduce the likelihood of leftover input buffer data in each pass.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross while ((nr = fread(ibuf+MB_LEN_MAX, 1, BUFSIZ, fp)) > 0) {
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Note: the *pconv function is either iconv(3c) or our
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * private equivalent when using charmaps. Both update
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * ileft, oleft etc. even when conversion stops due to
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * an illegal sequence or whatever, so we need to copy
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * the partially converted buffer even on error.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("Incomplete sequence in %s at offset %lld\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Copy the remainder to the space reserved
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * at the start of the input buffer.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross continue; /* read again */
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Should not see ileft > MB_LEN_MAX,
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * but if we do, handle as EILSEQ.
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross /* FALLTHROUGH */
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("Illegal sequence in %s at offset %lld\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("bad seq: \\x%02x\\x%02x\\x%02x\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross /* skip one */
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross _("iconv error (%s) in file $s at offset %lld\n"),
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross /* normal iconv return */
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * End of file
48edc7cf07b5dccc3ad84bf2dafe4150bd666d60Gordon Ross * Flush any shift encodings.