1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
commit f25f0b75bbeb485961dc139aed6b5b474552d043 (HEAD -> main)
Author: Taiki Sugawara <buzz.taiki@gmail.com>
Date: Wed May 12 18:26:11 2021 +0900
natspec patch for p7zip 17.x
diff --git a/CPP/7zip/Archive/Zip/ZipItem.cpp b/CPP/7zip/Archive/Zip/ZipItem.cpp
index 353e895..44071f3 100644
--- a/CPP/7zip/Archive/Zip/ZipItem.cpp
+++ b/CPP/7zip/Archive/Zip/ZipItem.cpp
@@ -1,9 +1,7 @@
// Archive/ZipItem.cpp
-#if (!defined _WIN32) && (!defined __CYGWIN__) && (!defined __APPLE__)
#include <iconv.h>
-#include <locale.h>
-#endif
+#include <natspec.h>
#include "StdAfx.h"
@@ -355,87 +353,15 @@ void CItem::GetUnicodeString(UString &res, const AString &s, bool isComment, boo
#endif
}
- #if (!defined _WIN32) && (!defined __CYGWIN__) && (!defined __APPLE__)
- // Convert OEM char set to UTF-8 if needed
- // Use system locale to select code page
-
- Byte hostOS = GetHostOS();
- if (!isUtf8 && ((hostOS == NFileHeader::NHostOS::kFAT) || (hostOS == NFileHeader::NHostOS::kNTFS))) {
-
- const char *oemcp;
- oemcp = getenv("OEMCP");
- if (!oemcp) {
- oemcp = "CP437\0"; // CP name is 6 chars max
-
- const char *lc_to_cp_table[] = {
- "af_ZA", "CP850", "ar_SA", "CP720", "ar_LB", "CP720", "ar_EG", "CP720",
- "ar_DZ", "CP720", "ar_BH", "CP720", "ar_IQ", "CP720", "ar_JO", "CP720",
- "ar_KW", "CP720", "ar_LY", "CP720", "ar_MA", "CP720", "ar_OM", "CP720",
- "ar_QA", "CP720", "ar_SY", "CP720", "ar_TN", "CP720", "ar_AE", "CP720",
- "ar_YE", "CP720","ast_ES", "CP850", "az_AZ", "CP866", "az_AZ", "CP857",
- "be_BY", "CP866", "bg_BG", "CP866", "br_FR", "CP850", "ca_ES", "CP850",
- "zh_CN", "CP936", "zh_TW", "CP950", "kw_GB", "CP850", "cs_CZ", "CP852",
- "cy_GB", "CP850", "da_DK", "CP850", "de_AT", "CP850", "de_LI", "CP850",
- "de_LU", "CP850", "de_CH", "CP850", "de_DE", "CP850", "el_GR", "CP737",
- "en_AU", "CP850", "en_CA", "CP850", "en_GB", "CP850", "en_IE", "CP850",
- "en_JM", "CP850", "en_BZ", "CP850", "en_PH", "CP437", "en_ZA", "CP437",
- "en_TT", "CP850", "en_US", "CP437", "en_ZW", "CP437", "en_NZ", "CP850",
- "es_PA", "CP850", "es_BO", "CP850", "es_CR", "CP850", "es_DO", "CP850",
- "es_SV", "CP850", "es_EC", "CP850", "es_GT", "CP850", "es_HN", "CP850",
- "es_NI", "CP850", "es_CL", "CP850", "es_MX", "CP850", "es_ES", "CP850",
- "es_CO", "CP850", "es_ES", "CP850", "es_PE", "CP850", "es_AR", "CP850",
- "es_PR", "CP850", "es_VE", "CP850", "es_UY", "CP850", "es_PY", "CP850",
- "et_EE", "CP775", "eu_ES", "CP850", "fa_IR", "CP720", "fi_FI", "CP850",
- "fo_FO", "CP850", "fr_FR", "CP850", "fr_BE", "CP850", "fr_CA", "CP850",
- "fr_LU", "CP850", "fr_MC", "CP850", "fr_CH", "CP850", "ga_IE", "CP437",
- "gd_GB", "CP850", "gv_IM", "CP850", "gl_ES", "CP850", "he_IL", "CP862",
- "hr_HR", "CP852", "hu_HU", "CP852", "id_ID", "CP850", "is_IS", "CP850",
- "it_IT", "CP850", "it_CH", "CP850", "iv_IV", "CP437", "ja_JP", "CP932",
- "kk_KZ", "CP866", "ko_KR", "CP949", "ky_KG", "CP866", "lt_LT", "CP775",
- "lv_LV", "CP775", "mk_MK", "CP866", "mn_MN", "CP866", "ms_BN", "CP850",
- "ms_MY", "CP850", "nl_BE", "CP850", "nl_NL", "CP850", "nl_SR", "CP850",
- "nn_NO", "CP850", "nb_NO", "CP850", "pl_PL", "CP852", "pt_BR", "CP850",
- "pt_PT", "CP850", "rm_CH", "CP850", "ro_RO", "CP852", "ru_RU", "CP866",
- "sk_SK", "CP852", "sl_SI", "CP852", "sq_AL", "CP852", "sr_RS", "CP855",
- "sr_RS", "CP852", "sv_SE", "CP850", "sv_FI", "CP850", "sw_KE", "CP437",
- "th_TH", "CP874", "tr_TR", "CP857", "tt_RU", "CP866", "uk_UA", "CP866",
- "ur_PK", "CP720", "uz_UZ", "CP866", "uz_UZ", "CP857", "vi_VN", "CP1258",
- "wa_BE", "CP850", "zh_HK", "CP950", "zh_SG", "CP936"};
- int table_len = sizeof(lc_to_cp_table) / sizeof(char *);
- int lc_len, i;
-
- char *lc = setlocale(LC_CTYPE, "");
-
- if (lc && lc[0]) {
- // Compare up to the dot, if it exists, e.g. en_US.UTF-8
- for (lc_len = 0; lc[lc_len] != '.' && lc[lc_len] != '\0'; ++lc_len)
- ;
- for (i = 0; i < table_len; i += 2)
- if (strncmp(lc, lc_to_cp_table[i], lc_len) == 0)
- oemcp = lc_to_cp_table[i + 1];
- }
- }
-
- iconv_t cd;
- if ((cd = iconv_open("UTF-8", oemcp)) != (iconv_t)-1) {
-
- AString s_utf8;
- const char* src = s.Ptr();
- size_t slen = s.Len();
- size_t dlen = slen * 4;
- const char* dest = s_utf8.GetBuf_SetEnd(dlen + 1); // (source length * 4) + null termination
-
- size_t done = iconv(cd, (char**)&src, &slen, (char**)&dest, &dlen);
- bzero((size_t*)dest + done, 1);
-
- iconv_close(cd);
-
- if (ConvertUTF8ToUnicode(s_utf8, res) || ignore_Utf8_Errors)
- return;
- }
+ if (!isUtf8) {
+ const char *oem_charset = natspec_get_charset_by_locale(NATSPEC_DOSCS, "");
+ char *p = natspec_convert(s.Ptr(), NULL, oem_charset, 0);
+ AString utf = p;
+ free(p);
+ if (ConvertUTF8ToUnicode(utf, res))
+ return;
}
- #endif
-
+
if (isUtf8)
if (ConvertUTF8ToUnicode(s, res) || ignore_Utf8_Errors)
return;
diff --git a/makefile.machine b/makefile.machine
index a89b568..3e12592 100644
--- a/makefile.machine
+++ b/makefile.machine
@@ -16,7 +16,7 @@ CC=gcc
CC_SHARED=-fPIC
LINK_SHARED=-fPIC -shared
-LOCAL_LIBS=-lpthread
+LOCAL_LIBS=-lpthread -lnatspec
LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
OBJ_CRC32=$(OBJ_CRC32_C)
|