about summary refs log tree commit diff
path: root/iconv/iconv_prog.c
diff options
context:
space:
mode:
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;