about summary refs log tree commit diff
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.tar.gz
glibc-85830c4c4688b30d3d76111aa9a26745c7b141d6.tar.xz
glibc-85830c4c4688b30d3d76111aa9a26745c7b141d6.zip
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 1ac23e019c..56a2014268 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;