| | 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 | |