X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/012d05c2b62332eb400d66b806e48216d39358c6..3910a511d4d9ad19e5eeff769881f4e52f498947:/uip/mhshowsbr.c diff --git a/uip/mhshowsbr.c b/uip/mhshowsbr.c index 056c2f45..093c9776 100644 --- a/uip/mhshowsbr.c +++ b/uip/mhshowsbr.c @@ -126,11 +126,12 @@ show_all_messages (CT *cts, int concatsw, int textonly, int inlineonly) ct = *ctp; /* if top-level type is ok, then display message */ - if (type_ok (ct, 1)) + if (type_ok (ct, 1)) { if (headersw) output_header(ct, hfmt); show_single_message (ct, formsw, concatsw, textonly, inlineonly, mfmt); + } } free_markercomps(); @@ -369,7 +370,7 @@ show_content_aux (CT ct, int alternate, char *cp, char *cracked, struct format * return NOTOK; } else { char *charset = content_charset (ct); - admonish (NULL, "unable to convert character set%s%s to %s", + admonish (NULL, "unable to convert character set%s%s from %s", ct->c_partno ? " of part " : "", ct->c_partno ? ct->c_partno : "", charset); @@ -1080,6 +1081,7 @@ convert_charset (CT ct, char *dest_charset, int *message_mods) { char *dest_buffer = mh_xmalloc(dest_buffer_size); HF hf; char *tempfile; + int fromutf8 = !strcasecmp(src_charset, "UTF-8"); if ((conv_desc = iconv_open (dest_charset, src_charset)) == (iconv_t) -1) { @@ -1149,6 +1151,32 @@ iconv_start: outbytes_before += bumpup; goto iconv_start; } + if (errno == EINVAL) { + /* middle of multi-byte sequence */ + if (write (fd, dest_buffer, outbytes_before - outbytes) < 0) { + advise (dest, "write"); + } + fseeko (*fp, -inbytes, SEEK_CUR); + if (end > 0) bytes_to_read += inbytes; + /* advise(NULL, "convert_charset: EINVAL"); */ + continue; + } + if (errno == EILSEQ) { + /* invalid multi-byte sequence */ + if (fromutf8) { + for (++ib, --inbytes; + inbytes > 0 && + (((unsigned char) *ib) & 0xc0) == 0x80; + ++ib, --inbytes) + continue; + } else { + ib++; inbytes--; /* skip it */ + } + (*ob++) = '?'; outbytes --; + /* advise(NULL, "convert_charset: EILSEQ"); */ + goto iconv_start; + } + advise (NULL, "convert_charset: errno = %d", errno); status = NOTOK; break; } else { @@ -1238,20 +1266,22 @@ convert_content_charset (CT ct, char **file) { /* Using current locale, see if the content needs to be converted. */ /* content_charset() cannot return NULL. */ - char *charset = content_charset (ct); + char *src_charset = content_charset (ct); - if (! check_charset (charset, strlen (charset))) { + if (! check_charset (src_charset, strlen (src_charset))) { int unused = 0; - char *charset = getcpy (get_charset ()); + char *dest_charset = getcpy (get_charset ()); - if (convert_charset (ct, charset, &unused) == 0) { + if (convert_charset (ct, dest_charset, &unused) == 0) { *file = ct->c_cefile.ce_file; } else { status = NOTOK; } + + free (dest_charset); } - free (charset); + free (src_charset); #else /* ! HAVE_ICONV */ NMH_UNUSED (ct); NMH_UNUSED (file);