Added support for charsets that can't display certain characters, upstream_newmail_0-4
authorJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 22:20:48 +0000 (22:20 +0000)
committerJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 22:20:48 +0000 (22:20 +0000)
which will then be replaced by question marks

charset.c

index 1585683..a608829 100644 (file)
--- a/charset.c
+++ b/charset.c
@@ -20,6 +20,7 @@
 #include <langinfo.h>
 #include <string.h>
 #include <iconv.h>
+#include <errno.h>
 
 char *charset = NULL;
 
@@ -60,7 +61,23 @@ char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outby
   inptr = inbuf;
   outptr = outbuf;
 
-  nconv = iconv (cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
+  while (1) {
+    nconv = iconv (cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
+
+    if (nconv != -1)
+      break;
+
+    if (errno == EILSEQ && outsize-outbytesleft >= 0 && outbytesleft > 1) {
+      outbuf[outsize-outbytesleft] = '?';
+      outbuf[outsize-outbytesleft+1] = '\0';
+      outbytesleft--;
+      inbytesleft--;
+      outptr++;
+      inptr++;
+    } else
+      break;
+  }
+
   iconv_close(cd);
 
   if (nconv == -1 && outsize-outbytesleft >= 0)