aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-02-16 10:01:47 +0000
committerRon Yorston <rmy@pobox.com>2020-02-16 10:11:23 +0000
commit334bb8b921c987a7065fb84522a214a188514def (patch)
tree5de105120ffd86b07f4be626f19e99894109dd6a
parent5f6aaf23076dd0f523eccf821987276cc36080ae (diff)
downloadbusybox-w32-334bb8b921c987a7065fb84522a214a188514def.tar.gz
busybox-w32-334bb8b921c987a7065fb84522a214a188514def.tar.bz2
busybox-w32-334bb8b921c987a7065fb84522a214a188514def.zip
iconv: more improvements
- Only load required functions from mlang.dll. - The '-f' and '-t' options aren't compulsory. - Use xstrdup() instead of xstrndup() and don't check its return value. - Replace string comparisons when checking for encoding options with a single call to index_in_strings(). Saves 224 bytes.
-rw-r--r--miscutils/iconv.c74
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. */
615static compat_t *cp5022x_compat = cp932_compat; 615static compat_t *cp5022x_compat = cp932_compat;
616 616
617typedef 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);
626typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( 617typedef 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
634typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( 626typedef 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);
642typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)( 634
643 DWORD dwSrcEncoding,
644 DWORD dwDstEncoding
645);
646typedef HRESULT (WINAPI *LCIDTORFC1766A)(
647 LCID Locale,
648 LPSTR pszRfc1766,
649 int nChar
650);
651typedef HRESULT (WINAPI *LCIDTORFC1766W)(
652 LCID Locale,
653 LPWSTR pszRfc1766,
654 int nChar
655);
656typedef HRESULT (WINAPI *RFC1766TOLCIDA)(
657 LCID *pLocale,
658 LPSTR pszRfc1766
659);
660typedef HRESULT (WINAPI *RFC1766TOLCIDW)(
661 LCID *pLocale,
662 LPWSTR pszRfc1766
663);
664static CONVERTINETSTRING ConvertINetString;
665static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; 635static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode;
666static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; 636static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte;
667static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable;
668static LCIDTORFC1766A LcidToRfc1766A;
669static RFC1766TOLCIDA Rfc1766ToLcidA;
670 637
671static int 638static int
672load_mlang(void) 639load_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 {
1748int iconv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 1715int iconv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
1749int iconv_main(int argc, char **argv) 1716int 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