aboutsummaryrefslogtreecommitdiff
path: root/iconv/iconv_prog.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-06 03:16:30 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-06 03:16:30 +0000
commit85830c4c4688b30d3d76111aa9a26745c7b141d6 (patch)
tree8b2b99b4e538983ac760fb4faa94ce0a42121fa2 /iconv/iconv_prog.c
parentb0f1ca68448e9049cb6d266f327ca36523f3f675 (diff)
downloadglibc-85830c4c4688b30d3d76111aa9a26745c7b141d6.zip
glibc-85830c4c4688b30d3d76111aa9a26745c7b141d6.tar.gz
glibc-85830c4c4688b30d3d76111aa9a26745c7b141d6.tar.bz2
Update.
* iconv/gconv.h (__GCONV_IS_LAST, __GCONV_IGNORE_ERRORS): Define. (struct __gconv_step_data): Rename __is_last to __flags. * iconv/gconv_close.c: Change all uses of __is_last. * iconv/skeleton.c: Likewise. * iconvdata/iso-2022-cn.c: Likewise. * iconvdata/iso-2022-jp.c: Likewise. * iconvdata/iso-2022-kr.c: Likewise. * iconv/gconv_open.c: Likewise. Avoid unneeded initializations. Recognize IGNORE error handling, set flag, and remove from name. * iconv/loop.c (ignore_errors_p): Define. Add flags parameter to both functions. * iconv/skeleton.c: Pass flags to all conversion functions. * iconv/gconv_simple.c: Add flags parameter to all functions. Don't return error for invald error if ignore flag is set. (ucs4_internal_loop_single): Add missing pointer increment. (internal_ucs4le_loop_single): Likewise. * iconv/iconv_prog.c: Implement handling of -c parameter. * iconvdata/8bit-gap.c: Don't return error for invald error if ignore flag is set. * iconvdata/8bit-generic.c: Likewise. * iconvdata/ansi_x3.110.c: Likewise. * iconvdata/big5.c: Likewise. * iconvdata/big5hkscs.c: Likewise. * iconvdata/euc-cn.c: Likewise. * iconvdata/euc-jp.c: Likewise. * iconvdata/euc-kr.c: Likewise. * iconvdata/gbgbk.c: Likewise. * iconvdata/gbk.c: Likewise. * iconvdata/iso-2022-cn.c: Likewise. * iconvdata/iso-2022-jp.c: Likewise. * iconvdata/iso-2022-kr.c: Likewise. * iconvdata/iso646.c: Likewise. * iconvdata/iso8859-1.c: Likewise. * iconvdata/iso_6937-2.c: Likewise. * iconvdata/iso_6937.c: Likewise. * iconvdata/johab.c: Likewise. * iconvdata/sjis.c: Likewise. * iconvdata/t.61.c: Likewise. * iconvdata/uhc.c: Likewise. * iconvdata/unicode.c: Likewise. * iconvdata/utf-16.c: Likewise. * libio/fileops.c: Likewise. * libio/iofwide.c: Likewise. * wcsmbs/btowc.c: Likewise. * wcsmbs/mbrtowc.c: Likewise. * wcsmbs/mbsnrtowcs.c: Likewise. * wcsmbs/mbsrtowcs.c: Likewise. * wcsmbs/wcrtomb.c: Likewise. * wcsmbs/wcsnrtombs.c: Likewise. * wcsmbs/wcsrtombs.c: Likewise. * wcsmbs/wctob.c: Likewise. * iconvdata/ksc5601.h (ksc5601_to_ucs4): Undo *s change in all cases of
Diffstat (limited to 'iconv/iconv_prog.c')
-rw-r--r--iconv/iconv_prog.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
index 1ac23e0..56a2014 100644
--- a/iconv/iconv_prog.c
+++ b/iconv/iconv_prog.c
@@ -97,6 +97,9 @@ static int verbose;
/* Nonzero if list of all coded character sets is wanted. */
static int list;
+/* If nonzero omit invalid character from output. */
+static int omit_invalid;
+
/* Prototypes for the functions doing the actual work. */
static int process_block (iconv_t cd, char *addr, size_t len, FILE *output);
static int process_fd (iconv_t cd, int fd, FILE *output);
@@ -111,6 +114,7 @@ main (int argc, char *argv[])
int remaining;
FILE *output;
iconv_t cd;
+ const char *orig_to_code;
/* Set locale via LC_ALL. */
setlocale (LC_ALL, "");
@@ -138,15 +142,48 @@ main (int argc, char *argv[])
if (to_code == NULL)
error (EXIT_FAILURE, 0, _("target encoding not specified using `-t'"));
+ /* If we have to ignore errors make sure we use the appropriate name for
+ the to-character-set. */
+ orig_to_code = to_code;
+ if (omit_invalid)
+ {
+ const char *errhand = strchrnul (to_code, '/');
+ int nslash = 2;
+ char *newp;
+ char *cp;
+
+ if (*errhand == '/')
+ {
+ --nslash;
+ errhand = strchrnul (errhand, '/');
+
+ if (*errhand == '/')
+ {
+ --nslash;
+ ++errhand;
+ }
+ }
+
+ newp = (char *) alloca (errhand - to_code + nslash + 6 + 1);
+ cp = mempcpy (newp, to_code, errhand - to_code);
+ while (nslash > 0)
+ *cp++ = '/';
+ memcpy (cp, "NEEDED", sizeof ("NEEDED"));
+
+ to_code = newp;
+ }
+
/* Let's see whether we have these coded character sets. */
cd = iconv_open (to_code, from_code);
if (cd == (iconv_t) -1)
{
if (errno == EINVAL)
- error (EXIT_FAILURE, 0, _("conversion from `%s' to `%s' not supported"),
- from_code, to_code);
+ error (EXIT_FAILURE, 0,
+ _("conversion from `%s' to `%s' not supported"),
+ from_code, orig_to_code);
else
- error (EXIT_FAILURE, errno, _("failed to start conversion processing"));
+ error (EXIT_FAILURE, errno,
+ _("failed to start conversion processing"));
}
/* Determine output file. */
@@ -274,9 +311,8 @@ parse_opt (int key, char *arg, struct argp_state *state)
about missing character or so. */
break;
case 'c':
- /* Omit invalid characters from output.
- XXX This option will become a meaning once we have different
- modes of operation for the conversion functions. */
+ /* Omit invalid characters from output. */
+ omit_invalid = 1;
break;
case OPT_VERBOSE:
verbose = 1;