diff options
-rw-r--r-- | miscutils/iconv.c | 74 |
1 files changed, 19 insertions, 55 deletions
diff --git a/miscutils/iconv.c b/miscutils/iconv.c index 0c98ced05..d6ed439b4 100644 --- a/miscutils/iconv.c +++ b/miscutils/iconv.c | |||
@@ -14,7 +14,7 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | //config:config ICONV | 16 | //config:config ICONV |
17 | //config: bool "iconv" | 17 | //config: bool "iconv (11.4 kb)" |
18 | //config: default y | 18 | //config: default y |
19 | //config: depends on PLATFORM_MINGW32 | 19 | //config: depends on PLATFORM_MINGW32 |
20 | //config: help | 20 | //config: help |
@@ -25,7 +25,7 @@ | |||
25 | //kbuild:lib-$(CONFIG_ICONV) += iconv.o | 25 | //kbuild:lib-$(CONFIG_ICONV) += iconv.o |
26 | 26 | ||
27 | //usage:#define iconv_trivial_usage | 27 | //usage:#define iconv_trivial_usage |
28 | //usage: "[-lc] [-o outfile] -f from-enc -t to-enc [FILE]..." | 28 | //usage: "[-lc] [-o outfile] [-f from-enc] [-t to-enc] [FILE]..." |
29 | //usage:#define iconv_full_usage "\n\n" | 29 | //usage:#define iconv_full_usage "\n\n" |
30 | //usage: "Convert text between character encodings\n" | 30 | //usage: "Convert text between character encodings\n" |
31 | //usage: "\n -l List all known character encodings" | 31 | //usage: "\n -l List all known character encodings" |
@@ -614,15 +614,6 @@ static compat_t *cp51932_compat = cp932_compat; | |||
614 | /* cp20932_compat for kernel. cp932_compat for mlang. */ | 614 | /* cp20932_compat for kernel. cp932_compat for mlang. */ |
615 | static compat_t *cp5022x_compat = cp932_compat; | 615 | static compat_t *cp5022x_compat = cp932_compat; |
616 | 616 | ||
617 | typedef HRESULT (WINAPI *CONVERTINETSTRING)( | ||
618 | LPDWORD lpdwMode, | ||
619 | DWORD dwSrcEncoding, | ||
620 | DWORD dwDstEncoding, | ||
621 | LPCSTR lpSrcStr, | ||
622 | LPINT lpnSrcSize, | ||
623 | LPBYTE lpDstStr, | ||
624 | LPINT lpnDstSize | ||
625 | ); | ||
626 | typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( | 617 | typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( |
627 | LPDWORD lpdwMode, | 618 | LPDWORD lpdwMode, |
628 | DWORD dwSrcEncoding, | 619 | DWORD dwSrcEncoding, |
@@ -631,6 +622,7 @@ typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( | |||
631 | LPWSTR lpDstStr, | 622 | LPWSTR lpDstStr, |
632 | LPINT lpnWideCharCount | 623 | LPINT lpnWideCharCount |
633 | ); | 624 | ); |
625 | |||
634 | typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( | 626 | typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( |
635 | LPDWORD lpdwMode, | 627 | LPDWORD lpdwMode, |
636 | DWORD dwEncoding, | 628 | DWORD dwEncoding, |
@@ -639,50 +631,21 @@ typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( | |||
639 | LPSTR lpDstStr, | 631 | LPSTR lpDstStr, |
640 | LPINT lpnMultiCharCount | 632 | LPINT lpnMultiCharCount |
641 | ); | 633 | ); |
642 | typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)( | 634 | |
643 | DWORD dwSrcEncoding, | ||
644 | DWORD dwDstEncoding | ||
645 | ); | ||
646 | typedef HRESULT (WINAPI *LCIDTORFC1766A)( | ||
647 | LCID Locale, | ||
648 | LPSTR pszRfc1766, | ||
649 | int nChar | ||
650 | ); | ||
651 | typedef HRESULT (WINAPI *LCIDTORFC1766W)( | ||
652 | LCID Locale, | ||
653 | LPWSTR pszRfc1766, | ||
654 | int nChar | ||
655 | ); | ||
656 | typedef HRESULT (WINAPI *RFC1766TOLCIDA)( | ||
657 | LCID *pLocale, | ||
658 | LPSTR pszRfc1766 | ||
659 | ); | ||
660 | typedef HRESULT (WINAPI *RFC1766TOLCIDW)( | ||
661 | LCID *pLocale, | ||
662 | LPWSTR pszRfc1766 | ||
663 | ); | ||
664 | static CONVERTINETSTRING ConvertINetString; | ||
665 | static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; | 635 | static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; |
666 | static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; | 636 | static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; |
667 | static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable; | ||
668 | static LCIDTORFC1766A LcidToRfc1766A; | ||
669 | static RFC1766TOLCIDA Rfc1766ToLcidA; | ||
670 | 637 | ||
671 | static int | 638 | static int |
672 | load_mlang(void) | 639 | load_mlang(void) |
673 | { | 640 | { |
674 | HMODULE h; | 641 | HMODULE h; |
675 | if (ConvertINetString != NULL) | 642 | if (ConvertINetMultiByteToUnicode != NULL) |
676 | return TRUE; | 643 | return TRUE; |
677 | h = LoadLibrary(TEXT("mlang.dll")); | 644 | h = LoadLibrary(TEXT("mlang.dll")); |
678 | if (!h) | 645 | if (!h) |
679 | return FALSE; | 646 | return FALSE; |
680 | ConvertINetString = (CONVERTINETSTRING)GetProcAddressA(h, "ConvertINetString"); | ||
681 | ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddressA(h, "ConvertINetMultiByteToUnicode"); | 647 | ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddressA(h, "ConvertINetMultiByteToUnicode"); |
682 | ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddressA(h, "ConvertINetUnicodeToMultiByte"); | 648 | ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddressA(h, "ConvertINetUnicodeToMultiByte"); |
683 | IsConvertINetStringAvailable = (ISCONVERTINETSTRINGAVAILABLE)GetProcAddressA(h, "IsConvertINetStringAvailable"); | ||
684 | LcidToRfc1766A = (LCIDTORFC1766A)GetProcAddressA(h, "LcidToRfc1766A"); | ||
685 | Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddressA(h, "Rfc1766ToLcidA"); | ||
686 | return TRUE; | 649 | return TRUE; |
687 | } | 650 | } |
688 | 651 | ||
@@ -841,21 +804,26 @@ make_csconv(const char *_name, csconv_t *cv) | |||
841 | int use_compat = TRUE; | 804 | int use_compat = TRUE; |
842 | int flag = 0; | 805 | int flag = 0; |
843 | char *name; | 806 | char *name; |
844 | char *p; | 807 | char *p, *s; |
845 | 808 | ||
846 | name = xstrndup(_name, strlen(_name)); | 809 | name = xstrdup(_name); |
847 | if (name == NULL) | ||
848 | return FALSE; | ||
849 | 810 | ||
850 | /* check for option "enc_name//opt1//opt2" */ | 811 | /* check for option "enc_name//opt1//opt2" */ |
851 | while ((p = strrstr(name, "//")) != NULL) | 812 | while ((p = strrstr(name, "//")) != NULL) |
852 | { | 813 | { |
853 | if (_stricmp(p + 2, "nocompat") == 0) | 814 | for (s = p + 2; *s; ++s) |
815 | *s = tolower(*s); | ||
816 | switch (index_in_strings("nocompat\0translit\0ignore\0", p + 2)) { | ||
817 | case 0: | ||
854 | use_compat = FALSE; | 818 | use_compat = FALSE; |
855 | else if (_stricmp(p + 2, "translit") == 0) | 819 | break; |
820 | case 1: | ||
856 | flag |= FLAG_TRANSLIT; | 821 | flag |= FLAG_TRANSLIT; |
857 | else if (_stricmp(p + 2, "ignore") == 0) | 822 | break; |
823 | case 2: | ||
858 | flag |= FLAG_IGNORE; | 824 | flag |= FLAG_IGNORE; |
825 | break; | ||
826 | } | ||
859 | *p = 0; | 827 | *p = 0; |
860 | } | 828 | } |
861 | 829 | ||
@@ -942,8 +910,7 @@ name_to_codepage(const char *name) | |||
942 | int i; | 910 | int i; |
943 | const char *alias; | 911 | const char *alias; |
944 | 912 | ||
945 | if (*name == '\0' || | 913 | if (*name == '\0' || strcmp(name, "char") == 0) |
946 | strcmp(name, "char") == 0) | ||
947 | return GetACP(); | 914 | return GetACP(); |
948 | else if (strcmp(name, "wchar_t") == 0) | 915 | else if (strcmp(name, "wchar_t") == 0) |
949 | return 1200; | 916 | return 1200; |
@@ -1748,7 +1715,7 @@ enum { | |||
1748 | int iconv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1715 | int iconv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
1749 | int iconv_main(int argc, char **argv) | 1716 | int iconv_main(int argc, char **argv) |
1750 | { | 1717 | { |
1751 | char *fromcode, *tocode, *outfile; | 1718 | const char *fromcode = "", *tocode = "", *outfile; |
1752 | int i, opt; | 1719 | int i, opt; |
1753 | iconv_t cd; | 1720 | iconv_t cd; |
1754 | FILE *in = stdin; | 1721 | FILE *in = stdin; |
@@ -1765,9 +1732,6 @@ int iconv_main(int argc, char **argv) | |||
1765 | return 0; | 1732 | return 0; |
1766 | } | 1733 | } |
1767 | 1734 | ||
1768 | if ((opt & (OPT_f|OPT_t)) != (OPT_f|OPT_t)) | ||
1769 | bb_show_usage(); | ||
1770 | |||
1771 | if (opt & OPT_o) | 1735 | if (opt & OPT_o) |
1772 | out = xfopen(outfile, "wb"); | 1736 | out = xfopen(outfile, "wb"); |
1773 | 1737 | ||