Added support for charsets that can't display certain characters,
[infodrom/newmail] / 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)