| 594 | | |
| 595 | | const char *mutt_get_first_charset (const char *charset) |
| 596 | | { |
| 597 | | static char fcharset[SHORT_STRING]; |
| 598 | | const char *c, *c1; |
| 599 | | |
| 600 | | c = charset; |
| 601 | | if (!mutt_strlen(c)) |
| 602 | | return "us-ascii"; |
| 603 | | if (!(c1 = strchr (c, ':'))) |
| 604 | | return charset; |
| 605 | | strfcpy (fcharset, c, c1 - c + 1); |
| 606 | | return fcharset; |
| 607 | | } |
| 608 | | |
| 609 | | static size_t convert_string (ICONV_CONST char *f, size_t flen, |
| 610 | | const char *from, const char *to, |
| 611 | | char **t, size_t *tlen) |
| 612 | | { |
| 613 | | iconv_t cd; |
| 614 | | char *buf, *ob; |
| 615 | | size_t obl, n; |
| 616 | | int e; |
| 617 | | |
| 618 | | cd = mutt_iconv_open (to, from, 0); |
| 619 | | if (cd == (iconv_t)(-1)) |
| 620 | | return (size_t)(-1); |
| 621 | | obl = 4 * flen + 1; |
| 622 | | ob = buf = safe_malloc (obl); |
| 623 | | n = iconv (cd, &f, &flen, &ob, &obl); |
| 624 | | if (n == (size_t)(-1) || iconv (cd, 0, 0, &ob, &obl) == (size_t)(-1)) |
| 625 | | { |
| 626 | | e = errno; |
| 627 | | FREE (&buf); |
| 628 | | iconv_close (cd); |
| 629 | | errno = e; |
| 630 | | return (size_t)(-1); |
| 631 | | } |
| 632 | | *ob = '\0'; |
| 633 | | |
| 634 | | *tlen = ob - buf; |
| 635 | | |
| 636 | | safe_realloc ((void **) &buf, ob - buf + 1); |
| 637 | | *t = buf; |
| 638 | | iconv_close (cd); |
| 639 | | |
| 640 | | return n; |
| 641 | | } |
| 642 | | |
| 643 | | int mutt_convert_nonmime_string (char **ps) |
| 644 | | { |
| 645 | | const char *c, *c1; |
| 646 | | |
| 647 | | for (c = AssumedCharset; c; c = c1 ? c1 + 1 : 0) |
| 648 | | { |
| 649 | | char *u = *ps; |
| 650 | | char *s; |
| 651 | | char *fromcode; |
| 652 | | size_t m, n; |
| 653 | | size_t ulen = mutt_strlen (*ps); |
| 654 | | size_t slen; |
| 655 | | |
| 656 | | if (!u || !*u) |
| 657 | | return 0; |
| 658 | | |
| 659 | | c1 = strchr (c, ':'); |
| 660 | | n = c1 ? c1 - c : mutt_strlen (c); |
| 661 | | if (!n) |
| 662 | | continue; |
| 663 | | fromcode = safe_malloc (n + 1); |
| 664 | | strfcpy (fromcode, c, n + 1); |
| 665 | | m = convert_string (u, ulen, fromcode, Charset, &s, &slen); |
| 666 | | FREE (&fromcode); |
| 667 | | if (m != (size_t)(-1)) |
| 668 | | { |
| 669 | | FREE (ps); /* __FREE_CHECKED__ */ |
| 670 | | *ps = s; |
| 671 | | return 0; |
| 672 | | } |
| 673 | | } |
| 674 | | return -1; |
| 675 | | } |
| 676 | | |