aboutsummaryrefslogtreecommitdiff
path: root/CPP/Common
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /CPP/Common
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.gz
7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.bz2
7zip-fc662341e6f85da78ada0e443f6116b978f79f22.zip
24.0524.05
Diffstat (limited to 'CPP/Common')
-rw-r--r--CPP/Common/AutoPtr.h33
-rw-r--r--CPP/Common/CommandLineParser.cpp40
-rw-r--r--CPP/Common/Common.h299
-rw-r--r--CPP/Common/Common0.h330
-rw-r--r--CPP/Common/CrcReg.cpp23
-rw-r--r--CPP/Common/DynamicBuffer.h12
-rw-r--r--CPP/Common/IntToString.cpp231
-rw-r--r--CPP/Common/IntToString.h30
-rw-r--r--CPP/Common/ListFileUtils.cpp14
-rw-r--r--CPP/Common/MyBuffer.h19
-rw-r--r--CPP/Common/MyBuffer2.h39
-rw-r--r--CPP/Common/MyCom.h153
-rw-r--r--CPP/Common/MyGuidDef.h4
-rw-r--r--CPP/Common/MyMap.cpp4
-rw-r--r--CPP/Common/MyString.cpp70
-rw-r--r--CPP/Common/MyString.h20
-rw-r--r--CPP/Common/MyTypes.h5
-rw-r--r--CPP/Common/MyVector.h34
-rw-r--r--CPP/Common/MyWindows.cpp6
-rw-r--r--CPP/Common/MyWindows.h11
-rw-r--r--CPP/Common/MyXml.cpp117
-rw-r--r--CPP/Common/MyXml.h4
-rw-r--r--CPP/Common/NewHandler.cpp50
-rw-r--r--CPP/Common/NewHandler.h23
-rw-r--r--CPP/Common/Random.cpp4
-rw-r--r--CPP/Common/Random.h2
-rw-r--r--CPP/Common/StdInStream.cpp12
-rw-r--r--CPP/Common/StdOutStream.cpp120
-rw-r--r--CPP/Common/StdOutStream.h17
-rw-r--r--CPP/Common/StringConvert.cpp52
-rw-r--r--CPP/Common/StringToInt.cpp215
-rw-r--r--CPP/Common/StringToInt.h16
-rw-r--r--CPP/Common/TextConfig.cpp13
-rw-r--r--CPP/Common/UTFConvert.cpp8
-rw-r--r--CPP/Common/Xxh64Reg.cpp97
35 files changed, 1416 insertions, 711 deletions
diff --git a/CPP/Common/AutoPtr.h b/CPP/Common/AutoPtr.h
index 0be8a7a..e3c5763 100644
--- a/CPP/Common/AutoPtr.h
+++ b/CPP/Common/AutoPtr.h
@@ -3,20 +3,32 @@
3#ifndef ZIP7_INC_COMMON_AUTOPTR_H 3#ifndef ZIP7_INC_COMMON_AUTOPTR_H
4#define ZIP7_INC_COMMON_AUTOPTR_H 4#define ZIP7_INC_COMMON_AUTOPTR_H
5 5
6template<class T> class CMyAutoPtr 6template<class T> class CMyUniquePtr
7// CMyAutoPtr
7{ 8{
8 T *_p; 9 T *_p;
9public: 10
10 CMyAutoPtr(T *p = NULL) : _p(p) {} 11 CMyUniquePtr(CMyUniquePtr<T>& p); // : _p(p.release()) {}
11 CMyAutoPtr(CMyAutoPtr<T>& p): _p(p.release()) {} 12 CMyUniquePtr<T>& operator=(T *p);
12 CMyAutoPtr<T>& operator=(CMyAutoPtr<T>& p) 13 CMyUniquePtr<T>& operator=(CMyUniquePtr<T>& p);
14 /*
13 { 15 {
14 reset(p.release()); 16 reset(p.release());
15 return (*this); 17 return (*this);
16 } 18 }
17 ~CMyAutoPtr() { delete _p; } 19 */
20 void reset(T* p = NULL)
21 {
22 if (p != _p)
23 delete _p;
24 _p = p;
25 }
26public:
27 CMyUniquePtr(T *p = NULL) : _p(p) {}
28 ~CMyUniquePtr() { delete _p; }
18 T& operator*() const { return *_p; } 29 T& operator*() const { return *_p; }
19 // T* operator->() const { return (&**this); } 30 T* operator->() const { return _p; }
31 // operator bool() const { return _p != NULL; }
20 T* get() const { return _p; } 32 T* get() const { return _p; }
21 T* release() 33 T* release()
22 { 34 {
@@ -24,11 +36,10 @@ public:
24 _p = NULL; 36 _p = NULL;
25 return tmp; 37 return tmp;
26 } 38 }
27 void reset(T* p = NULL) 39 void Create_if_Empty()
28 { 40 {
29 if (p != _p) 41 if (!_p)
30 delete _p; 42 _p = new T;
31 _p = p;
32 } 43 }
33}; 44};
34 45
diff --git a/CPP/Common/CommandLineParser.cpp b/CPP/Common/CommandLineParser.cpp
index 465e0fd..319f27f 100644
--- a/CPP/Common/CommandLineParser.cpp
+++ b/CPP/Common/CommandLineParser.cpp
@@ -6,6 +6,8 @@
6 6
7namespace NCommandLineParser { 7namespace NCommandLineParser {
8 8
9#ifdef _WIN32
10
9bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2) 11bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
10{ 12{
11 dest1.Empty(); 13 dest1.Empty();
@@ -14,7 +16,7 @@ bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
14 unsigned i; 16 unsigned i;
15 for (i = 0; i < src.Len(); i++) 17 for (i = 0; i < src.Len(); i++)
16 { 18 {
17 wchar_t c = src[i]; 19 const wchar_t c = src[i];
18 if ((c == L' ' || c == L'\t') && !quoteMode) 20 if ((c == L' ' || c == L'\t') && !quoteMode)
19 { 21 {
20 dest2 = src.Ptr(i + 1); 22 dest2 = src.Ptr(i + 1);
@@ -30,6 +32,34 @@ bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
30 32
31void SplitCommandLine(const UString &s, UStringVector &parts) 33void SplitCommandLine(const UString &s, UStringVector &parts)
32{ 34{
35#if 0
36/* we don't use CommandLineToArgvW() because
37 it can remove tail backslash:
38 "1\"
39 converted to
40 1"
41*/
42 parts.Clear();
43 {
44 int nArgs;
45 LPWSTR *szArgList = CommandLineToArgvW(s, &nArgs);
46 if (szArgList)
47 {
48 for (int i = 0; i < nArgs; i++)
49 {
50 // printf("%2d: |%S|\n", i, szArglist[i]);
51 parts.Add(szArgList[i]);
52 }
53 LocalFree(szArgList);
54 return;
55 }
56 }
57#endif
58/*
59#ifdef _UNICODE
60 throw 20240406;
61#else
62*/
33 UString sTemp (s); 63 UString sTemp (s);
34 sTemp.Trim(); 64 sTemp.Trim();
35 parts.Clear(); 65 parts.Clear();
@@ -42,7 +72,9 @@ void SplitCommandLine(const UString &s, UStringVector &parts)
42 break; 72 break;
43 sTemp = s2; 73 sTemp = s2;
44 } 74 }
75// #endif
45} 76}
77#endif
46 78
47 79
48static const char * const kStopSwitchParsing = "--"; 80static const char * const kStopSwitchParsing = "--";
@@ -78,7 +110,7 @@ bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms, unsi
78 for (unsigned i = 0; i < numSwitches; i++) 110 for (unsigned i = 0; i < numSwitches; i++)
79 { 111 {
80 const char * const key = switchForms[i].Key; 112 const char * const key = switchForms[i].Key;
81 unsigned switchLen = MyStringLen(key); 113 const unsigned switchLen = MyStringLen(key);
82 if ((int)switchLen <= maxLen || pos + switchLen > s.Len()) 114 if ((int)switchLen <= maxLen || pos + switchLen > s.Len())
83 continue; 115 continue;
84 if (IsString1PrefixedByString2_NoCase_Ascii((const wchar_t *)s + pos, key)) 116 if (IsString1PrefixedByString2_NoCase_Ascii((const wchar_t *)s + pos, key))
@@ -133,7 +165,7 @@ bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms, unsi
133 case NSwitchType::kChar: 165 case NSwitchType::kChar:
134 if (rem == 1) 166 if (rem == 1)
135 { 167 {
136 wchar_t c = s[pos]; 168 const wchar_t c = s[pos];
137 if (c <= 0x7F) 169 if (c <= 0x7F)
138 { 170 {
139 sw.PostCharIndex = FindCharPosInString(form.PostCharSet, (char)c); 171 sw.PostCharIndex = FindCharPosInString(form.PostCharSet, (char)c);
@@ -150,6 +182,8 @@ bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms, unsi
150 sw.PostStrings.Add(s.Ptr(pos)); 182 sw.PostStrings.Add(s.Ptr(pos));
151 return true; 183 return true;
152 } 184 }
185 // case NSwitchType::kSimple:
186 default: break;
153 } 187 }
154 188
155 if (pos != s.Len()) 189 if (pos != s.Len())
diff --git a/CPP/Common/Common.h b/CPP/Common/Common.h
index 0c77ab4..cde0c38 100644
--- a/CPP/Common/Common.h
+++ b/CPP/Common/Common.h
@@ -7,7 +7,9 @@
7#ifndef ZIP7_INC_COMMON_H 7#ifndef ZIP7_INC_COMMON_H
8#define ZIP7_INC_COMMON_H 8#define ZIP7_INC_COMMON_H
9 9
10#include "../../C/Compiler.h" 10#include "../../C/Precomp.h"
11#include "Common0.h"
12#include "MyWindows.h"
11 13
12/* 14/*
13This file is included to all cpp files in 7-Zip. 15This file is included to all cpp files in 7-Zip.
@@ -17,297 +19,10 @@ So 7-Zip includes "Common.h" in both modes:
17and 19and
18 without precompiled StdAfx.h 20 without precompiled StdAfx.h
19 21
20If you use 7-Zip code, you must include "Common.h" before other h files of 7-zip. 22include "Common.h" before other h files of 7-zip,
21If you don't need some things that are used in 7-Zip, 23 if you need predefined macros.
22you can change this h file or h files included in this file. 24do not include "Common.h", if you need only interfaces,
23*/ 25 and you don't need predefined macros.
24
25#ifdef _MSC_VER
26 #pragma warning(disable : 4710) // function not inlined
27 // 'CUncopyable::CUncopyable':
28 #pragma warning(disable : 4514) // unreferenced inline function has been removed
29 #if _MSC_VER < 1300
30 #pragma warning(disable : 4702) // unreachable code
31 #pragma warning(disable : 4714) // function marked as __forceinline not inlined
32 #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
33 #endif
34 #if _MSC_VER < 1400
35 #pragma warning(disable : 4511) // copy constructor could not be generated // #pragma warning(disable : 4512) // assignment operator could not be generated
36 #pragma warning(disable : 4512) // assignment operator could not be generated
37 #endif
38 #if _MSC_VER > 1400 && _MSC_VER <= 1900
39 // #pragma warning(disable : 4996)
40 // strcat: This function or variable may be unsafe
41 // GetVersion was declared deprecated
42 #endif
43
44#if _MSC_VER > 1200
45// -Wall warnings
46
47#if _MSC_VER <= 1600
48#pragma warning(disable : 4917) // 'OLE_HANDLE' : a GUID can only be associated with a class, interface or namespace
49#endif
50
51// #pragma warning(disable : 4061) // enumerator '' in switch of enum '' is not explicitly handled by a case label
52// #pragma warning(disable : 4266) // no override available for virtual member function from base ''; function is hidden
53#pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted
54#pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted
55#if _MSC_VER >= 1600 && _MSC_VER < 1920
56#pragma warning(disable : 4571) // Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
57#endif
58#if _MSC_VER >= 1600
59#pragma warning(disable : 4365) // 'initializing' : conversion from 'int' to 'unsigned int', signed / unsigned mismatch
60#endif
61#if _MSC_VER < 1800
62// we disable the warning, if we don't use 'final' in class
63#pragma warning(disable : 4265) // class has virtual functions, but destructor is not virtual
64#endif
65
66#if _MSC_VER >= 1900
67#pragma warning(disable : 5026) // move constructor was implicitly defined as deleted
68#pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted
69#endif
70#if _MSC_VER >= 1912
71#pragma warning(disable : 5039) // pointer or reference to potentially throwing function passed to 'extern "C"' function under - EHc.Undefined behavior may occur if this function throws an exception.
72#endif
73#if _MSC_VER >= 1925
74// #pragma warning(disable : 5204) // 'ISequentialInStream' : class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly
75#endif
76#if _MSC_VER >= 1934
77// #pragma warning(disable : 5264) // const variable is not used
78#endif
79
80#endif // _MSC_VER > 1200
81#endif // _MSC_VER
82
83
84#if defined(_MSC_VER) // && !defined(__clang__)
85#define Z7_DECLSPEC_NOTHROW __declspec(nothrow)
86#elif defined(__clang__) || defined(__GNUC__)
87#define Z7_DECLSPEC_NOTHROW __attribute__((nothrow))
88#else
89#define Z7_DECLSPEC_NOTHROW
90#endif
91
92/*
93#if defined (_MSC_VER) && _MSC_VER >= 1900 \
94 || defined(__clang__) && __clang_major__ >= 6 \
95 || defined(__GNUC__) && __GNUC__ >= 6
96 #define Z7_noexcept noexcept
97#else
98 #define Z7_noexcept throw()
99#endif
100*/
101
102
103#if defined(__clang__)
104
105// noexcept, final, = delete
106#pragma GCC diagnostic ignored "-Wc++98-compat"
107#if __clang_major__ >= 4
108// throw() dynamic exception specifications are deprecated
109#pragma GCC diagnostic ignored "-Wdeprecated-dynamic-exception-spec"
110#endif
111#pragma GCC diagnostic ignored "-Wold-style-cast"
112#pragma GCC diagnostic ignored "-Wglobal-constructors"
113#pragma GCC diagnostic ignored "-Wexit-time-destructors"
114
115// #pragma GCC diagnostic ignored "-Wunused-private-field"
116// #pragma GCC diagnostic ignored "-Wnonportable-system-include-path"
117// #pragma GCC diagnostic ignored "-Wsuggest-override"
118// #pragma GCC diagnostic ignored "-Wsign-conversion"
119// #pragma GCC diagnostic ignored "-Winconsistent-missing-override"
120// #pragma GCC diagnostic ignored "-Wsuggest-destructor-override"
121// #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
122// #pragma GCC diagnostic ignored "-Wdeprecated-copy-with-user-provided-dtor"
123// #pragma GCC diagnostic ignored "-Wdeprecated-copy-dtor"
124// #ifndef _WIN32
125// #pragma GCC diagnostic ignored "-Wweak-vtables"
126// #endif
127/*
128#if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40400) \
129 || defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30000)
130// enumeration values not explicitly handled in switch
131#pragma GCC diagnostic ignored "-Wswitch-enum"
132#endif
133*/
134#endif // __clang__
135
136
137#ifdef __GNUC__
138// #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
139#endif
140
141
142/* There is BUG in MSVC 6.0 compiler for operator new[]:
143 It doesn't check overflow, when it calculates size in bytes for allocated array.
144 So we can use Z7_ARRAY_NEW macro instead of new[] operator. */
145
146#if defined(_MSC_VER) && (_MSC_VER == 1200) && !defined(_WIN64)
147 #define Z7_ARRAY_NEW(p, T, size) p = new T[((size) > (unsigned)0xFFFFFFFF / sizeof(T)) ? (unsigned)0xFFFFFFFF / sizeof(T) : (size)];
148#else
149 #define Z7_ARRAY_NEW(p, T, size) p = new T[size];
150#endif
151
152#if (defined(__GNUC__) && (__GNUC__ >= 8))
153 #define Z7_ATTR_NORETURN __attribute__((noreturn))
154#elif (defined(__clang__) && (__clang_major__ >= 3))
155 #if __has_feature(cxx_attributes)
156 #define Z7_ATTR_NORETURN [[noreturn]]
157 #else
158 #define Z7_ATTR_NORETURN __attribute__((noreturn))
159 #endif
160#elif (defined(_MSC_VER) && (_MSC_VER >= 1900))
161 #define Z7_ATTR_NORETURN [[noreturn]]
162#else
163 #define Z7_ATTR_NORETURN
164#endif
165
166
167// final in "GCC 4.7.0"
168// In C++98 and C++03 code the alternative spelling __final can be used instead (this is a GCC extension.)
169
170#if defined (__cplusplus) && __cplusplus >= 201103L \
171 || defined(_MSC_VER) && _MSC_VER >= 1800 \
172 || defined(__clang__) && __clang_major__ >= 4 \
173 /* || defined(__GNUC__) && __GNUC__ >= 9 */
174 #define Z7_final final
175 #if defined(__clang__) && __cplusplus < 201103L
176 #pragma GCC diagnostic ignored "-Wc++11-extensions"
177 #endif
178#elif defined (__cplusplus) && __cplusplus >= 199711L \
179 && defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
180 #define Z7_final __final
181#else
182 #define Z7_final
183 #if defined(__clang__) && __clang_major__ >= 4 \
184 || defined(__GNUC__) && __GNUC__ >= 4
185 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
186 #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
187 #endif
188#endif
189
190#define Z7_class_final(c) class c Z7_final
191
192
193#if defined (__cplusplus) && __cplusplus >= 201103L \
194 || (defined(_MSC_VER) && _MSC_VER >= 1800)
195 #define Z7_CPP_IS_SUPPORTED_default
196 #define Z7_eq_delete = delete
197 // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c) c(const c& k) = default;
198#else
199 #define Z7_eq_delete
200 // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c)
201#endif
202
203
204#if defined(__cplusplus) && (__cplusplus >= 201103L) \
205 || defined(_MSC_VER) && (_MSC_VER >= 1400) /* && (_MSC_VER != 1600) */ \
206 || defined(__clang__) && __clang_major__ >= 4
207 #if defined(_MSC_VER) && (_MSC_VER == 1600) /* && (_MSC_VER != 1600) */
208 #pragma warning(disable : 4481) // nonstandard extension used: override specifier 'override'
209 #define Z7_DESTRUCTOR_override
210 #else
211 #define Z7_DESTRUCTOR_override override
212 #endif
213 #define Z7_override override
214#else
215 #define Z7_override
216 #define Z7_DESTRUCTOR_override
217#endif
218
219
220
221#define Z7_CLASS_NO_COPY(cls) \
222 private: \
223 cls(const cls &) Z7_eq_delete; \
224 cls &operator=(const cls &) Z7_eq_delete;
225
226class CUncopyable
227{
228protected:
229 CUncopyable() {} // allow constructor
230 // ~CUncopyable() {}
231 Z7_CLASS_NO_COPY(CUncopyable)
232};
233
234#define MY_UNCOPYABLE :private CUncopyable
235// #define MY_UNCOPYABLE
236
237
238typedef void (*Z7_void_Function)(void);
239
240#if defined(__clang__) || defined(__GNUC__)
241#define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<Z7_void_Function>(e))
242#else
243#define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<void*>(e))
244// #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(e)
245#endif
246
247#define Z7_GET_PROC_ADDRESS(func_type, hmodule, func_name) \
248 Z7_CAST_FUNC(func_type, GetProcAddress(hmodule, func_name))
249
250// || defined(__clang__)
251// || defined(__GNUC__)
252
253#if defined(_MSC_VER) && (_MSC_VER >= 1400)
254#define Z7_DECLSPEC_NOVTABLE __declspec(novtable)
255#else
256#define Z7_DECLSPEC_NOVTABLE
257#endif
258
259#ifdef __clang__
260#define Z7_PURE_INTERFACES_BEGIN \
261_Pragma("GCC diagnostic push") \
262_Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
263_Pragma("GCC diagnostic ignored \"-Wweak-vtables\"")
264#define Z7_PURE_INTERFACES_END \
265_Pragma("GCC diagnostic pop")
266#else
267#define Z7_PURE_INTERFACES_BEGIN
268#define Z7_PURE_INTERFACES_END
269#endif
270
271// NewHandler.h and NewHandler.cpp redefine operator new() to throw exceptions, if compiled with old MSVC compilers
272#include "NewHandler.h"
273
274/*
275// #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
276#ifndef ARRAY_SIZE
277#define ARRAY_SIZE(a) Z7_ARRAY_SIZE(a)
278#endif
279*/ 26*/
280 27
281#endif // ZIP7_INC_COMMON_H
282
283
284
285// #define Z7_REDEFINE_NULL
286
287#if defined(Z7_REDEFINE_NULL) /* && (!defined(__clang__) || defined(_MSC_VER)) */
288
289// NULL is defined in <stddef.h>
290#include <stddef.h>
291#undef NULL
292
293#ifdef __cplusplus
294 #if defined (__cplusplus) && __cplusplus >= 201103L \
295 || (defined(_MSC_VER) && _MSC_VER >= 1800)
296 #define NULL nullptr
297 #else
298 #define NULL 0
299 #endif
300#else
301 #define NULL ((void *)0)
302#endif
303
304#else // Z7_REDEFINE_NULL
305
306#if defined(__clang__) && __clang_major__ >= 5
307#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
308#endif 28#endif
309
310#endif // Z7_REDEFINE_NULL
311
312// for precompiler:
313#include "MyWindows.h"
diff --git a/CPP/Common/Common0.h b/CPP/Common/Common0.h
new file mode 100644
index 0000000..55606cd
--- /dev/null
+++ b/CPP/Common/Common0.h
@@ -0,0 +1,330 @@
1// Common0.h
2
3#if defined(_MSC_VER) && _MSC_VER >= 1800
4#pragma warning(disable : 4464) // relative include path contains '..'
5#endif
6
7#ifndef ZIP7_INC_COMMON0_H
8#define ZIP7_INC_COMMON0_H
9
10#include "../../C/Compiler.h"
11
12/*
13This file contains compiler related things for cpp files.
14This file is included to all cpp files in 7-Zip via "Common.h".
15Also this file is included in "IDecl.h" (that is included in interface files).
16So external modules can use 7-Zip interfaces without
17predefined macros defined in "Common.h".
18*/
19
20#ifdef _MSC_VER
21 #pragma warning(disable : 4710) // function not inlined
22 // 'CUncopyable::CUncopyable':
23 #pragma warning(disable : 4514) // unreferenced inline function has been removed
24 #if _MSC_VER < 1300
25 #pragma warning(disable : 4702) // unreachable code
26 #pragma warning(disable : 4714) // function marked as __forceinline not inlined
27 #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
28 #endif
29 #if _MSC_VER < 1400
30 #pragma warning(disable : 4511) // copy constructor could not be generated // #pragma warning(disable : 4512) // assignment operator could not be generated
31 #pragma warning(disable : 4512) // assignment operator could not be generated
32 #endif
33 #if _MSC_VER > 1400 && _MSC_VER <= 1900
34 // #pragma warning(disable : 4996)
35 // strcat: This function or variable may be unsafe
36 // GetVersion was declared deprecated
37 #endif
38
39#if _MSC_VER > 1200
40// -Wall warnings
41
42#if _MSC_VER <= 1600
43#pragma warning(disable : 4917) // 'OLE_HANDLE' : a GUID can only be associated with a class, interface or namespace
44#endif
45
46// #pragma warning(disable : 4061) // enumerator '' in switch of enum '' is not explicitly handled by a case label
47// #pragma warning(disable : 4266) // no override available for virtual member function from base ''; function is hidden
48#pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted
49#pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted
50#if _MSC_VER >= 1600 && _MSC_VER < 1920
51#pragma warning(disable : 4571) // Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
52#endif
53#if _MSC_VER >= 1600
54#pragma warning(disable : 4365) // 'initializing' : conversion from 'int' to 'unsigned int', signed / unsigned mismatch
55#endif
56#if _MSC_VER < 1800
57// we disable the warning, if we don't use 'final' in class
58#pragma warning(disable : 4265) // class has virtual functions, but destructor is not virtual
59#endif
60
61#if _MSC_VER >= 1900
62#pragma warning(disable : 5026) // move constructor was implicitly defined as deleted
63#pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted
64#endif
65#if _MSC_VER >= 1912
66#pragma warning(disable : 5039) // pointer or reference to potentially throwing function passed to 'extern "C"' function under - EHc.Undefined behavior may occur if this function throws an exception.
67#endif
68#if _MSC_VER >= 1925
69// #pragma warning(disable : 5204) // 'ISequentialInStream' : class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly
70#endif
71#if _MSC_VER >= 1934
72// #pragma warning(disable : 5264) // const variable is not used
73#endif
74
75#endif // _MSC_VER > 1200
76#endif // _MSC_VER
77
78
79#if defined(_MSC_VER) // && !defined(__clang__)
80#define Z7_DECLSPEC_NOTHROW __declspec(nothrow)
81#elif defined(__clang__) || defined(__GNUC__)
82#define Z7_DECLSPEC_NOTHROW __attribute__((nothrow))
83#else
84#define Z7_DECLSPEC_NOTHROW
85#endif
86
87/*
88#if defined (_MSC_VER) && _MSC_VER >= 1900 \
89 || defined(__clang__) && __clang_major__ >= 6 \
90 || defined(__GNUC__) && __GNUC__ >= 6
91 #define Z7_noexcept noexcept
92#else
93 #define Z7_noexcept throw()
94#endif
95*/
96
97
98#if defined(__clang__)
99
100#if /* defined(_WIN32) && */ __clang_major__ >= 16
101#pragma GCC diagnostic ignored "-Wc++98-compat-pedantic"
102#endif
103
104#if __clang_major__ >= 4 && __clang_major__ < 12 && !defined(_WIN32)
105/*
106if compiled with new GCC libstdc++, GCC libstdc++ can use:
10713.2.0/include/c++/
108 <new> : #define _NEW
109 <stdlib.h> : #define _GLIBCXX_STDLIB_H 1
110*/
111#pragma GCC diagnostic ignored "-Wreserved-id-macro"
112#endif
113
114// noexcept, final, = delete
115#pragma GCC diagnostic ignored "-Wc++98-compat"
116#if __clang_major__ >= 4
117// throw() dynamic exception specifications are deprecated
118#pragma GCC diagnostic ignored "-Wdeprecated-dynamic-exception-spec"
119#endif
120
121#if __clang_major__ <= 6 // check it
122#pragma GCC diagnostic ignored "-Wsign-conversion"
123#endif
124
125#pragma GCC diagnostic ignored "-Wold-style-cast"
126#pragma GCC diagnostic ignored "-Wglobal-constructors"
127#pragma GCC diagnostic ignored "-Wexit-time-destructors"
128
129#if defined(Z7_LLVM_CLANG_VERSION) && __clang_major__ >= 18 // 18.1.0RC
130#pragma GCC diagnostic ignored "-Wswitch-default"
131#endif
132// #pragma GCC diagnostic ignored "-Wunused-private-field"
133// #pragma GCC diagnostic ignored "-Wnonportable-system-include-path"
134// #pragma GCC diagnostic ignored "-Wsuggest-override"
135// #pragma GCC diagnostic ignored "-Wsign-conversion"
136// #pragma GCC diagnostic ignored "-Winconsistent-missing-override"
137// #pragma GCC diagnostic ignored "-Wsuggest-destructor-override"
138// #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
139// #pragma GCC diagnostic ignored "-Wdeprecated-copy-with-user-provided-dtor"
140// #pragma GCC diagnostic ignored "-Wdeprecated-copy-dtor"
141// #ifndef _WIN32
142// #pragma GCC diagnostic ignored "-Wweak-vtables"
143// #endif
144/*
145#if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40400) \
146 || defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30000)
147// enumeration values not explicitly handled in switch
148#pragma GCC diagnostic ignored "-Wswitch-enum"
149#endif
150*/
151#endif // __clang__
152
153
154#ifdef __GNUC__
155// #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
156#endif
157
158
159/* There is BUG in MSVC 6.0 compiler for operator new[]:
160 It doesn't check overflow, when it calculates size in bytes for allocated array.
161 So we can use Z7_ARRAY_NEW macro instead of new[] operator. */
162
163#if defined(_MSC_VER) && (_MSC_VER == 1200) && !defined(_WIN64)
164 #define Z7_ARRAY_NEW(p, T, size) p = new T[((size) > 0xFFFFFFFFu / sizeof(T)) ? 0xFFFFFFFFu / sizeof(T) : (size)];
165#else
166 #define Z7_ARRAY_NEW(p, T, size) p = new T[size];
167#endif
168
169#if (defined(__GNUC__) && (__GNUC__ >= 8))
170 #define Z7_ATTR_NORETURN __attribute__((noreturn))
171#elif (defined(__clang__) && (__clang_major__ >= 3))
172 #if __has_feature(cxx_attributes)
173 #define Z7_ATTR_NORETURN [[noreturn]]
174 #else
175 #define Z7_ATTR_NORETURN __attribute__((noreturn))
176 #endif
177#elif (defined(_MSC_VER) && (_MSC_VER >= 1900))
178 #define Z7_ATTR_NORETURN [[noreturn]]
179#else
180 #define Z7_ATTR_NORETURN
181#endif
182
183
184// final in "GCC 4.7.0"
185// In C++98 and C++03 code the alternative spelling __final can be used instead (this is a GCC extension.)
186
187#if defined (__cplusplus) && __cplusplus >= 201103L \
188 || defined(_MSC_VER) && _MSC_VER >= 1800 \
189 || defined(__clang__) && __clang_major__ >= 4 \
190 /* || defined(__GNUC__) && __GNUC__ >= 9 */
191 #define Z7_final final
192 #if defined(__clang__) && __cplusplus < 201103L
193 #pragma GCC diagnostic ignored "-Wc++11-extensions"
194 #endif
195#elif defined (__cplusplus) && __cplusplus >= 199711L \
196 && defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
197 #define Z7_final __final
198#else
199 #define Z7_final
200 #if defined(__clang__) && __clang_major__ >= 4 \
201 || defined(__GNUC__) && __GNUC__ >= 4
202 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
203 #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
204 #endif
205#endif
206
207#define Z7_class_final(c) class c Z7_final
208
209
210#if defined (__cplusplus) && __cplusplus >= 201103L \
211 || (defined(_MSC_VER) && _MSC_VER >= 1800)
212 #define Z7_CPP_IS_SUPPORTED_default
213 #define Z7_eq_delete = delete
214 // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c) c(const c& k) = default;
215#else
216 #define Z7_eq_delete
217 // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c)
218#endif
219
220
221#if defined(__cplusplus) && (__cplusplus >= 201103L) \
222 || defined(_MSC_VER) && (_MSC_VER >= 1400) /* && (_MSC_VER != 1600) */ \
223 || defined(__clang__) && __clang_major__ >= 4
224 #if defined(_MSC_VER) && (_MSC_VER == 1600) /* && (_MSC_VER != 1600) */
225 #pragma warning(disable : 4481) // nonstandard extension used: override specifier 'override'
226 #define Z7_DESTRUCTOR_override
227 #else
228 #define Z7_DESTRUCTOR_override override
229 #endif
230 #define Z7_override override
231#else
232 #define Z7_override
233 #define Z7_DESTRUCTOR_override
234#endif
235
236
237
238#define Z7_CLASS_NO_COPY(cls) \
239 private: \
240 cls(const cls &) Z7_eq_delete; \
241 cls &operator=(const cls &) Z7_eq_delete;
242
243class CUncopyable
244{
245protected:
246 CUncopyable() {} // allow constructor
247 // ~CUncopyable() {}
248 Z7_CLASS_NO_COPY(CUncopyable)
249};
250
251#define MY_UNCOPYABLE :private CUncopyable
252// #define MY_UNCOPYABLE
253
254
255// typedef void (*Z7_void_Function)(void);
256
257#if defined(__clang__) || defined(__GNUC__)
258#define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<Z7_void_Function>(e))
259#else
260#define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<void*>(e))
261// #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(e)
262#endif
263
264#define Z7_GET_PROC_ADDRESS(func_type, hmodule, func_name) \
265 Z7_CAST_FUNC(func_type, GetProcAddress(hmodule, func_name))
266
267// || defined(__clang__)
268// || defined(__GNUC__)
269
270#if defined(_MSC_VER) && (_MSC_VER >= 1400)
271#define Z7_DECLSPEC_NOVTABLE __declspec(novtable)
272#else
273#define Z7_DECLSPEC_NOVTABLE
274#endif
275
276#ifdef __clang__
277#define Z7_PURE_INTERFACES_BEGIN \
278_Pragma("GCC diagnostic push") \
279_Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
280_Pragma("GCC diagnostic ignored \"-Wweak-vtables\"")
281#define Z7_PURE_INTERFACES_END \
282_Pragma("GCC diagnostic pop")
283#else
284#define Z7_PURE_INTERFACES_BEGIN
285#define Z7_PURE_INTERFACES_END
286#endif
287
288// NewHandler.h and NewHandler.cpp redefine operator new() to throw exceptions, if compiled with old MSVC compilers
289#include "NewHandler.h"
290
291/*
292// #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
293#ifndef ARRAY_SIZE
294#define ARRAY_SIZE(a) Z7_ARRAY_SIZE(a)
295#endif
296*/
297
298#endif // ZIP7_INC_COMMON0_H
299
300
301
302// #define Z7_REDEFINE_NULL
303
304#if defined(Z7_REDEFINE_NULL) /* && (!defined(__clang__) || defined(_MSC_VER)) */
305
306// NULL is defined in <stddef.h>
307#include <stddef.h>
308#undef NULL
309
310#ifdef __cplusplus
311 #if defined (__cplusplus) && __cplusplus >= 201103L \
312 || (defined(_MSC_VER) && _MSC_VER >= 1800)
313 #define NULL nullptr
314 #else
315 #define NULL 0
316 #endif
317#else
318 #define NULL ((void *)0)
319#endif
320
321#else // Z7_REDEFINE_NULL
322
323#if defined(__clang__) && __clang_major__ >= 5
324#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
325#endif
326
327#endif // Z7_REDEFINE_NULL
328
329// for precompiler:
330// #include "MyWindows.h"
diff --git a/CPP/Common/CrcReg.cpp b/CPP/Common/CrcReg.cpp
index 6cda892..cd5d3da 100644
--- a/CPP/Common/CrcReg.cpp
+++ b/CPP/Common/CrcReg.cpp
@@ -11,14 +11,6 @@
11 11
12EXTERN_C_BEGIN 12EXTERN_C_BEGIN
13 13
14// UInt32 Z7_FASTCALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table);
15
16extern CRC_FUNC g_CrcUpdate;
17// extern CRC_FUNC g_CrcUpdateT4;
18extern CRC_FUNC g_CrcUpdateT8;
19extern CRC_FUNC g_CrcUpdateT0_32;
20extern CRC_FUNC g_CrcUpdateT0_64;
21
22EXTERN_C_END 14EXTERN_C_END
23 15
24Z7_CLASS_IMP_COM_2( 16Z7_CLASS_IMP_COM_2(
@@ -27,7 +19,7 @@ Z7_CLASS_IMP_COM_2(
27 , ICompressSetCoderProperties 19 , ICompressSetCoderProperties
28) 20)
29 UInt32 _crc; 21 UInt32 _crc;
30 CRC_FUNC _updateFunc; 22 Z7_CRC_UPDATE_FUNC _updateFunc;
31 23
32 Z7_CLASS_NO_COPY(CCrcHasher) 24 Z7_CLASS_NO_COPY(CCrcHasher)
33 25
@@ -40,17 +32,10 @@ public:
40 32
41bool CCrcHasher::SetFunctions(UInt32 tSize) 33bool CCrcHasher::SetFunctions(UInt32 tSize)
42{ 34{
43 CRC_FUNC f = NULL; 35 const Z7_CRC_UPDATE_FUNC f = z7_GetFunc_CrcUpdate(tSize);
44 if (tSize == 0) f = g_CrcUpdate;
45 // else if (tSize == 1) f = CrcUpdateT1;
46 // else if (tSize == 4) f = g_CrcUpdateT4;
47 else if (tSize == 8) f = g_CrcUpdateT8;
48 else if (tSize == 32) f = g_CrcUpdateT0_32;
49 else if (tSize == 64) f = g_CrcUpdateT0_64;
50
51 if (!f) 36 if (!f)
52 { 37 {
53 _updateFunc = g_CrcUpdate; 38 _updateFunc = CrcUpdate;
54 return false; 39 return false;
55 } 40 }
56 _updateFunc = f; 41 _updateFunc = f;
@@ -80,7 +65,7 @@ Z7_COM7F_IMF2(void, CCrcHasher::Init())
80 65
81Z7_COM7F_IMF2(void, CCrcHasher::Update(const void *data, UInt32 size)) 66Z7_COM7F_IMF2(void, CCrcHasher::Update(const void *data, UInt32 size))
82{ 67{
83 _crc = _updateFunc(_crc, data, size, g_CrcTable); 68 _crc = _updateFunc(_crc, data, size);
84} 69}
85 70
86Z7_COM7F_IMF2(void, CCrcHasher::Final(Byte *digest)) 71Z7_COM7F_IMF2(void, CCrcHasher::Final(Byte *digest))
diff --git a/CPP/Common/DynamicBuffer.h b/CPP/Common/DynamicBuffer.h
index 714be4a..b03d371 100644
--- a/CPP/Common/DynamicBuffer.h
+++ b/CPP/Common/DynamicBuffer.h
@@ -5,7 +5,7 @@
5 5
6#include <string.h> 6#include <string.h>
7 7
8#include "Common.h" 8#include "MyTypes.h"
9 9
10template <class T> class CDynamicBuffer 10template <class T> class CDynamicBuffer
11{ 11{
@@ -43,6 +43,14 @@ public:
43 operator const T *() const { return _items; } 43 operator const T *() const { return _items; }
44 ~CDynamicBuffer() { delete []_items; } 44 ~CDynamicBuffer() { delete []_items; }
45 45
46 void Free()
47 {
48 delete []_items;
49 _items = NULL;
50 _size = 0;
51 _pos = 0;
52 }
53
46 T *GetCurPtrAndGrow(size_t addSize) 54 T *GetCurPtrAndGrow(size_t addSize)
47 { 55 {
48 size_t rem = _size - _pos; 56 size_t rem = _size - _pos;
@@ -63,6 +71,6 @@ public:
63 // void Empty() { _pos = 0; } 71 // void Empty() { _pos = 0; }
64}; 72};
65 73
66typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer; 74typedef CDynamicBuffer<Byte> CByteDynamicBuffer;
67 75
68#endif 76#endif
diff --git a/CPP/Common/IntToString.cpp b/CPP/Common/IntToString.cpp
index 21b0680..0a7cb3b 100644
--- a/CPP/Common/IntToString.cpp
+++ b/CPP/Common/IntToString.cpp
@@ -7,10 +7,19 @@
7#include "IntToString.h" 7#include "IntToString.h"
8 8
9#define CONVERT_INT_TO_STR(charType, tempSize) \ 9#define CONVERT_INT_TO_STR(charType, tempSize) \
10 unsigned char temp[tempSize]; unsigned i = 0; \ 10 if (val < 10) \
11 while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ 11 *s++ = (charType)('0' + (unsigned)val); \
12 *s++ = (charType)('0' + (unsigned)val); \ 12 else { \
13 while (i != 0) { i--; *s++ = (charType)temp[i]; } \ 13 Byte temp[tempSize]; \
14 size_t i = 0; \
15 do { \
16 temp[++i] = (Byte)('0' + (unsigned)(val % 10)); \
17 val /= 10; } \
18 while (val >= 10); \
19 *s++ = (charType)('0' + (unsigned)val); \
20 do { *s++ = (charType)temp[i]; } \
21 while (--i); \
22 } \
14 *s = 0; \ 23 *s = 0; \
15 return s; 24 return s;
16 25
@@ -22,88 +31,109 @@ char * ConvertUInt32ToString(UInt32 val, char *s) throw()
22char * ConvertUInt64ToString(UInt64 val, char *s) throw() 31char * ConvertUInt64ToString(UInt64 val, char *s) throw()
23{ 32{
24 if (val <= (UInt32)0xFFFFFFFF) 33 if (val <= (UInt32)0xFFFFFFFF)
25 {
26 return ConvertUInt32ToString((UInt32)val, s); 34 return ConvertUInt32ToString((UInt32)val, s);
27 }
28 CONVERT_INT_TO_STR(char, 24) 35 CONVERT_INT_TO_STR(char, 24)
29} 36}
30 37
31void ConvertUInt64ToOct(UInt64 val, char *s) throw() 38wchar_t * ConvertUInt32ToString(UInt32 val, wchar_t *s) throw()
32{ 39{
33 UInt64 v = val; 40 CONVERT_INT_TO_STR(wchar_t, 16)
34 unsigned i; 41}
35 for (i = 1;; i++) 42
43wchar_t * ConvertUInt64ToString(UInt64 val, wchar_t *s) throw()
44{
45 if (val <= (UInt32)0xFFFFFFFF)
46 return ConvertUInt32ToString((UInt32)val, s);
47 CONVERT_INT_TO_STR(wchar_t, 24)
48}
49
50void ConvertInt64ToString(Int64 val, char *s) throw()
51{
52 if (val < 0)
36 { 53 {
37 v >>= 3; 54 *s++ = '-';
38 if (v == 0) 55 val = -val;
39 break;
40 } 56 }
41 s[i] = 0; 57 ConvertUInt64ToString((UInt64)val, s);
42 do 58}
59
60void ConvertInt64ToString(Int64 val, wchar_t *s) throw()
61{
62 if (val < 0)
43 { 63 {
44 unsigned t = (unsigned)(val & 0x7); 64 *s++ = L'-';
45 val >>= 3; 65 val = -val;
46 s[--i] = (char)('0' + t);
47 } 66 }
48 while (i); 67 ConvertUInt64ToString((UInt64)val, s);
49} 68}
50 69
51 70
52#define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) 71void ConvertUInt64ToOct(UInt64 val, char *s) throw()
53 72{
54static inline char GetHexChar(unsigned t) { return GET_HEX_CHAR(t); } 73 {
74 UInt64 v = val;
75 do
76 s++;
77 while (v >>= 3);
78 }
79 *s = 0;
80 do
81 {
82 const unsigned t = (unsigned)val & 7;
83 *--s = (char)('0' + t);
84 }
85 while (val >>= 3);
86}
55 87
88MY_ALIGN(16) const char k_Hex_Upper[16] =
89 { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
90MY_ALIGN(16) const char k_Hex_Lower[16] =
91 { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
56 92
57void ConvertUInt32ToHex(UInt32 val, char *s) throw() 93void ConvertUInt32ToHex(UInt32 val, char *s) throw()
58{ 94{
59 UInt32 v = val;
60 unsigned i;
61 for (i = 1;; i++)
62 { 95 {
63 v >>= 4; 96 UInt32 v = val;
64 if (v == 0) 97 do
65 break; 98 s++;
99 while (v >>= 4);
66 } 100 }
67 s[i] = 0; 101 *s = 0;
68 do 102 do
69 { 103 {
70 unsigned t = (unsigned)(val & 0xF); 104 const unsigned t = (unsigned)val & 0xF;
71 val >>= 4; 105 *--s = GET_HEX_CHAR_UPPER(t);
72 s[--i] = GET_HEX_CHAR(t);
73 } 106 }
74 while (i); 107 while (val >>= 4);
75} 108}
76 109
77
78void ConvertUInt64ToHex(UInt64 val, char *s) throw() 110void ConvertUInt64ToHex(UInt64 val, char *s) throw()
79{ 111{
80 UInt64 v = val;
81 unsigned i;
82 for (i = 1;; i++)
83 { 112 {
84 v >>= 4; 113 UInt64 v = val;
85 if (v == 0) 114 do
86 break; 115 s++;
116 while (v >>= 4);
87 } 117 }
88 s[i] = 0; 118 *s = 0;
89 do 119 do
90 { 120 {
91 unsigned t = (unsigned)(val & 0xF); 121 const unsigned t = (unsigned)val & 0xF;
92 val >>= 4; 122 *--s = GET_HEX_CHAR_UPPER(t);
93 s[--i] = GET_HEX_CHAR(t);
94 } 123 }
95 while (i); 124 while (val >>= 4);
96} 125}
97 126
98void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw() 127void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw()
99{ 128{
100 s[8] = 0; 129 s[8] = 0;
101 for (int i = 7; i >= 0; i--) 130 int i = 7;
131 do
102 { 132 {
103 unsigned t = val & 0xF; 133 { const unsigned t = (unsigned)val & 0xF; s[i--] = GET_HEX_CHAR_UPPER(t); }
104 val >>= 4; 134 { const unsigned t = (Byte)val >> 4; val >>= 8; s[i--] = GET_HEX_CHAR_UPPER(t); }
105 s[i] = GET_HEX_CHAR(t);
106 } 135 }
136 while (i >= 0);
107} 137}
108 138
109/* 139/*
@@ -112,81 +142,74 @@ void ConvertUInt32ToHex8Digits(UInt32 val, wchar_t *s)
112 s[8] = 0; 142 s[8] = 0;
113 for (int i = 7; i >= 0; i--) 143 for (int i = 7; i >= 0; i--)
114 { 144 {
115 unsigned t = val & 0xF; 145 const unsigned t = (unsigned)val & 0xF;
116 val >>= 4; 146 val >>= 4;
117 s[i] = (wchar_t)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))); 147 s[i] = GET_HEX_CHAR(t);
118 } 148 }
119} 149}
120*/ 150*/
121 151
122wchar_t * ConvertUInt32ToString(UInt32 val, wchar_t *s) throw()
123{
124 CONVERT_INT_TO_STR(wchar_t, 16)
125}
126
127wchar_t * ConvertUInt64ToString(UInt64 val, wchar_t *s) throw()
128{
129 if (val <= (UInt32)0xFFFFFFFF)
130 {
131 return ConvertUInt32ToString((UInt32)val, s);
132 }
133 CONVERT_INT_TO_STR(wchar_t, 24)
134}
135 152
136void ConvertInt64ToString(Int64 val, char *s) throw() 153MY_ALIGN(16) static const Byte k_Guid_Pos[] =
137{ 154 { 6,4,2,0, 11,9, 16,14, 19,21, 24,26,28,30,32,34 };
138 if (val < 0)
139 {
140 *s++ = '-';
141 val = -val;
142 }
143 ConvertUInt64ToString((UInt64)val, s);
144}
145 155
146void ConvertInt64ToString(Int64 val, wchar_t *s) throw() 156char *RawLeGuidToString(const Byte *g, char *s) throw()
147{ 157{
148 if (val < 0) 158 s[ 8] = '-';
159 s[13] = '-';
160 s[18] = '-';
161 s[23] = '-';
162 s[36] = 0;
163 for (unsigned i = 0; i < 16; i++)
149 { 164 {
150 *s++ = L'-'; 165 char *s2 = s + k_Guid_Pos[i];
151 val = -val; 166 const unsigned v = g[i];
167 s2[0] = GET_HEX_CHAR_UPPER(v >> 4);
168 s2[1] = GET_HEX_CHAR_UPPER(v & 0xF);
152 } 169 }
153 ConvertUInt64ToString((UInt64)val, s); 170 return s + 36;
154} 171}
155 172
156 173char *RawLeGuidToString_Braced(const Byte *g, char *s) throw()
157static void ConvertByteToHex2Digits(unsigned v, char *s) throw()
158{ 174{
159 s[0] = GetHexChar(v >> 4); 175 *s++ = '{';
160 s[1] = GetHexChar(v & 0xF); 176 s = RawLeGuidToString(g, s);
177 *s++ = '}';
178 *s = 0;
179 return s;
161} 180}
162 181
163static void ConvertUInt16ToHex4Digits(UInt32 val, char *s) throw()
164{
165 ConvertByteToHex2Digits(val >> 8, s);
166 ConvertByteToHex2Digits(val & 0xFF, s + 2);
167}
168 182
169char *RawLeGuidToString(const Byte *g, char *s) throw() 183void ConvertDataToHex_Lower(char *dest, const Byte *src, size_t size) throw()
170{ 184{
171 ConvertUInt32ToHex8Digits(GetUi32(g ), s); s += 8; *s++ = '-'; 185 if (size)
172 ConvertUInt16ToHex4Digits(GetUi16(g + 4), s); s += 4; *s++ = '-';
173 ConvertUInt16ToHex4Digits(GetUi16(g + 6), s); s += 4; *s++ = '-';
174 for (unsigned i = 0; i < 8; i++)
175 { 186 {
176 if (i == 2) 187 const Byte *lim = src + size;
177 *s++ = '-'; 188 do
178 ConvertByteToHex2Digits(g[8 + i], s); 189 {
179 s += 2; 190 const unsigned b = *src++;
191 dest[0] = GET_HEX_CHAR_LOWER(b >> 4);
192 dest[1] = GET_HEX_CHAR_LOWER(b & 0xF);
193 dest += 2;
194 }
195 while (src != lim);
180 } 196 }
181 *s = 0; 197 *dest = 0;
182 return s;
183} 198}
184 199
185char *RawLeGuidToString_Braced(const Byte *g, char *s) throw() 200void ConvertDataToHex_Upper(char *dest, const Byte *src, size_t size) throw()
186{ 201{
187 *s++ = '{'; 202 if (size)
188 s = RawLeGuidToString(g, s); 203 {
189 *s++ = '}'; 204 const Byte *lim = src + size;
190 *s = 0; 205 do
191 return s; 206 {
207 const unsigned b = *src++;
208 dest[0] = GET_HEX_CHAR_UPPER(b >> 4);
209 dest[1] = GET_HEX_CHAR_UPPER(b & 0xF);
210 dest += 2;
211 }
212 while (src != lim);
213 }
214 *dest = 0;
192} 215}
diff --git a/CPP/Common/IntToString.h b/CPP/Common/IntToString.h
index f4fc662..2f096d6 100644
--- a/CPP/Common/IntToString.h
+++ b/CPP/Common/IntToString.h
@@ -12,19 +12,43 @@ char * ConvertUInt64ToString(UInt64 value, char *s) throw();
12 12
13wchar_t * ConvertUInt32ToString(UInt32 value, wchar_t *s) throw(); 13wchar_t * ConvertUInt32ToString(UInt32 value, wchar_t *s) throw();
14wchar_t * ConvertUInt64ToString(UInt64 value, wchar_t *s) throw(); 14wchar_t * ConvertUInt64ToString(UInt64 value, wchar_t *s) throw();
15void ConvertInt64ToString(Int64 value, char *s) throw();
16void ConvertInt64ToString(Int64 value, wchar_t *s) throw();
15 17
16void ConvertUInt64ToOct(UInt64 value, char *s) throw(); 18void ConvertUInt64ToOct(UInt64 value, char *s) throw();
17 19
20extern const char k_Hex_Upper[16];
21extern const char k_Hex_Lower[16];
22
23#define GET_HEX_CHAR_UPPER(t) (k_Hex_Upper[t])
24#define GET_HEX_CHAR_LOWER(t) (k_Hex_Lower[t])
25/*
26// #define GET_HEX_CHAR_UPPER(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))))
27static inline unsigned GetHex_Lower(unsigned v)
28{
29 const unsigned v0 = v + '0';
30 v += 'a' - 10;
31 if (v < 'a')
32 v = v0;
33 return v;
34}
35static inline char GetHex_Upper(unsigned v)
36{
37 return (char)((v < 10) ? ('0' + v) : ('A' + (v - 10)));
38}
39*/
40
41
18void ConvertUInt32ToHex(UInt32 value, char *s) throw(); 42void ConvertUInt32ToHex(UInt32 value, char *s) throw();
19void ConvertUInt64ToHex(UInt64 value, char *s) throw(); 43void ConvertUInt64ToHex(UInt64 value, char *s) throw();
20void ConvertUInt32ToHex8Digits(UInt32 value, char *s) throw(); 44void ConvertUInt32ToHex8Digits(UInt32 value, char *s) throw();
21// void ConvertUInt32ToHex8Digits(UInt32 value, wchar_t *s) throw(); 45// void ConvertUInt32ToHex8Digits(UInt32 value, wchar_t *s) throw();
22 46
23void ConvertInt64ToString(Int64 value, char *s) throw();
24void ConvertInt64ToString(Int64 value, wchar_t *s) throw();
25
26// use RawLeGuid only for RAW bytes that contain stored GUID as Little-endian. 47// use RawLeGuid only for RAW bytes that contain stored GUID as Little-endian.
27char *RawLeGuidToString(const Byte *guid, char *s) throw(); 48char *RawLeGuidToString(const Byte *guid, char *s) throw();
28char *RawLeGuidToString_Braced(const Byte *guid, char *s) throw(); 49char *RawLeGuidToString_Braced(const Byte *guid, char *s) throw();
29 50
51void ConvertDataToHex_Lower(char *dest, const Byte *src, size_t size) throw();
52void ConvertDataToHex_Upper(char *dest, const Byte *src, size_t size) throw();
53
30#endif 54#endif
diff --git a/CPP/Common/ListFileUtils.cpp b/CPP/Common/ListFileUtils.cpp
index e43dbc9..714b275 100644
--- a/CPP/Common/ListFileUtils.cpp
+++ b/CPP/Common/ListFileUtils.cpp
@@ -76,26 +76,26 @@ bool ReadNamesFromListFile2(CFSTR fileName, UStringVector &strings, UINT codePag
76 return false; 76 return false;
77 77
78 file.Close(); 78 file.Close();
79 const unsigned num = (unsigned)fileSize / 2; 79 const size_t num = (size_t)fileSize / 2;
80 wchar_t *p = u.GetBuf(num); 80 wchar_t *p = u.GetBuf((unsigned)num);
81 if (codePage == Z7_WIN_CP_UTF16) 81 if (codePage == Z7_WIN_CP_UTF16)
82 for (unsigned i = 0; i < num; i++) 82 for (size_t i = 0; i < num; i++)
83 { 83 {
84 wchar_t c = GetUi16(buf + (size_t)i * 2); 84 const wchar_t c = GetUi16(buf.ConstData() + (size_t)i * 2);
85 if (c == 0) 85 if (c == 0)
86 return false; 86 return false;
87 p[i] = c; 87 p[i] = c;
88 } 88 }
89 else 89 else
90 for (unsigned i = 0; i < num; i++) 90 for (size_t i = 0; i < num; i++)
91 { 91 {
92 wchar_t c = (wchar_t)GetBe16(buf + (size_t)i * 2); 92 const wchar_t c = (wchar_t)GetBe16(buf.ConstData() + (size_t)i * 2);
93 if (c == 0) 93 if (c == 0)
94 return false; 94 return false;
95 p[i] = c; 95 p[i] = c;
96 } 96 }
97 p[num] = 0; 97 p[num] = 0;
98 u.ReleaseBuf_SetLen(num); 98 u.ReleaseBuf_SetLen((unsigned)num);
99 } 99 }
100 else 100 else
101 { 101 {
diff --git a/CPP/Common/MyBuffer.h b/CPP/Common/MyBuffer.h
index bc829f4..80f0205 100644
--- a/CPP/Common/MyBuffer.h
+++ b/CPP/Common/MyBuffer.h
@@ -51,6 +51,12 @@ public:
51 51
52 operator T *() { return _items; } 52 operator T *() { return _items; }
53 operator const T *() const { return _items; } 53 operator const T *() const { return _items; }
54 const T* ConstData() const { return _items; }
55 T* NonConstData() const { return _items; }
56 T* NonConstData() { return _items; }
57 // const T* Data() const { return _items; }
58 // T* Data() { return _items; }
59
54 size_t Size() const { return _size; } 60 size_t Size() const { return _size; }
55 61
56 void Alloc(size_t size) 62 void Alloc(size_t size)
@@ -140,15 +146,15 @@ bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
140 146
141// typedef CBuffer<char> CCharBuffer; 147// typedef CBuffer<char> CCharBuffer;
142// typedef CBuffer<wchar_t> CWCharBuffer; 148// typedef CBuffer<wchar_t> CWCharBuffer;
143typedef CBuffer<unsigned char> CByteBuffer; 149typedef CBuffer<Byte> CByteBuffer;
144 150
145 151
146class CByteBuffer_Wipe: public CByteBuffer 152class CByteBuffer_Wipe: public CByteBuffer
147{ 153{
148 Z7_CLASS_NO_COPY(CByteBuffer_Wipe) 154 Z7_CLASS_NO_COPY(CByteBuffer_Wipe)
149public: 155public:
150 // CByteBuffer_Wipe(): CBuffer<unsigned char>() {} 156 // CByteBuffer_Wipe(): CBuffer<Byte>() {}
151 CByteBuffer_Wipe(size_t size): CBuffer<unsigned char>(size) {} 157 CByteBuffer_Wipe(size_t size): CBuffer<Byte>(size) {}
152 ~CByteBuffer_Wipe() { Wipe(); } 158 ~CByteBuffer_Wipe() { Wipe(); }
153}; 159};
154 160
@@ -181,6 +187,11 @@ public:
181 187
182 operator T *() { return _items; } 188 operator T *() { return _items; }
183 operator const T *() const { return _items; } 189 operator const T *() const { return _items; }
190 const T* ConstData() const { return _items; }
191 T* NonConstData() const { return _items; }
192 T* NonConstData() { return _items; }
193 // const T* Data() const { return _items; }
194 // T* Data() { return _items; }
184 195
185 void Alloc(size_t newSize) 196 void Alloc(size_t newSize)
186 { 197 {
@@ -191,7 +202,7 @@ public:
191 } 202 }
192}; 203};
193 204
194typedef CObjArray<unsigned char> CByteArr; 205typedef CObjArray<Byte> CByteArr;
195typedef CObjArray<bool> CBoolArr; 206typedef CObjArray<bool> CBoolArr;
196typedef CObjArray<int> CIntArr; 207typedef CObjArray<int> CIntArr;
197typedef CObjArray<unsigned> CUIntArr; 208typedef CObjArray<unsigned> CUIntArr;
diff --git a/CPP/Common/MyBuffer2.h b/CPP/Common/MyBuffer2.h
index 23394f8..1ec8ffb 100644
--- a/CPP/Common/MyBuffer2.h
+++ b/CPP/Common/MyBuffer2.h
@@ -65,13 +65,13 @@ class CAlignedBuffer1
65public: 65public:
66 ~CAlignedBuffer1() 66 ~CAlignedBuffer1()
67 { 67 {
68 ISzAlloc_Free(&g_AlignedAlloc, _data); 68 z7_AlignedFree(_data);
69 } 69 }
70 70
71 CAlignedBuffer1(size_t size) 71 CAlignedBuffer1(size_t size)
72 { 72 {
73 _data = NULL; 73 _data = NULL;
74 _data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size); 74 _data = (Byte *)z7_AlignedAlloc(size);
75 if (!_data) 75 if (!_data)
76 throw 1; 76 throw 1;
77 } 77 }
@@ -92,21 +92,23 @@ public:
92 CAlignedBuffer(): _data(NULL), _size(0) {} 92 CAlignedBuffer(): _data(NULL), _size(0) {}
93 ~CAlignedBuffer() 93 ~CAlignedBuffer()
94 { 94 {
95 ISzAlloc_Free(&g_AlignedAlloc, _data); 95 z7_AlignedFree(_data);
96 } 96 }
97 97
98 /*
98 CAlignedBuffer(size_t size): _size(0) 99 CAlignedBuffer(size_t size): _size(0)
99 { 100 {
100 _data = NULL; 101 _data = NULL;
101 _data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size); 102 _data = (Byte *)z7_AlignedAlloc(size);
102 if (!_data) 103 if (!_data)
103 throw 1; 104 throw 1;
104 _size = size; 105 _size = size;
105 } 106 }
107 */
106 108
107 void Free() 109 void Free()
108 { 110 {
109 ISzAlloc_Free(&g_AlignedAlloc, _data); 111 z7_AlignedFree(_data);
110 _data = NULL; 112 _data = NULL;
111 _size = 0; 113 _size = 0;
112 } 114 }
@@ -120,10 +122,10 @@ public:
120 { 122 {
121 if (!_data || size != _size) 123 if (!_data || size != _size)
122 { 124 {
123 ISzAlloc_Free(&g_AlignedAlloc, _data); 125 z7_AlignedFree(_data);
124 _size = 0; 126 _size = 0;
125 _data = NULL; 127 _data = NULL;
126 _data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size); 128 _data = (Byte *)z7_AlignedAlloc(size);
127 if (_data) 129 if (_data)
128 _size = size; 130 _size = size;
129 } 131 }
@@ -133,10 +135,29 @@ public:
133 { 135 {
134 if (!_data || size > _size) 136 if (!_data || size > _size)
135 { 137 {
136 ISzAlloc_Free(&g_AlignedAlloc, _data); 138 z7_AlignedFree(_data);
137 _size = 0; 139 _size = 0;
138 _data = NULL; 140 _data = NULL;
139 _data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size); 141 _data = (Byte *)z7_AlignedAlloc(size);
142 if (_data)
143 _size = size;
144 }
145 }
146
147 // (size <= size_max)
148 void AllocAtLeast_max(size_t size, size_t size_max)
149 {
150 if (!_data || size > _size)
151 {
152 z7_AlignedFree(_data);
153 _size = 0;
154 _data = NULL;
155 if (size_max < size) size_max = size; // optional check
156 const size_t delta = size / 2;
157 size += delta;
158 if (size < delta || size > size_max)
159 size = size_max;
160 _data = (Byte *)z7_AlignedAlloc(size);
140 if (_data) 161 if (_data)
141 _size = size; 162 _size = size;
142 } 163 }
diff --git a/CPP/Common/MyCom.h b/CPP/Common/MyCom.h
index 65c4330..a3cc3c8 100644
--- a/CPP/Common/MyCom.h
+++ b/CPP/Common/MyCom.h
@@ -17,6 +17,7 @@ public:
17 ~CMyComPtr() { if (_p) _p->Release(); } 17 ~CMyComPtr() { if (_p) _p->Release(); }
18 void Release() { if (_p) { _p->Release(); _p = NULL; } } 18 void Release() { if (_p) { _p->Release(); _p = NULL; } }
19 operator T*() const { return (T*)_p; } 19 operator T*() const { return (T*)_p; }
20 T* Interface() const { return (T*)_p; }
20 // T& operator*() const { return *_p; } 21 // T& operator*() const { return *_p; }
21 T** operator&() { return &_p; } 22 T** operator&() { return &_p; }
22 T* operator->() const { return _p; } 23 T* operator->() const { return _p; }
@@ -68,6 +69,112 @@ public:
68 } 69 }
69}; 70};
70 71
72
73template <class iface, class cls>
74class CMyComPtr2
75{
76 cls* _p;
77
78 CMyComPtr2(const CMyComPtr2<iface, cls>& lp);
79 CMyComPtr2(cls* p);
80 CMyComPtr2(iface* p);
81 iface* operator=(const CMyComPtr2<iface, cls>& lp);
82 iface* operator=(cls* p);
83 iface* operator=(iface* p);
84public:
85 CMyComPtr2(): _p(NULL) {}
86 ~CMyComPtr2()
87 {
88 if (_p)
89 {
90 iface *ip = _p;
91 ip->Release();
92 }
93 }
94 // void Release() { if (_p) { (iface *)_p->Release(); _p = NULL; } }
95 cls* operator->() const { return _p; }
96 cls* ClsPtr() const { return _p; }
97 operator iface*() const
98 {
99 iface *ip = _p;
100 return ip;
101 }
102 iface* Interface() const
103 {
104 iface *ip = _p;
105 return ip;
106 }
107 // operator bool() const { return _p != NULL; }
108 bool IsDefined() const { return _p != NULL; }
109 void Create_if_Empty()
110 {
111 if (!_p)
112 {
113 _p = new cls;
114 iface *ip = _p;
115 ip->AddRef();
116 }
117 }
118 iface* Detach()
119 {
120 iface *ip = _p;
121 _p = NULL;
122 return ip;
123 }
124 void SetFromCls(cls *src)
125 {
126 if (src)
127 {
128 iface *ip = src;
129 ip->AddRef();
130 }
131 if (_p)
132 {
133 iface *ip = _p;
134 ip->Release();
135 }
136 _p = src;
137 }
138};
139
140
141template <class iface, class cls>
142class CMyComPtr2_Create
143{
144 cls* _p;
145
146 CMyComPtr2_Create(const CMyComPtr2_Create<iface, cls>& lp);
147 CMyComPtr2_Create(cls* p);
148 CMyComPtr2_Create(iface* p);
149 iface* operator=(const CMyComPtr2_Create<iface, cls>& lp);
150 iface* operator=(cls* p);
151 iface* operator=(iface* p);
152public:
153 CMyComPtr2_Create(): _p(new cls)
154 {
155 iface *ip = _p;
156 ip->AddRef();
157 }
158 ~CMyComPtr2_Create()
159 {
160 iface *ip = _p;
161 ip->Release();
162 }
163 cls* operator->() const { return _p; }
164 cls* ClsPtr() const { return _p; }
165 operator iface*() const
166 {
167 iface *ip = _p;
168 return ip;
169 }
170 iface* Interface() const
171 {
172 iface *ip = _p;
173 return ip;
174 }
175};
176
177
71#define Z7_DECL_CMyComPtr_QI_FROM(i, v, unk) \ 178#define Z7_DECL_CMyComPtr_QI_FROM(i, v, unk) \
72 CMyComPtr<i> v; (unk)->QueryInterface(IID_ ## i, (void **)&v); 179 CMyComPtr<i> v; (unk)->QueryInterface(IID_ ## i, (void **)&v);
73 180
@@ -234,16 +341,56 @@ protected:
234 Z7_COM_QI_ENTRY_UNKNOWN(i) \ 341 Z7_COM_QI_ENTRY_UNKNOWN(i) \
235 Z7_COM_QI_ENTRY(i) 342 Z7_COM_QI_ENTRY(i)
236 343
237#define Z7_COM_QI_END \ 344
345#define Z7_COM_ADDREF_RELEASE_MT \
346 private: \
347 STDMETHOD_(ULONG, AddRef)() Z7_override Z7_final \
348 { return (ULONG)InterlockedIncrement((LONG *)&_m_RefCount); } \
349 STDMETHOD_(ULONG, Release)() Z7_override Z7_final \
350 { const LONG v = InterlockedDecrement((LONG *)&_m_RefCount); \
351 if (v != 0) return (ULONG)v; \
352 delete this; return 0; }
353
354#define Z7_COM_QI_END_MT \
238 else return E_NOINTERFACE; \ 355 else return E_NOINTERFACE; \
239 ++_m_RefCount; /* AddRef(); */ return S_OK; } 356 InterlockedIncrement((LONG *)&_m_RefCount); /* AddRef(); */ return S_OK; }
357
358// you can define Z7_COM_USE_ATOMIC,
359// if you want to call Release() from different threads (for example, for .NET code)
360// #define Z7_COM_USE_ATOMIC
361
362#if defined(Z7_COM_USE_ATOMIC) && !defined(Z7_ST)
363
364#ifndef _WIN32
365#if 0
366#include "../../C/Threads.h"
367#else
368EXTERN_C_BEGIN
369LONG InterlockedIncrement(LONG volatile *addend);
370LONG InterlockedDecrement(LONG volatile *addend);
371EXTERN_C_END
372#endif
373#endif // _WIN32
374
375#define Z7_COM_ADDREF_RELEASE Z7_COM_ADDREF_RELEASE_MT
376#define Z7_COM_QI_END Z7_COM_QI_END_MT
377
378#else // !Z7_COM_USE_ATOMIC
240 379
241#define Z7_COM_ADDREF_RELEASE \ 380#define Z7_COM_ADDREF_RELEASE \
242 private: \ 381 private: \
243 STDMETHOD_(ULONG, AddRef)() throw() Z7_override Z7_final \ 382 STDMETHOD_(ULONG, AddRef)() throw() Z7_override Z7_final \
244 { return ++_m_RefCount; } \ 383 { return ++_m_RefCount; } \
245 STDMETHOD_(ULONG, Release)() throw() Z7_override Z7_final \ 384 STDMETHOD_(ULONG, Release)() throw() Z7_override Z7_final \
246 { if (--_m_RefCount != 0) return _m_RefCount; delete this; return 0; } \ 385 { if (--_m_RefCount != 0) return _m_RefCount; \
386 delete this; return 0; }
387
388#define Z7_COM_QI_END \
389 else return E_NOINTERFACE; \
390 ++_m_RefCount; /* AddRef(); */ return S_OK; }
391
392#endif // !Z7_COM_USE_ATOMIC
393
247 394
248#define Z7_COM_UNKNOWN_IMP_SPEC(i) \ 395#define Z7_COM_UNKNOWN_IMP_SPEC(i) \
249 Z7_COM_QI_BEGIN \ 396 Z7_COM_QI_BEGIN \
diff --git a/CPP/Common/MyGuidDef.h b/CPP/Common/MyGuidDef.h
index ab9993b..3aa5266 100644
--- a/CPP/Common/MyGuidDef.h
+++ b/CPP/Common/MyGuidDef.h
@@ -13,7 +13,7 @@ typedef struct {
13 UInt32 Data1; 13 UInt32 Data1;
14 UInt16 Data2; 14 UInt16 Data2;
15 UInt16 Data3; 15 UInt16 Data3;
16 unsigned char Data4[8]; 16 Byte Data4[8];
17} GUID; 17} GUID;
18 18
19#ifdef __cplusplus 19#ifdef __cplusplus
@@ -32,7 +32,7 @@ typedef GUID CLSID;
32inline int operator==(REFGUID g1, REFGUID g2) 32inline int operator==(REFGUID g1, REFGUID g2)
33{ 33{
34 for (unsigned i = 0; i < sizeof(g1); i++) 34 for (unsigned i = 0; i < sizeof(g1); i++)
35 if (((const unsigned char *)&g1)[i] != ((const unsigned char *)&g2)[i]) 35 if (((const Byte *)&g1)[i] != ((const Byte *)&g2)[i])
36 return 0; 36 return 0;
37 return 1; 37 return 1;
38} 38}
diff --git a/CPP/Common/MyMap.cpp b/CPP/Common/MyMap.cpp
index 0a200f0..d130aec 100644
--- a/CPP/Common/MyMap.cpp
+++ b/CPP/Common/MyMap.cpp
@@ -103,7 +103,7 @@ bool CMap32::Set(UInt32 key, UInt32 value)
103 n.IsLeaf[newBit] = 1; 103 n.IsLeaf[newBit] = 1;
104 n.IsLeaf[1 - newBit] = 0; 104 n.IsLeaf[1 - newBit] = 0;
105 n.Keys[newBit] = key; 105 n.Keys[newBit] = key;
106 n.Keys[1 - newBit] = Nodes.Size(); 106 n.Keys[1 - newBit] = (UInt32)Nodes.Size();
107 Nodes.Add(e2); 107 Nodes.Add(e2);
108 return false; 108 return false;
109 } 109 }
@@ -130,7 +130,7 @@ bool CMap32::Set(UInt32 key, UInt32 value)
130 e2.Len = (UInt16)(bitPos - (1 + i)); 130 e2.Len = (UInt16)(bitPos - (1 + i));
131 131
132 n.IsLeaf[bit] = 0; 132 n.IsLeaf[bit] = 0;
133 n.Keys[bit] = Nodes.Size(); 133 n.Keys[bit] = (UInt32)Nodes.Size();
134 134
135 Nodes.Add(e2); 135 Nodes.Add(e2);
136 return false; 136 return false;
diff --git a/CPP/Common/MyString.cpp b/CPP/Common/MyString.cpp
index 51c1c3b..b5f7e52 100644
--- a/CPP/Common/MyString.cpp
+++ b/CPP/Common/MyString.cpp
@@ -62,7 +62,7 @@ void MyStringUpper_Ascii(char *s) throw()
62{ 62{
63 for (;;) 63 for (;;)
64 { 64 {
65 char c = *s; 65 const char c = *s;
66 if (c == 0) 66 if (c == 0)
67 return; 67 return;
68 *s++ = MyCharUpper_Ascii(c); 68 *s++ = MyCharUpper_Ascii(c);
@@ -73,7 +73,7 @@ void MyStringUpper_Ascii(wchar_t *s) throw()
73{ 73{
74 for (;;) 74 for (;;)
75 { 75 {
76 wchar_t c = *s; 76 const wchar_t c = *s;
77 if (c == 0) 77 if (c == 0)
78 return; 78 return;
79 *s++ = MyCharUpper_Ascii(c); 79 *s++ = MyCharUpper_Ascii(c);
@@ -85,7 +85,7 @@ void MyStringLower_Ascii(char *s) throw()
85{ 85{
86 for (;;) 86 for (;;)
87 { 87 {
88 char c = *s; 88 const char c = *s;
89 if (c == 0) 89 if (c == 0)
90 return; 90 return;
91 *s++ = MyCharLower_Ascii(c); 91 *s++ = MyCharLower_Ascii(c);
@@ -96,7 +96,7 @@ void MyStringLower_Ascii(wchar_t *s) throw()
96{ 96{
97 for (;;) 97 for (;;)
98 { 98 {
99 wchar_t c = *s; 99 const wchar_t c = *s;
100 if (c == 0) 100 if (c == 0)
101 return; 101 return;
102 *s++ = MyCharLower_Ascii(c); 102 *s++ = MyCharLower_Ascii(c);
@@ -190,8 +190,8 @@ bool IsString1PrefixedByString2(const char *s1, const char *s2) throw()
190{ 190{
191 for (;;) 191 for (;;)
192 { 192 {
193 const unsigned char c2 = (unsigned char)*s2++; if (c2 == 0) return true; 193 const char c2 = *s2++; if (c2 == 0) return true;
194 const unsigned char c1 = (unsigned char)*s1++; if (c1 != c2) return false; 194 const char c1 = *s1++; if (c1 != c2) return false;
195 } 195 }
196} 196}
197 197
@@ -402,6 +402,7 @@ void AString::InsertSpace(unsigned &index, unsigned size)
402} 402}
403 403
404#define k_Alloc_Len_Limit (0x40000000 - 2) 404#define k_Alloc_Len_Limit (0x40000000 - 2)
405// #define k_Alloc_Len_Limit (((unsigned)1 << (sizeof(unsigned) * 8 - 2)) - 2)
405 406
406void AString::ReAlloc(unsigned newLimit) 407void AString::ReAlloc(unsigned newLimit)
407{ 408{
@@ -413,9 +414,14 @@ void AString::ReAlloc(unsigned newLimit)
413 _limit = newLimit; 414 _limit = newLimit;
414} 415}
415 416
417#define THROW_STRING_ALLOC_EXCEPTION { throw 20130220; }
418
419#define CHECK_STRING_ALLOC_LEN(len) \
420 { if ((len) > k_Alloc_Len_Limit) THROW_STRING_ALLOC_EXCEPTION }
421
416void AString::ReAlloc2(unsigned newLimit) 422void AString::ReAlloc2(unsigned newLimit)
417{ 423{
418 if (newLimit > k_Alloc_Len_Limit) throw 20130220; 424 CHECK_STRING_ALLOC_LEN(newLimit)
419 // MY_STRING_REALLOC(_chars, char, (size_t)newLimit + 1, 0); 425 // MY_STRING_REALLOC(_chars, char, (size_t)newLimit + 1, 0);
420 char *newBuf = MY_STRING_NEW_char((size_t)newLimit + 1); 426 char *newBuf = MY_STRING_NEW_char((size_t)newLimit + 1);
421 newBuf[0] = 0; 427 newBuf[0] = 0;
@@ -433,6 +439,7 @@ void AString::SetStartLen(unsigned len)
433 _limit = len; 439 _limit = len;
434} 440}
435 441
442Z7_NO_INLINE
436void AString::Grow_1() 443void AString::Grow_1()
437{ 444{
438 unsigned next = _len; 445 unsigned next = _len;
@@ -443,7 +450,7 @@ void AString::Grow_1()
443 if (next < _len || next > k_Alloc_Len_Limit) 450 if (next < _len || next > k_Alloc_Len_Limit)
444 next = k_Alloc_Len_Limit; 451 next = k_Alloc_Len_Limit;
445 if (next <= _len) 452 if (next <= _len)
446 throw 20130220; 453 THROW_STRING_ALLOC_EXCEPTION
447 ReAlloc(next); 454 ReAlloc(next);
448 // Grow(1); 455 // Grow(1);
449} 456}
@@ -461,7 +468,7 @@ void AString::Grow(unsigned n)
461 if (next < _len || next > k_Alloc_Len_Limit) 468 if (next < _len || next > k_Alloc_Len_Limit)
462 next = k_Alloc_Len_Limit; 469 next = k_Alloc_Len_Limit;
463 if (next <= _len || next - _len < n) 470 if (next <= _len || next - _len < n)
464 throw 20130220; 471 THROW_STRING_ALLOC_EXCEPTION
465 ReAlloc(next); 472 ReAlloc(next);
466} 473}
467 474
@@ -638,12 +645,14 @@ void AString::SetFromBstr_if_Ascii(BSTR s)
638} 645}
639*/ 646*/
640 647
648void AString::Add_Char(char c) { operator+=(c); }
641void AString::Add_Space() { operator+=(' '); } 649void AString::Add_Space() { operator+=(' '); }
642void AString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); } 650void AString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); }
643void AString::Add_LF() { operator+=('\n'); } 651void AString::Add_LF() { operator+=('\n'); }
644void AString::Add_Slash() { operator+=('/'); } 652void AString::Add_Slash() { operator+=('/'); }
645void AString::Add_Dot() { operator+=('.'); } 653void AString::Add_Dot() { operator+=('.'); }
646void AString::Add_Minus() { operator+=('-'); } 654void AString::Add_Minus() { operator+=('-'); }
655void AString::Add_Colon() { operator+=(':'); }
647 656
648AString &AString::operator+=(const char *s) 657AString &AString::operator+=(const char *s)
649{ 658{
@@ -696,6 +705,7 @@ void AString::SetFrom(const char *s, unsigned len) // no check
696{ 705{
697 if (len > _limit) 706 if (len > _limit)
698 { 707 {
708 CHECK_STRING_ALLOC_LEN(len)
699 char *newBuf = MY_STRING_NEW_char((size_t)len + 1); 709 char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
700 MY_STRING_DELETE(_chars) 710 MY_STRING_DELETE(_chars)
701 _chars = newBuf; 711 _chars = newBuf;
@@ -707,6 +717,12 @@ void AString::SetFrom(const char *s, unsigned len) // no check
707 _len = len; 717 _len = len;
708} 718}
709 719
720void AString::SetFrom_Chars_SizeT(const char *s, size_t len)
721{
722 CHECK_STRING_ALLOC_LEN(len)
723 SetFrom(s, (unsigned)len);
724}
725
710void AString::SetFrom_CalcLen(const char *s, unsigned len) // no check 726void AString::SetFrom_CalcLen(const char *s, unsigned len) // no check
711{ 727{
712 unsigned i; 728 unsigned i;
@@ -906,8 +922,8 @@ void AString::Replace(const AString &oldString, const AString &newString)
906 return; // 0; 922 return; // 0;
907 if (oldString == newString) 923 if (oldString == newString)
908 return; // 0; 924 return; // 0;
909 unsigned oldLen = oldString.Len(); 925 const unsigned oldLen = oldString.Len();
910 unsigned newLen = newString.Len(); 926 const unsigned newLen = newString.Len();
911 // unsigned number = 0; 927 // unsigned number = 0;
912 int pos = 0; 928 int pos = 0;
913 while ((unsigned)pos < _len) 929 while ((unsigned)pos < _len)
@@ -1011,7 +1027,7 @@ void UString::ReAlloc(unsigned newLimit)
1011 1027
1012void UString::ReAlloc2(unsigned newLimit) 1028void UString::ReAlloc2(unsigned newLimit)
1013{ 1029{
1014 if (newLimit > k_Alloc_Len_Limit) throw 20130221; 1030 CHECK_STRING_ALLOC_LEN(newLimit)
1015 // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0); 1031 // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0);
1016 wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)newLimit + 1); 1032 wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)newLimit + 1);
1017 newBuf[0] = 0; 1033 newBuf[0] = 0;
@@ -1029,6 +1045,7 @@ void UString::SetStartLen(unsigned len)
1029 _limit = len; 1045 _limit = len;
1030} 1046}
1031 1047
1048Z7_NO_INLINE
1032void UString::Grow_1() 1049void UString::Grow_1()
1033{ 1050{
1034 unsigned next = _len; 1051 unsigned next = _len;
@@ -1039,7 +1056,7 @@ void UString::Grow_1()
1039 if (next < _len || next > k_Alloc_Len_Limit) 1056 if (next < _len || next > k_Alloc_Len_Limit)
1040 next = k_Alloc_Len_Limit; 1057 next = k_Alloc_Len_Limit;
1041 if (next <= _len) 1058 if (next <= _len)
1042 throw 20130220; 1059 THROW_STRING_ALLOC_EXCEPTION
1043 ReAlloc(next); 1060 ReAlloc(next);
1044} 1061}
1045 1062
@@ -1056,7 +1073,7 @@ void UString::Grow(unsigned n)
1056 if (next < _len || next > k_Alloc_Len_Limit) 1073 if (next < _len || next > k_Alloc_Len_Limit)
1057 next = k_Alloc_Len_Limit; 1074 next = k_Alloc_Len_Limit;
1058 if (next <= _len || next - _len < n) 1075 if (next <= _len || next - _len < n)
1059 throw 20130220; 1076 THROW_STRING_ALLOC_EXCEPTION
1060 ReAlloc(next - 1); 1077 ReAlloc(next - 1);
1061} 1078}
1062 1079
@@ -1214,6 +1231,7 @@ void UString::SetFrom(const wchar_t *s, unsigned len) // no check
1214{ 1231{
1215 if (len > _limit) 1232 if (len > _limit)
1216 { 1233 {
1234 CHECK_STRING_ALLOC_LEN(len)
1217 wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1); 1235 wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1218 MY_STRING_DELETE(_chars) 1236 MY_STRING_DELETE(_chars)
1219 _chars = newBuf; 1237 _chars = newBuf;
@@ -1238,7 +1256,7 @@ void UString::SetFromBstr(LPCOLESTR s)
1238 if (c >= 0xd800 && c < 0xdc00 && i + 1 != len) 1256 if (c >= 0xd800 && c < 0xdc00 && i + 1 != len)
1239 { 1257 {
1240 wchar_t c2 = s[i]; 1258 wchar_t c2 = s[i];
1241 if (c2 >= 0xdc00 && c2 < 0x10000) 1259 if (c2 >= 0xdc00 && c2 < 0xe000)
1242 { 1260 {
1243 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff); 1261 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
1244 i++; 1262 i++;
@@ -1269,7 +1287,7 @@ void UString::SetFromBstr(LPCOLESTR s)
1269 if (c >= 0xd800 && c < 0xdc00 && i + 1 != len) 1287 if (c >= 0xd800 && c < 0xdc00 && i + 1 != len)
1270 { 1288 {
1271 wchar_t c2 = *s; 1289 wchar_t c2 = *s;
1272 if (c2 >= 0xdc00 && c2 < 0x10000) 1290 if (c2 >= 0xdc00 && c2 < 0xe000)
1273 { 1291 {
1274 s++; 1292 s++;
1275 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff); 1293 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
@@ -1305,21 +1323,15 @@ UString &UString::operator=(const char *s)
1305 return *this; 1323 return *this;
1306} 1324}
1307 1325
1326void UString::Add_Char(char c) { operator+=((wchar_t)(unsigned char)c); }
1327// void UString::Add_WChar(wchar_t c) { operator+=(c); }
1308void UString::Add_Dot() { operator+=(L'.'); } 1328void UString::Add_Dot() { operator+=(L'.'); }
1309void UString::Add_Space() { operator+=(L' '); } 1329void UString::Add_Space() { operator+=(L' '); }
1330void UString::Add_Minus() { operator+=(L'-'); }
1331void UString::Add_Colon() { operator+=(L':'); }
1332void UString::Add_LF() { operator+=(L'\n'); }
1310void UString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); } 1333void UString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); }
1311 1334
1312void UString::Add_LF()
1313{
1314 if (_limit == _len)
1315 Grow_1();
1316 unsigned len = _len;
1317 wchar_t *chars = _chars;
1318 chars[len++] = L'\n';
1319 chars[len] = 0;
1320 _len = len;
1321}
1322
1323UString &UString::operator+=(const wchar_t *s) 1335UString &UString::operator+=(const wchar_t *s)
1324{ 1336{
1325 unsigned len = MyStringLen(s); 1337 unsigned len = MyStringLen(s);
@@ -1597,7 +1609,7 @@ void UString::DeleteFrontal(unsigned num) throw()
1597void UString2::ReAlloc2(unsigned newLimit) 1609void UString2::ReAlloc2(unsigned newLimit)
1598{ 1610{
1599 // wrong (_len) is allowed after this function 1611 // wrong (_len) is allowed after this function
1600 if (newLimit > k_Alloc_Len_Limit) throw 20130221; 1612 CHECK_STRING_ALLOC_LEN(newLimit)
1601 // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0); 1613 // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0);
1602 if (_chars) 1614 if (_chars)
1603 { 1615 {
@@ -1805,7 +1817,7 @@ bool CStringFinder::FindWord_In_LowCaseAsciiList_NoCase(const char *p, const wch
1805 break; 1817 break;
1806 if (c <= 0x20 || c > 0x7f) 1818 if (c <= 0x20 || c > 0x7f)
1807 return false; 1819 return false;
1808 _temp += (char)MyCharLower_Ascii((char)c); 1820 _temp.Add_Char((char)MyCharLower_Ascii((char)c));
1809 } 1821 }
1810 1822
1811 while (*p != 0) 1823 while (*p != 0)
diff --git a/CPP/Common/MyString.h b/CPP/Common/MyString.h
index e5ce18a..ba9914e 100644
--- a/CPP/Common/MyString.h
+++ b/CPP/Common/MyString.h
@@ -281,6 +281,8 @@ class AString
281 void ReAlloc(unsigned newLimit); 281 void ReAlloc(unsigned newLimit);
282 void ReAlloc2(unsigned newLimit); 282 void ReAlloc2(unsigned newLimit);
283 void SetStartLen(unsigned len); 283 void SetStartLen(unsigned len);
284
285 Z7_NO_INLINE
284 void Grow_1(); 286 void Grow_1();
285 void Grow(unsigned n); 287 void Grow(unsigned n);
286 288
@@ -373,6 +375,8 @@ public:
373 void SetFromWStr_if_Ascii(const wchar_t *s); 375 void SetFromWStr_if_Ascii(const wchar_t *s);
374 // void SetFromBstr_if_Ascii(BSTR s); 376 // void SetFromBstr_if_Ascii(BSTR s);
375 377
378// private:
379 Z7_FORCE_INLINE
376 AString &operator+=(char c) 380 AString &operator+=(char c)
377 { 381 {
378 if (_limit == _len) 382 if (_limit == _len)
@@ -384,14 +388,16 @@ public:
384 _len = len; 388 _len = len;
385 return *this; 389 return *this;
386 } 390 }
387 391public:
388 void Add_Space(); 392 void Add_Space();
389 void Add_Space_if_NotEmpty(); 393 void Add_Space_if_NotEmpty();
390 void Add_OptSpaced(const char *s); 394 void Add_OptSpaced(const char *s);
395 void Add_Char(char c);
391 void Add_LF(); 396 void Add_LF();
392 void Add_Slash(); 397 void Add_Slash();
393 void Add_Dot(); 398 void Add_Dot();
394 void Add_Minus(); 399 void Add_Minus();
400 void Add_Colon();
395 void Add_PathSepar() { operator+=(CHAR_PATH_SEPARATOR); } 401 void Add_PathSepar() { operator+=(CHAR_PATH_SEPARATOR); }
396 402
397 AString &operator+=(const char *s); 403 AString &operator+=(const char *s);
@@ -402,6 +408,7 @@ public:
402 408
403 void AddFrom(const char *s, unsigned len); // no check 409 void AddFrom(const char *s, unsigned len); // no check
404 void SetFrom(const char *s, unsigned len); // no check 410 void SetFrom(const char *s, unsigned len); // no check
411 void SetFrom_Chars_SizeT(const char* s, size_t len); // no check
405 void SetFrom(const char* s, int len) // no check 412 void SetFrom(const char* s, int len) // no check
406 { 413 {
407 SetFrom(s, (unsigned)len); // no check 414 SetFrom(s, (unsigned)len); // no check
@@ -668,6 +675,8 @@ public:
668 UString &operator=(const char *s); 675 UString &operator=(const char *s);
669 UString &operator=(const AString &s) { return operator=(s.Ptr()); } 676 UString &operator=(const AString &s) { return operator=(s.Ptr()); }
670 677
678// private:
679 Z7_FORCE_INLINE
671 UString &operator+=(wchar_t c) 680 UString &operator+=(wchar_t c)
672 { 681 {
673 if (_limit == _len) 682 if (_limit == _len)
@@ -680,12 +689,17 @@ public:
680 return *this; 689 return *this;
681 } 690 }
682 691
683 UString &operator+=(char c) { return (*this)+=((wchar_t)(unsigned char)c); } 692private:
684 693 UString &operator+=(char c); // { return (*this)+=((wchar_t)(unsigned char)c); }
694public:
695 void Add_Char(char c);
696 // void Add_WChar(wchar_t c);
685 void Add_Space(); 697 void Add_Space();
686 void Add_Space_if_NotEmpty(); 698 void Add_Space_if_NotEmpty();
687 void Add_LF(); 699 void Add_LF();
688 void Add_Dot(); 700 void Add_Dot();
701 void Add_Minus();
702 void Add_Colon();
689 void Add_PathSepar() { operator+=(WCHAR_PATH_SEPARATOR); } 703 void Add_PathSepar() { operator+=(WCHAR_PATH_SEPARATOR); }
690 704
691 UString &operator+=(const wchar_t *s); 705 UString &operator+=(const wchar_t *s);
diff --git a/CPP/Common/MyTypes.h b/CPP/Common/MyTypes.h
index 8f44f67..eadc9a4 100644
--- a/CPP/Common/MyTypes.h
+++ b/CPP/Common/MyTypes.h
@@ -3,10 +3,11 @@
3#ifndef ZIP7_INC_COMMON_MY_TYPES_H 3#ifndef ZIP7_INC_COMMON_MY_TYPES_H
4#define ZIP7_INC_COMMON_MY_TYPES_H 4#define ZIP7_INC_COMMON_MY_TYPES_H
5 5
6#include "Common0.h"
6#include "../../C/7zTypes.h" 7#include "../../C/7zTypes.h"
7#include "Common.h"
8 8
9typedef int HRes; 9// typedef int HRes;
10// typedef HRESULT HRes;
10 11
11struct CBoolPair 12struct CBoolPair
12{ 13{
diff --git a/CPP/Common/MyVector.h b/CPP/Common/MyVector.h
index 9ee7105..a772785 100644
--- a/CPP/Common/MyVector.h
+++ b/CPP/Common/MyVector.h
@@ -258,7 +258,7 @@ public:
258 { 258 {
259 if (index != 0) 259 if (index != 0)
260 { 260 {
261 T temp = _items[index]; 261 const T temp = _items[index];
262 memmove(_items + 1, _items, (size_t)index * sizeof(T)); 262 memmove(_items + 1, _items, (size_t)index * sizeof(T));
263 _items[0] = temp; 263 _items[0] = temp;
264 } 264 }
@@ -268,15 +268,29 @@ public:
268 T& operator[](unsigned index) { return _items[index]; } 268 T& operator[](unsigned index) { return _items[index]; }
269 const T& operator[](int index) const { return _items[(unsigned)index]; } 269 const T& operator[](int index) const { return _items[(unsigned)index]; }
270 T& operator[](int index) { return _items[(unsigned)index]; } 270 T& operator[](int index) { return _items[(unsigned)index]; }
271
272 const T* ConstData() const { return _items; }
273 T* NonConstData() const { return _items; }
274 T* NonConstData() { return _items; }
275
276 const T* Data() const { return _items; }
277 T* Data() { return _items; }
278
279 const T& FrontItem() const { return _items[0]; }
280 T& FrontItem() { return _items[0]; }
281 /*
282 const T Front() const { return _items[0]; }
283 T Front() { return _items[0]; }
271 const T& Front() const { return _items[0]; } 284 const T& Front() const { return _items[0]; }
272 T& Front() { return _items[0]; } 285 T& Front() { return _items[0]; }
286 */
273 const T& Back() const { return _items[(size_t)_size - 1]; } 287 const T& Back() const { return _items[(size_t)_size - 1]; }
274 T& Back() { return _items[(size_t)_size - 1]; } 288 T& Back() { return _items[(size_t)_size - 1]; }
275 289
276 /* 290 /*
277 void Swap(unsigned i, unsigned j) 291 void Swap(unsigned i, unsigned j)
278 { 292 {
279 T temp = _items[i]; 293 const T temp = _items[i];
280 _items[i] = _items[j]; 294 _items[i] = _items[j];
281 _items[j] = temp; 295 _items[j] = temp;
282 } 296 }
@@ -368,7 +382,7 @@ public:
368 382
369 static void SortRefDown(T* p, unsigned k, unsigned size, int (*compare)(const T*, const T*, void *), void *param) 383 static void SortRefDown(T* p, unsigned k, unsigned size, int (*compare)(const T*, const T*, void *), void *param)
370 { 384 {
371 T temp = p[k]; 385 const T temp = p[k];
372 for (;;) 386 for (;;)
373 { 387 {
374 unsigned s = (k << 1); 388 unsigned s = (k << 1);
@@ -389,16 +403,16 @@ public:
389 unsigned size = _size; 403 unsigned size = _size;
390 if (size <= 1) 404 if (size <= 1)
391 return; 405 return;
392 T* p = (&Front()) - 1; 406 T* p = _items - 1;
393 { 407 {
394 unsigned i = size >> 1; 408 unsigned i = size >> 1;
395 do 409 do
396 SortRefDown(p, i, size, compare, param); 410 SortRefDown(p, i, size, compare, param);
397 while (--i != 0); 411 while (--i);
398 } 412 }
399 do 413 do
400 { 414 {
401 T temp = p[size]; 415 const T temp = p[size];
402 p[size--] = p[1]; 416 p[size--] = p[1];
403 p[1] = temp; 417 p[1] = temp;
404 SortRefDown(p, 1, size, compare, param); 418 SortRefDown(p, 1, size, compare, param);
@@ -408,7 +422,7 @@ public:
408 422
409 static void SortRefDown2(T* p, unsigned k, unsigned size) 423 static void SortRefDown2(T* p, unsigned k, unsigned size)
410 { 424 {
411 T temp = p[k]; 425 const T temp = p[k];
412 for (;;) 426 for (;;)
413 { 427 {
414 unsigned s = (k << 1); 428 unsigned s = (k << 1);
@@ -429,16 +443,16 @@ public:
429 unsigned size = _size; 443 unsigned size = _size;
430 if (size <= 1) 444 if (size <= 1)
431 return; 445 return;
432 T* p = (&Front()) - 1; 446 T* p = _items - 1;
433 { 447 {
434 unsigned i = size >> 1; 448 unsigned i = size >> 1;
435 do 449 do
436 SortRefDown2(p, i, size); 450 SortRefDown2(p, i, size);
437 while (--i != 0); 451 while (--i);
438 } 452 }
439 do 453 do
440 { 454 {
441 T temp = p[size]; 455 const T temp = p[size];
442 p[size--] = p[1]; 456 p[size--] = p[1];
443 p[1] = temp; 457 p[1] = temp;
444 SortRefDown2(p, 1, size); 458 SortRefDown2(p, 1, size);
diff --git a/CPP/Common/MyWindows.cpp b/CPP/Common/MyWindows.cpp
index ae284eb..a1dfbef 100644
--- a/CPP/Common/MyWindows.cpp
+++ b/CPP/Common/MyWindows.cpp
@@ -88,21 +88,21 @@ BSTR SysAllocString(const OLECHAR *s)
88void SysFreeString(BSTR bstr) 88void SysFreeString(BSTR bstr)
89{ 89{
90 if (bstr) 90 if (bstr)
91 FreeForBSTR((CBstrSizeType *)bstr - 1); 91 FreeForBSTR((CBstrSizeType *)(void *)bstr - 1);
92} 92}
93 93
94UINT SysStringByteLen(BSTR bstr) 94UINT SysStringByteLen(BSTR bstr)
95{ 95{
96 if (!bstr) 96 if (!bstr)
97 return 0; 97 return 0;
98 return *((CBstrSizeType *)bstr - 1); 98 return *((CBstrSizeType *)(void *)bstr - 1);
99} 99}
100 100
101UINT SysStringLen(BSTR bstr) 101UINT SysStringLen(BSTR bstr)
102{ 102{
103 if (!bstr) 103 if (!bstr)
104 return 0; 104 return 0;
105 return *((CBstrSizeType *)bstr - 1) / (UINT)sizeof(OLECHAR); 105 return *((CBstrSizeType *)(void *)bstr - 1) / (UINT)sizeof(OLECHAR);
106} 106}
107 107
108 108
diff --git a/CPP/Common/MyWindows.h b/CPP/Common/MyWindows.h
index a76e14b..da5370b 100644
--- a/CPP/Common/MyWindows.h
+++ b/CPP/Common/MyWindows.h
@@ -66,8 +66,8 @@ typedef int BOOL;
66typedef Int64 LONGLONG; 66typedef Int64 LONGLONG;
67typedef UInt64 ULONGLONG; 67typedef UInt64 ULONGLONG;
68 68
69typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER; 69typedef struct { LONGLONG QuadPart; } LARGE_INTEGER;
70typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER; 70typedef struct { ULONGLONG QuadPart; } ULARGE_INTEGER;
71 71
72typedef const CHAR *LPCSTR; 72typedef const CHAR *LPCSTR;
73typedef CHAR TCHAR; 73typedef CHAR TCHAR;
@@ -79,7 +79,7 @@ typedef OLECHAR *BSTR;
79typedef const OLECHAR *LPCOLESTR; 79typedef const OLECHAR *LPCOLESTR;
80typedef OLECHAR *LPOLESTR; 80typedef OLECHAR *LPOLESTR;
81 81
82typedef struct _FILETIME 82typedef struct
83{ 83{
84 DWORD dwLowDateTime; 84 DWORD dwLowDateTime;
85 DWORD dwHighDateTime; 85 DWORD dwHighDateTime;
@@ -292,7 +292,7 @@ typedef enum tagSTREAM_SEEK
292 292
293 293
294 294
295typedef struct _SYSTEMTIME 295typedef struct
296{ 296{
297 WORD wYear; 297 WORD wYear;
298 WORD wMonth; 298 WORD wMonth;
@@ -312,12 +312,13 @@ BOOL WINAPI FileTimeToSystemTime(const FILETIME *fileTime, SYSTEMTIME *systemTim
312DWORD GetTickCount(); 312DWORD GetTickCount();
313 313
314 314
315/*
315#define CREATE_NEW 1 316#define CREATE_NEW 1
316#define CREATE_ALWAYS 2 317#define CREATE_ALWAYS 2
317#define OPEN_EXISTING 3 318#define OPEN_EXISTING 3
318#define OPEN_ALWAYS 4 319#define OPEN_ALWAYS 4
319#define TRUNCATE_EXISTING 5 320#define TRUNCATE_EXISTING 5
320 321*/
321 322
322#endif // _WIN32 323#endif // _WIN32
323 324
diff --git a/CPP/Common/MyXml.cpp b/CPP/Common/MyXml.cpp
index a879d34..cc891fc 100644
--- a/CPP/Common/MyXml.cpp
+++ b/CPP/Common/MyXml.cpp
@@ -3,6 +3,7 @@
3#include "StdAfx.h" 3#include "StdAfx.h"
4 4
5#include "MyXml.h" 5#include "MyXml.h"
6#include "StringToInt.h"
6 7
7static bool IsValidChar(char c) 8static bool IsValidChar(char c)
8{ 9{
@@ -30,7 +31,7 @@ int CXmlItem::FindProp(const char *propName) const throw()
30 31
31AString CXmlItem::GetPropVal(const char *propName) const 32AString CXmlItem::GetPropVal(const char *propName) const
32{ 33{
33 int index = FindProp(propName); 34 const int index = FindProp(propName);
34 if (index >= 0) 35 if (index >= 0)
35 return Props[(unsigned)index].Value; 36 return Props[(unsigned)index].Value;
36 return AString(); 37 return AString();
@@ -49,6 +50,17 @@ int CXmlItem::FindSubTag(const char *tag) const throw()
49 return -1; 50 return -1;
50} 51}
51 52
53const CXmlItem *CXmlItem::FindSubTag_GetPtr(const char *tag) const throw()
54{
55 FOR_VECTOR (i, SubItems)
56 {
57 const CXmlItem *p = &SubItems[i];
58 if (p->IsTagged(tag))
59 return p;
60 }
61 return NULL;
62}
63
52AString CXmlItem::GetSubString() const 64AString CXmlItem::GetSubString() const
53{ 65{
54 if (SubItems.Size() == 1) 66 if (SubItems.Size() == 1)
@@ -73,9 +85,9 @@ const AString * CXmlItem::GetSubStringPtr() const throw()
73 85
74AString CXmlItem::GetSubStringForTag(const char *tag) const 86AString CXmlItem::GetSubStringForTag(const char *tag) const
75{ 87{
76 int index = FindSubTag(tag); 88 const CXmlItem *item = FindSubTag_GetPtr(tag);
77 if (index >= 0) 89 if (item)
78 return SubItems[(unsigned)index].GetSubString(); 90 return item->GetSubString();
79 return AString(); 91 return AString();
80} 92}
81 93
@@ -92,11 +104,14 @@ const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
92 } 104 }
93 if (*s == 0) 105 if (*s == 0)
94 return NULL; 106 return NULL;
95 if (s != beg)
96 { 107 {
97 IsTag = false; 108 const size_t num = (size_t)(s - beg);
98 Name.SetFrom(beg, (unsigned)(s - beg)); 109 if (num)
99 return s; 110 {
111 IsTag = false;
112 Name.SetFrom_Chars_SizeT(beg, num);
113 return s;
114 }
100 } 115 }
101 116
102 IsTag = true; 117 IsTag = true;
@@ -110,7 +125,7 @@ const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
110 break; 125 break;
111 if (s == beg || *s == 0) 126 if (s == beg || *s == 0)
112 return NULL; 127 return NULL;
113 Name.SetFrom(beg, (unsigned)(s - beg)); 128 Name.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
114 129
115 for (;;) 130 for (;;)
116 { 131 {
@@ -142,11 +157,12 @@ const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
142 } 157 }
143 158
144 s += 2; 159 s += 2;
145 unsigned len = Name.Len(); 160 const unsigned len = Name.Len();
161 const char *name = Name.Ptr();
146 for (unsigned i = 0; i < len; i++) 162 for (unsigned i = 0; i < len; i++)
147 if (s[i] != Name[i]) 163 if (*s++ != *name++)
148 return NULL; 164 return NULL;
149 s += len; 165 // s += len;
150 if (s[0] != '>') 166 if (s[0] != '>')
151 return NULL; 167 return NULL;
152 return s + 1; 168 return s + 1;
@@ -166,7 +182,7 @@ const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
166 } 182 }
167 if (s == beg) 183 if (s == beg)
168 return NULL; 184 return NULL;
169 prop.Name.SetFrom(beg, (unsigned)(s - beg)); 185 prop.Name.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
170 186
171 SKIP_SPACES(s) 187 SKIP_SPACES(s)
172 if (*s != '=') 188 if (*s != '=')
@@ -187,7 +203,7 @@ const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
187 break; 203 break;
188 s++; 204 s++;
189 } 205 }
190 prop.Value.SetFrom(beg, (unsigned)(s - beg)); 206 prop.Value.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
191 s++; 207 s++;
192 } 208 }
193} 209}
@@ -258,3 +274,76 @@ void CXml::AppendTo(AString &s) const
258 Root.AppendTo(s); 274 Root.AppendTo(s);
259} 275}
260*/ 276*/
277
278
279void z7_xml_DecodeString(AString &temp)
280{
281 char * const beg = temp.GetBuf();
282 char *dest = beg;
283 const char *p = beg;
284 for (;;)
285 {
286 char c = *p++;
287 if (c == 0)
288 break;
289 if (c == '&')
290 {
291 if (p[0] == '#')
292 {
293 const char *end;
294 const UInt32 number = ConvertStringToUInt32(p + 1, &end);
295 if (*end == ';' && number != 0 && number <= 127)
296 {
297 p = end + 1;
298 c = (char)number;
299 }
300 }
301 else if (
302 p[0] == 'a' &&
303 p[1] == 'm' &&
304 p[2] == 'p' &&
305 p[3] == ';')
306 {
307 p += 4;
308 }
309 else if (
310 p[0] == 'l' &&
311 p[1] == 't' &&
312 p[2] == ';')
313 {
314 p += 3;
315 c = '<';
316 }
317 else if (
318 p[0] == 'g' &&
319 p[1] == 't' &&
320 p[2] == ';')
321 {
322 p += 3;
323 c = '>';
324 }
325 else if (
326 p[0] == 'a' &&
327 p[1] == 'p' &&
328 p[2] == 'o' &&
329 p[3] == 's' &&
330 p[4] == ';')
331 {
332 p += 5;
333 c = '\'';
334 }
335 else if (
336 p[0] == 'q' &&
337 p[1] == 'u' &&
338 p[2] == 'o' &&
339 p[3] == 't' &&
340 p[4] == ';')
341 {
342 p += 5;
343 c = '\"';
344 }
345 }
346 *dest++ = c;
347 }
348 temp.ReleaseBuf_SetEnd((unsigned)(dest - beg));
349}
diff --git a/CPP/Common/MyXml.h b/CPP/Common/MyXml.h
index 5362602..b22d7e4 100644
--- a/CPP/Common/MyXml.h
+++ b/CPP/Common/MyXml.h
@@ -27,8 +27,8 @@ public:
27 AString GetSubString() const; 27 AString GetSubString() const;
28 const AString * GetSubStringPtr() const throw(); 28 const AString * GetSubStringPtr() const throw();
29 int FindSubTag(const char *tag) const throw(); 29 int FindSubTag(const char *tag) const throw();
30 const CXmlItem *FindSubTag_GetPtr(const char *tag) const throw();
30 AString GetSubStringForTag(const char *tag) const; 31 AString GetSubStringForTag(const char *tag) const;
31
32 void AppendTo(AString &s) const; 32 void AppendTo(AString &s) const;
33}; 33};
34 34
@@ -40,4 +40,6 @@ struct CXml
40 // void AppendTo(AString &s) const; 40 // void AppendTo(AString &s) const;
41}; 41};
42 42
43void z7_xml_DecodeString(AString &s);
44
43#endif 45#endif
diff --git a/CPP/Common/NewHandler.cpp b/CPP/Common/NewHandler.cpp
index c95833e..173b8eb 100644
--- a/CPP/Common/NewHandler.cpp
+++ b/CPP/Common/NewHandler.cpp
@@ -65,6 +65,13 @@ operator new(size_t size)
65 return p; 65 return p;
66} 66}
67 67
68
69#if defined(_MSC_VER) && _MSC_VER == 1600
70// vs2010 has no throw() by default ?
71#pragma warning(push)
72#pragma warning(disable : 4986) // 'operator delete': exception specification does not match previous declaration
73#endif
74
68void 75void
69#ifdef _MSC_VER 76#ifdef _MSC_VER
70__cdecl 77__cdecl
@@ -76,6 +83,27 @@ operator delete(void *p) throw()
76 ::free(p); 83 ::free(p);
77} 84}
78 85
86/* we define operator delete(void *p, size_t n) because
87 vs2022 compiler uses delete(void *p, size_t n), and
88 we want to mix files from different compilers:
89 - old vc6 linker
90 - old vc6 complier
91 - new vs2022 complier
92*/
93void
94#ifdef _MSC_VER
95__cdecl
96#endif
97operator delete(void *p, size_t n) throw()
98{
99 UNUSED_VAR(n)
100 ::free(p);
101}
102
103#if defined(_MSC_VER) && _MSC_VER == 1600
104#pragma warning(pop)
105#endif
106
79/* 107/*
80void * 108void *
81#ifdef _MSC_VER 109#ifdef _MSC_VER
@@ -205,11 +233,9 @@ operator delete(void *p) throw()
205 a[i] = 0; 233 a[i] = 0;
206 */ 234 */
207 HeapFree(GetProcessHeap(), 0, p); 235 HeapFree(GetProcessHeap(), 0, p);
208 if (numAllocs == 0) 236 // if (numAllocs == 0) numAllocs = numAllocs; // ERROR
209 numAllocs = numAllocs; // ERROR
210 numAllocs--; 237 numAllocs--;
211 if (numAllocs == 0) 238 // if (numAllocs == 0) numAllocs = numAllocs; // OK: all objects were deleted
212 numAllocs = numAllocs; // OK: all objects were deleted
213 printf("Free %d\n", numAllocs); 239 printf("Free %d\n", numAllocs);
214 LeaveCriticalSection(&cs); 240 LeaveCriticalSection(&cs);
215 #else 241 #else
@@ -219,6 +245,22 @@ operator delete(void *p) throw()
219 #endif 245 #endif
220} 246}
221 247
248void
249#ifdef _MSC_VER
250__cdecl
251#endif
252operator delete(void *p, size_t n) throw();
253void
254#ifdef _MSC_VER
255__cdecl
256#endif
257operator delete(void *p, size_t n) throw()
258{
259 UNUSED_VAR(n)
260 printf("delete_WITH_SIZE=%u, ptr = %p\n", (unsigned)n, p);
261 operator delete(p);
262}
263
222/* 264/*
223void * 265void *
224#ifdef _MSC_VER 266#ifdef _MSC_VER
diff --git a/CPP/Common/NewHandler.h b/CPP/Common/NewHandler.h
index 50f6d0a..5ba64b7 100644
--- a/CPP/Common/NewHandler.h
+++ b/CPP/Common/NewHandler.h
@@ -65,12 +65,35 @@ __cdecl
65#endif 65#endif
66operator new(size_t size); 66operator new(size_t size);
67 67
68/*
69#if 0 && defined(_MSC_VER) && _MSC_VER == 1600
70 #define Z7_OPERATOR_DELETE_SPEC_THROW0
71#else
72 #define Z7_OPERATOR_DELETE_SPEC_THROW0 throw()
73#endif
74*/
75#if defined(_MSC_VER) && _MSC_VER == 1600
76#pragma warning(push)
77#pragma warning(disable : 4986) // 'operator delete': exception specification does not match previous declaration
78#endif
79
68void 80void
69#ifdef _MSC_VER 81#ifdef _MSC_VER
70__cdecl 82__cdecl
71#endif 83#endif
72operator delete(void *p) throw(); 84operator delete(void *p) throw();
73 85
86void
87#ifdef _MSC_VER
88__cdecl
89#endif
90operator delete(void *p, size_t n) throw();
91
92#if defined(_MSC_VER) && _MSC_VER == 1600
93#pragma warning(pop)
94#endif
95
96
74#else 97#else
75 98
76#include <new> 99#include <new>
diff --git a/CPP/Common/Random.cpp b/CPP/Common/Random.cpp
index fbdb8c9..6ef9f1a 100644
--- a/CPP/Common/Random.cpp
+++ b/CPP/Common/Random.cpp
@@ -12,11 +12,11 @@
12 12
13#include "Random.h" 13#include "Random.h"
14 14
15void CRandom::Init(unsigned int seed) { srand(seed); } 15void CRandom::Init(unsigned seed) { srand(seed); }
16 16
17void CRandom::Init() 17void CRandom::Init()
18{ 18{
19 Init((unsigned int) 19 Init((unsigned)
20 #ifdef _WIN32 20 #ifdef _WIN32
21 GetTickCount() 21 GetTickCount()
22 #else 22 #else
diff --git a/CPP/Common/Random.h b/CPP/Common/Random.h
index 283869e..3fbb416 100644
--- a/CPP/Common/Random.h
+++ b/CPP/Common/Random.h
@@ -7,7 +7,7 @@ class CRandom
7{ 7{
8public: 8public:
9 void Init(); 9 void Init();
10 void Init(unsigned int seed); 10 void Init(unsigned seed);
11 int Generate() const; 11 int Generate() const;
12}; 12};
13 13
diff --git a/CPP/Common/StdInStream.cpp b/CPP/Common/StdInStream.cpp
index 7b209f1..944be34 100644
--- a/CPP/Common/StdInStream.cpp
+++ b/CPP/Common/StdInStream.cpp
@@ -48,15 +48,15 @@ bool CStdInStream::ScanAStringUntilNewLine(AString &s)
48 s.Empty(); 48 s.Empty();
49 for (;;) 49 for (;;)
50 { 50 {
51 int intChar = GetChar(); 51 const int intChar = GetChar();
52 if (intChar == EOF) 52 if (intChar == EOF)
53 return true; 53 return true;
54 char c = (char)intChar; 54 const char c = (char)intChar;
55 if (c == 0) 55 if (c == 0)
56 return false; 56 return false;
57 if (c == '\n') 57 if (c == '\n')
58 return true; 58 return true;
59 s += c; 59 s.Add_Char(c);
60 } 60 }
61} 61}
62 62
@@ -64,14 +64,14 @@ bool CStdInStream::ScanUStringUntilNewLine(UString &dest)
64{ 64{
65 dest.Empty(); 65 dest.Empty();
66 AString s; 66 AString s;
67 bool res = ScanAStringUntilNewLine(s); 67 const bool res = ScanAStringUntilNewLine(s);
68 int codePage = CodePage; 68 int codePage = CodePage;
69 if (codePage == -1) 69 if (codePage == -1)
70 codePage = CP_OEMCP; 70 codePage = CP_OEMCP;
71 if (codePage == CP_UTF8) 71 if ((unsigned)codePage == CP_UTF8)
72 ConvertUTF8ToUnicode(s, dest); 72 ConvertUTF8ToUnicode(s, dest);
73 else 73 else
74 MultiByteToUnicodeString2(dest, s, (UINT)codePage); 74 MultiByteToUnicodeString2(dest, s, (UINT)(unsigned)codePage);
75 return res; 75 return res;
76} 76}
77 77
diff --git a/CPP/Common/StdOutStream.cpp b/CPP/Common/StdOutStream.cpp
index cfa5fde..ba179d9 100644
--- a/CPP/Common/StdOutStream.cpp
+++ b/CPP/Common/StdOutStream.cpp
@@ -66,70 +66,158 @@ void CStdOutStream::Convert_UString_to_AString(const UString &src, AString &dest
66 int codePage = CodePage; 66 int codePage = CodePage;
67 if (codePage == -1) 67 if (codePage == -1)
68 codePage = CP_OEMCP; 68 codePage = CP_OEMCP;
69 if (codePage == CP_UTF8) 69 if ((unsigned)codePage == CP_UTF8)
70 ConvertUnicodeToUTF8(src, dest); 70 ConvertUnicodeToUTF8(src, dest);
71 else 71 else
72 UnicodeStringToMultiByte2(dest, src, (UINT)codePage); 72 UnicodeStringToMultiByte2(dest, src, (UINT)(unsigned)codePage);
73} 73}
74 74
75 75
76static const wchar_t kReplaceChar = '_'; 76static const wchar_t kReplaceChar = '_';
77 77
78/*
78void CStdOutStream::Normalize_UString_LF_Allowed(UString &s) 79void CStdOutStream::Normalize_UString_LF_Allowed(UString &s)
79{ 80{
80 unsigned len = s.Len(); 81 if (!IsTerminalMode)
82 return;
83
84 const unsigned len = s.Len();
81 wchar_t *d = s.GetBuf(); 85 wchar_t *d = s.GetBuf();
82 86
83 if (IsTerminalMode)
84 for (unsigned i = 0; i < len; i++) 87 for (unsigned i = 0; i < len; i++)
85 { 88 {
86 wchar_t c = d[i]; 89 const wchar_t c = d[i];
87 if (c <= 13 && c >= 7 && c != '\n') 90 if (c == 0x1b || (c <= 13 && c >= 7 && c != '\n'))
88 d[i] = kReplaceChar; 91 d[i] = kReplaceChar;
89 } 92 }
90} 93}
94*/
91 95
92void CStdOutStream::Normalize_UString(UString &s) 96void CStdOutStream::Normalize_UString(UString &s)
93{ 97{
94 unsigned len = s.Len(); 98 const unsigned len = s.Len();
95 wchar_t *d = s.GetBuf(); 99 wchar_t *d = s.GetBuf();
96 100
97 if (IsTerminalMode) 101 if (IsTerminalMode)
98 for (unsigned i = 0; i < len; i++) 102 for (unsigned i = 0; i < len; i++)
99 { 103 {
100 wchar_t c = d[i]; 104 const wchar_t c = d[i];
101 if (c <= 13 && c >= 7) 105 if ((c <= 13 && c >= 7) || c == 0x1b)
102 d[i] = kReplaceChar; 106 d[i] = kReplaceChar;
103 } 107 }
104 else 108 else
105 for (unsigned i = 0; i < len; i++) 109 for (unsigned i = 0; i < len; i++)
106 { 110 {
107 wchar_t c = d[i]; 111 const wchar_t c = d[i];
108 if (c == '\n') 112 if (c == '\n')
109 d[i] = kReplaceChar; 113 d[i] = kReplaceChar;
110 } 114 }
111} 115}
112 116
113void CStdOutStream::NormalizePrint_UString(const UString &s, UString &tempU, AString &tempA) 117void CStdOutStream::Normalize_UString_Path(UString &s)
118{
119 if (ListPathSeparatorSlash.Def)
120 {
121#ifdef _WIN32
122 if (ListPathSeparatorSlash.Val)
123 s.Replace(L'\\', L'/');
124#else
125 if (!ListPathSeparatorSlash.Val)
126 s.Replace(L'/', L'\\');
127#endif
128 }
129 Normalize_UString(s);
130}
131
132
133/*
134void CStdOutStream::Normalize_UString(UString &src)
135{
136 const wchar_t *s = src.Ptr();
137 const unsigned len = src.Len();
138 unsigned i;
139 for (i = 0; i < len; i++)
140 {
141 const wchar_t c = s[i];
142#if 0 && !defined(_WIN32)
143 if (c == '\\') // IsTerminalMode &&
144 break;
145#endif
146 if ((unsigned)c < 0x20)
147 break;
148 }
149 if (i == len)
150 return;
151
152 UString temp;
153 for (i = 0; i < len; i++)
154 {
155 wchar_t c = s[i];
156#if 0 && !defined(_WIN32)
157 if (c == '\\')
158 temp += (wchar_t)L'\\';
159 else
160#endif
161 if ((unsigned)c < 0x20)
162 {
163 if (c == '\n'
164 || (IsTerminalMode && (c == 0x1b || (c <= 13 && c >= 7))))
165 {
166#if 1 || defined(_WIN32)
167 c = (wchar_t)kReplaceChar;
168#else
169 temp += (wchar_t)L'\\';
170 if (c == '\n') c = L'n';
171 else if (c == '\r') c = L'r';
172 else if (c == '\a') c = L'a';
173 else if (c == '\b') c = L'b';
174 else if (c == '\t') c = L't';
175 else if (c == '\v') c = L'v';
176 else if (c == '\f') c = L'f';
177 else
178 {
179 temp += (wchar_t)(L'0' + (unsigned)c / 64);
180 temp += (wchar_t)(L'0' + (unsigned)c / 8 % 8);
181 c = (wchar_t)(L'0' + (unsigned)c % 8);
182 }
183#endif
184 }
185 }
186 temp += c;
187 }
188 src = temp;
189}
190*/
191
192void CStdOutStream::NormalizePrint_UString_Path(const UString &s, UString &tempU, AString &tempA)
114{ 193{
115 tempU = s; 194 tempU = s;
116 Normalize_UString(tempU); 195 Normalize_UString_Path(tempU);
117 PrintUString(tempU, tempA); 196 PrintUString(tempU, tempA);
118} 197}
119 198
120void CStdOutStream::NormalizePrint_UString(const UString &s) 199void CStdOutStream::NormalizePrint_UString_Path(const UString &s)
121{ 200{
122 NormalizePrint_wstr(s); 201 UString tempU;
202 AString tempA;
203 NormalizePrint_UString_Path(s, tempU, tempA);
123} 204}
124 205
125void CStdOutStream::NormalizePrint_wstr(const wchar_t *s) 206void CStdOutStream::NormalizePrint_wstr_Path(const wchar_t *s)
126{ 207{
127 UString tempU = s; 208 UString tempU = s;
128 Normalize_UString(tempU); 209 Normalize_UString_Path(tempU);
129 AString tempA; 210 AString tempA;
130 PrintUString(tempU, tempA); 211 PrintUString(tempU, tempA);
131} 212}
132 213
214void CStdOutStream::NormalizePrint_UString(const UString &s)
215{
216 UString tempU = s;
217 Normalize_UString(tempU);
218 AString tempA;
219 PrintUString(tempU, tempA);
220}
133 221
134CStdOutStream & CStdOutStream::operator<<(Int32 number) throw() 222CStdOutStream & CStdOutStream::operator<<(Int32 number) throw()
135{ 223{
diff --git a/CPP/Common/StdOutStream.h b/CPP/Common/StdOutStream.h
index bd15d7c..846b0db 100644
--- a/CPP/Common/StdOutStream.h
+++ b/CPP/Common/StdOutStream.h
@@ -14,6 +14,7 @@ class CStdOutStream
14 // bool _streamIsOpen; 14 // bool _streamIsOpen;
15public: 15public:
16 bool IsTerminalMode; 16 bool IsTerminalMode;
17 CBoolPair ListPathSeparatorSlash;
17 int CodePage; 18 int CodePage;
18 19
19 CStdOutStream(FILE *stream = NULL): 20 CStdOutStream(FILE *stream = NULL):
@@ -21,7 +22,14 @@ public:
21 // _streamIsOpen(false), 22 // _streamIsOpen(false),
22 IsTerminalMode(false), 23 IsTerminalMode(false),
23 CodePage(-1) 24 CodePage(-1)
24 {} 25 {
26 ListPathSeparatorSlash.Val =
27#ifdef _WIN32
28 false;
29#else
30 true;
31#endif
32 }
25 33
26 // ~CStdOutStream() { Close(); } 34 // ~CStdOutStream() { Close(); }
27 35
@@ -62,12 +70,13 @@ public:
62 void PrintUString(const UString &s, AString &temp); 70 void PrintUString(const UString &s, AString &temp);
63 void Convert_UString_to_AString(const UString &src, AString &dest); 71 void Convert_UString_to_AString(const UString &src, AString &dest);
64 72
65 void Normalize_UString_LF_Allowed(UString &s);
66 void Normalize_UString(UString &s); 73 void Normalize_UString(UString &s);
74 void Normalize_UString_Path(UString &s);
67 75
68 void NormalizePrint_UString(const UString &s, UString &tempU, AString &tempA); 76 void NormalizePrint_UString_Path(const UString &s, UString &tempU, AString &tempA);
77 void NormalizePrint_UString_Path(const UString &s);
69 void NormalizePrint_UString(const UString &s); 78 void NormalizePrint_UString(const UString &s);
70 void NormalizePrint_wstr(const wchar_t *s); 79 void NormalizePrint_wstr_Path(const wchar_t *s);
71}; 80};
72 81
73CStdOutStream & endl(CStdOutStream & outStream) throw(); 82CStdOutStream & endl(CStdOutStream & outStream) throw();
diff --git a/CPP/Common/StringConvert.cpp b/CPP/Common/StringConvert.cpp
index f25396a..79ff9e0 100644
--- a/CPP/Common/StringConvert.cpp
+++ b/CPP/Common/StringConvert.cpp
@@ -267,8 +267,10 @@ void MultiByteToUnicodeString2(UString &dest, const AString &src, UINT codePage)
267 267
268 if (codePage == CP_UTF8 || g_ForceToUTF8) 268 if (codePage == CP_UTF8 || g_ForceToUTF8)
269 { 269 {
270#if 1
270 ConvertUTF8ToUnicode(src, dest); 271 ConvertUTF8ToUnicode(src, dest);
271 return; 272 return;
273#endif
272 } 274 }
273 275
274 const size_t limit = ((size_t)src.Len() + 1) * 2; 276 const size_t limit = ((size_t)src.Len() + 1) * 2;
@@ -278,48 +280,47 @@ void MultiByteToUnicodeString2(UString &dest, const AString &src, UINT codePage)
278 { 280 {
279 dest.ReleaseBuf_SetEnd((unsigned)len); 281 dest.ReleaseBuf_SetEnd((unsigned)len);
280 282
281 #if WCHAR_MAX > 0xffff 283#if WCHAR_MAX > 0xffff
282 d = dest.GetBuf(); 284 d = dest.GetBuf();
283 for (size_t i = 0;; i++) 285 for (size_t i = 0;; i++)
284 { 286 {
285 // wchar_t c = dest[i];
286 wchar_t c = d[i]; 287 wchar_t c = d[i];
288 // printf("\ni=%2d c = %4x\n", (unsigned)i, (unsigned)c);
287 if (c == 0) 289 if (c == 0)
288 break; 290 break;
289 if (c >= 0x10000 && c < 0x110000) 291 if (c >= 0x10000 && c < 0x110000)
290 { 292 {
291 /* 293 UString tempString = d + i;
292 c -= 0x10000; 294 const wchar_t *t = tempString.Ptr();
293 unsigned c0 = 0xd800 + ((c >> 10) & 0x3FF);
294 dest.ReplaceOneCharAtPos(i, c0);
295 i++;
296 c = 0xdc00 + (c & 0x3FF);
297 dest.Insert_wchar_t(i, c);
298 */
299 UString temp = d + i;
300 295
301 for (size_t t = 0;; t++) 296 for (;;)
302 { 297 {
303 wchar_t w = temp[t]; 298 wchar_t w = *t++;
299 // printf("\nchar=%x\n", w);
304 if (w == 0) 300 if (w == 0)
305 break; 301 break;
306 if (i == limit) 302 if (i == limit)
307 break; // unexpected error 303 break; // unexpected error
308 if (w >= 0x10000 && w < 0x110000) 304 if (w >= 0x10000 && w < 0x110000)
309 { 305 {
306#if 1
310 if (i + 1 == limit) 307 if (i + 1 == limit)
311 break; // unexpected error 308 break; // unexpected error
312 w -= 0x10000; 309 w -= 0x10000;
313 d[i++] = (unsigned)0xd800 + (((unsigned)w >> 10) & 0x3FF); 310 d[i++] = (unsigned)0xd800 + (((unsigned)w >> 10) & 0x3ff);
314 w = 0xdc00 + (w & 0x3FF); 311 w = 0xdc00 + (w & 0x3ff);
312#else
313 // w = '_'; // for debug
314#endif
315 } 315 }
316 d[i++] = w; 316 d[i++] = w;
317 } 317 }
318 dest.ReleaseBuf_SetEnd((unsigned)i); 318 dest.ReleaseBuf_SetEnd((unsigned)i);
319 break;
319 } 320 }
320 } 321 }
321 322
322 #endif 323#endif
323 324
324 /* 325 /*
325 printf("\nMultiByteToUnicodeString2 (%d) %s\n", (int)src.Len(), src.Ptr()); 326 printf("\nMultiByteToUnicodeString2 (%d) %s\n", (int)src.Len(), src.Ptr());
@@ -395,34 +396,39 @@ static void UnicodeStringToMultiByte2(AString &dest, const UString &src2, UINT c
395 // if (codePage == 1234567) // for debug purposes 396 // if (codePage == 1234567) // for debug purposes
396 if (codePage == CP_UTF8 || g_ForceToUTF8) 397 if (codePage == CP_UTF8 || g_ForceToUTF8)
397 { 398 {
399#if 1
398 defaultCharWasUsed = false; 400 defaultCharWasUsed = false;
399 ConvertUnicodeToUTF8(src2, dest); 401 ConvertUnicodeToUTF8(src2, dest);
400 return; 402 return;
403#endif
401 } 404 }
402 405
403 UString src = src2; 406 UString src = src2;
404 #if WCHAR_MAX > 0xffff 407#if WCHAR_MAX > 0xffff
405 { 408 {
406 src.Empty(); 409 src.Empty();
407 for (unsigned i = 0; i < src2.Len();) 410 for (unsigned i = 0; i < src2.Len();)
408 { 411 {
409 wchar_t c = src2[i]; 412 wchar_t c = src2[i++];
410 if (c >= 0xd800 && c < 0xdc00 && i + 1 != src2.Len()) 413 if (c >= 0xd800 && c < 0xdc00 && i != src2.Len())
411 { 414 {
412 const wchar_t c2 = src2[i + 1]; 415 const wchar_t c2 = src2[i];
413 if (c2 >= 0xdc00 && c2 < 0x10000) 416 if (c2 >= 0xdc00 && c2 < 0xe000)
414 { 417 {
418#if 1
415 // printf("\nSurragate [%d]: %4x %4x -> ", i, (int)c, (int)c2); 419 // printf("\nSurragate [%d]: %4x %4x -> ", i, (int)c, (int)c2);
416 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff); 420 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
417 // printf("%4x\n", (int)c); 421 // printf("%4x\n", (int)c);
418 i++; 422 i++;
423#else
424 // c = '_'; // for debug
425#endif
419 } 426 }
420 } 427 }
421 src += c; 428 src += c;
422 i++;
423 } 429 }
424 } 430 }
425 #endif 431#endif
426 432
427 dest.Empty(); 433 dest.Empty();
428 defaultCharWasUsed = false; 434 defaultCharWasUsed = false;
diff --git a/CPP/Common/StringToInt.cpp b/CPP/Common/StringToInt.cpp
index bc4926e..ba8a81b 100644
--- a/CPP/Common/StringToInt.cpp
+++ b/CPP/Common/StringToInt.cpp
@@ -2,57 +2,63 @@
2 2
3#include "StdAfx.h" 3#include "StdAfx.h"
4 4
5#include <limits.h>
6#if defined(_MSC_VER) && (_MSC_VER >= 1600)
7#include <stdint.h> // for WCHAR_MAX in vs2022
8#endif
9
5#include "StringToInt.h" 10#include "StringToInt.h"
6 11
7static const UInt32 k_UInt32_max = 0xFFFFFFFF; 12static const UInt32 k_UInt32_max = 0xFFFFFFFF;
8static const UInt64 k_UInt64_max = UINT64_CONST(0xFFFFFFFFFFFFFFFF); 13static const UInt64 k_UInt64_max = UINT64_CONST(0xFFFFFFFFFFFFFFFF);
9// static const UInt64 k_UInt64_max = (UInt64)(Int64)-1; 14// static const UInt64 k_UInt64_max = (UInt64)(Int64)-1;
10 15
16#define DIGIT_TO_VALUE(charTypeUnsigned, digit) ((unsigned)(charTypeUnsigned)digit - '0')
17// #define DIGIT_TO_VALUE(charTypeUnsigned, digit) ((unsigned)digit - '0')
18// #define DIGIT_TO_VALUE(charTypeUnsigned, digit) ((unsigned)(digit - '0'))
19
11#define CONVERT_STRING_TO_UINT_FUNC(uintType, charType, charTypeUnsigned) \ 20#define CONVERT_STRING_TO_UINT_FUNC(uintType, charType, charTypeUnsigned) \
12 uintType ConvertStringTo ## uintType(const charType *s, const charType **end) throw() { \ 21uintType ConvertStringTo ## uintType(const charType *s, const charType **end) throw() { \
22 if (end) *end = s; \
23 uintType res = 0; \
24 for (;; s++) { \
25 const unsigned v = DIGIT_TO_VALUE(charTypeUnsigned, *s); \
26 if (v > 9) { if (end) *end = s; return res; } \
27 if (res > (k_ ## uintType ## _max) / 10) return 0; \
28 res *= 10; \
29 if (res > (k_ ## uintType ## _max) - v) return 0; \
30 res += v; }}
31
32// arm-linux-gnueabi GCC compilers give (WCHAR_MAX > UINT_MAX) by some unknown reason
33// so we don't use this branch
34#if 0 && WCHAR_MAX > UINT_MAX
35/*
36 if (sizeof(wchar_t) > sizeof(unsigned)
37 we must use CONVERT_STRING_TO_UINT_FUNC_SLOW
38 But we just stop compiling instead.
39 We need some real cases to test this code.
40*/
41#error Stop_Compiling_WCHAR_MAX_IS_LARGER_THAN_UINT_MAX
42#define CONVERT_STRING_TO_UINT_FUNC_SLOW(uintType, charType, charTypeUnsigned) \
43uintType ConvertStringTo ## uintType(const charType *s, const charType **end) throw() { \
13 if (end) *end = s; \ 44 if (end) *end = s; \
14 uintType res = 0; \ 45 uintType res = 0; \
15 for (;; s++) { \ 46 for (;; s++) { \
16 charTypeUnsigned c = (charTypeUnsigned)*s; \ 47 const charTypeUnsigned c = (charTypeUnsigned)*s; \
17 if (c < '0' || c > '9') { if (end) *end = s; return res; } \ 48 if (c < '0' || c > '9') { if (end) *end = s; return res; } \
18 if (res > (k_ ## uintType ## _max) / 10) return 0; \ 49 if (res > (k_ ## uintType ## _max) / 10) return 0; \
19 res *= 10; \ 50 res *= 10; \
20 unsigned v = (unsigned)(c - '0'); \ 51 const unsigned v = (unsigned)(c - '0'); \
21 if (res > (k_ ## uintType ## _max) - v) return 0; \ 52 if (res > (k_ ## uintType ## _max) - v) return 0; \
22 res += v; }} 53 res += v; }}
54#endif
55
23 56
24CONVERT_STRING_TO_UINT_FUNC(UInt32, char, Byte) 57CONVERT_STRING_TO_UINT_FUNC(UInt32, char, Byte)
25CONVERT_STRING_TO_UINT_FUNC(UInt32, wchar_t, wchar_t) 58CONVERT_STRING_TO_UINT_FUNC(UInt32, wchar_t, wchar_t)
26CONVERT_STRING_TO_UINT_FUNC(UInt64, char, Byte) 59CONVERT_STRING_TO_UINT_FUNC(UInt64, char, Byte)
27CONVERT_STRING_TO_UINT_FUNC(UInt64, wchar_t, wchar_t) 60CONVERT_STRING_TO_UINT_FUNC(UInt64, wchar_t, wchar_t)
28 61
29/*
30Int32 ConvertStringToInt32(const char *s, const char **end) throw()
31{
32 if (end)
33 *end = s;
34 const char *s2 = s;
35 if (*s == '-')
36 s2++;
37 if (*s2 == 0)
38 return 0;
39 const char *end2;
40 UInt32 res = ConvertStringToUInt32(s2, &end2);
41 if (*s == '-')
42 {
43 if (res > ((UInt32)1 << (32 - 1)))
44 return 0;
45 }
46 else if ((res & ((UInt32)1 << (32 - 1))) != 0)
47 return 0;
48 if (end)
49 *end = end2;
50 if (*s == '-')
51 return -(Int32)res;
52 return (Int32)res;
53}
54*/
55
56Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw() 62Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw()
57{ 63{
58 if (end) 64 if (end)
@@ -60,112 +66,89 @@ Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw()
60 const wchar_t *s2 = s; 66 const wchar_t *s2 = s;
61 if (*s == '-') 67 if (*s == '-')
62 s2++; 68 s2++;
63 if (*s2 == 0)
64 return 0;
65 const wchar_t *end2; 69 const wchar_t *end2;
66 UInt32 res = ConvertStringToUInt32(s2, &end2); 70 UInt32 res = ConvertStringToUInt32(s2, &end2);
67 if (*s == '-') 71 if (s2 == end2)
72 return 0;
73 if (s != s2)
68 { 74 {
69 if (res > ((UInt32)1 << (32 - 1))) 75 if (res > (UInt32)1 << (32 - 1))
76 return 0;
77 res = 0 - res;
78 }
79 else
80 {
81 if (res & (UInt32)1 << (32 - 1))
70 return 0; 82 return 0;
71 } 83 }
72 else if ((res & ((UInt32)1 << (32 - 1))) != 0)
73 return 0;
74 if (end) 84 if (end)
75 *end = end2; 85 *end = end2;
76 if (*s == '-')
77 return -(Int32)res;
78 return (Int32)res; 86 return (Int32)res;
79} 87}
80 88
81UInt32 ConvertOctStringToUInt32(const char *s, const char **end) throw() 89
82{ 90#define CONVERT_OCT_STRING_TO_UINT_FUNC(uintType) \
83 if (end) 91uintType ConvertOctStringTo ## uintType(const char *s, const char **end) throw() \
84 *end = s; 92{ \
85 UInt32 res = 0; 93 if (end) *end = s; \
86 for (;; s++) 94 uintType res = 0; \
87 { 95 for (;; s++) { \
88 unsigned c = (unsigned char)*s; 96 const unsigned c = (unsigned)(Byte)*s - '0'; \
89 if (c < '0' || c > '7') 97 if (c > 7) { \
90 { 98 if (end) \
91 if (end) 99 *end = s; \
92 *end = s; 100 return res; \
93 return res; 101 } \
94 } 102 if (res & (uintType)7 << (sizeof(uintType) * 8 - 3)) \
95 if ((res & (UInt32)7 << (32 - 3)) != 0) 103 return 0; \
96 return 0; 104 res <<= 3; \
97 res <<= 3; 105 res |= c; \
98 res |= (unsigned)(c - '0'); 106 } \
99 }
100} 107}
101 108
102UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw() 109CONVERT_OCT_STRING_TO_UINT_FUNC(UInt32)
103{ 110CONVERT_OCT_STRING_TO_UINT_FUNC(UInt64)
104 if (end) 111
105 *end = s; 112
106 UInt64 res = 0; 113#define CONVERT_HEX_STRING_TO_UINT_FUNC(uintType) \
107 for (;; s++) 114uintType ConvertHexStringTo ## uintType(const char *s, const char **end) throw() \
108 { 115{ \
109 unsigned c = (unsigned char)*s; 116 if (end) *end = s; \
110 if (c < '0' || c > '7') 117 uintType res = 0; \
111 { 118 for (;; s++) { \
112 if (end) 119 unsigned c = (unsigned)(Byte)*s; \
113 *end = s; 120 Z7_PARSE_HEX_DIGIT(c, { if (end) *end = s; return res; }) \
114 return res; 121 if (res & (uintType)0xF << (sizeof(uintType) * 8 - 4)) \
115 } 122 return 0; \
116 if ((res & (UInt64)7 << (64 - 3)) != 0) 123 res <<= 4; \
117 return 0; 124 res |= c; \
118 res <<= 3; 125 } \
119 res |= (unsigned)(c - '0');
120 }
121} 126}
122 127
123UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw() 128CONVERT_HEX_STRING_TO_UINT_FUNC(UInt32)
129CONVERT_HEX_STRING_TO_UINT_FUNC(UInt64)
130
131const char *FindNonHexChar(const char *s) throw()
124{ 132{
125 if (end) 133 for (;;)
126 *end = s;
127 UInt32 res = 0;
128 for (;; s++)
129 { 134 {
130 unsigned c = (Byte)*s; 135 unsigned c = (Byte)*s++; // pointer can go 1 byte after end
131 unsigned v; 136 c -= '0';
132 if (c >= '0' && c <= '9') v = (c - '0'); 137 if (c <= 9)
133 else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A'); 138 continue;
134 else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a'); 139 c -= 'A' - '0';
135 else 140 c &= ~0x20u;
136 { 141 if (c > 5)
137 if (end) 142 return s - 1;
138 *end = s;
139 return res;
140 }
141 if ((res & (UInt32)0xF << (32 - 4)) != 0)
142 return 0;
143 res <<= 4;
144 res |= v;
145 } 143 }
146} 144}
147 145
148UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw() 146Byte *ParseHexString(const char *s, Byte *dest) throw()
149{ 147{
150 if (end) 148 for (;;)
151 *end = s;
152 UInt64 res = 0;
153 for (;; s++)
154 { 149 {
155 unsigned c = (Byte)*s; 150 unsigned v0 = (Byte)s[0]; Z7_PARSE_HEX_DIGIT(v0, return dest;)
156 unsigned v; 151 unsigned v1 = (Byte)s[1]; s += 2; Z7_PARSE_HEX_DIGIT(v1, return dest;)
157 if (c >= '0' && c <= '9') v = (c - '0'); 152 *dest++ = (Byte)(v1 | (v0 << 4));
158 else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A');
159 else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a');
160 else
161 {
162 if (end)
163 *end = s;
164 return res;
165 }
166 if ((res & (UInt64)0xF << (64 - 4)) != 0)
167 return 0;
168 res <<= 4;
169 res |= v;
170 } 153 }
171} 154}
diff --git a/CPP/Common/StringToInt.h b/CPP/Common/StringToInt.h
index c9dce7d..31ab274 100644
--- a/CPP/Common/StringToInt.h
+++ b/CPP/Common/StringToInt.h
@@ -19,4 +19,20 @@ UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw();
19UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw(); 19UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw();
20UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw(); 20UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw();
21 21
22#define Z7_PARSE_HEX_DIGIT(c, err_op) \
23{ c -= '0'; \
24 if (c > 9) { \
25 c -= 'A' - '0'; \
26 c &= ~0x20u; \
27 if (c > 5) { err_op } \
28 c += 10; \
29 } \
30}
31
32const char *FindNonHexChar(const char *s) throw();
33
34// in: (dest != NULL)
35// returns: pointer in dest array after last written byte
36Byte *ParseHexString(const char *s, Byte *dest) throw();
37
22#endif 38#endif
diff --git a/CPP/Common/TextConfig.cpp b/CPP/Common/TextConfig.cpp
index d3e561c..5714e46 100644
--- a/CPP/Common/TextConfig.cpp
+++ b/CPP/Common/TextConfig.cpp
@@ -90,15 +90,14 @@ bool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs)
90 c = s[pos++]; 90 c = s[pos++];
91 switch (c) 91 switch (c)
92 { 92 {
93 case 'n': message += '\n'; break; 93 case 'n': c = '\n'; break;
94 case 't': message += '\t'; break; 94 case 't': c = '\t'; break;
95 case '\\': message += '\\'; break; 95 case '\\': break;
96 case '\"': message += '\"'; break; 96 case '\"': break;
97 default: message += '\\'; message += c; break; 97 default: message += '\\'; break;
98 } 98 }
99 } 99 }
100 else 100 message += c;
101 message += c;
102 } 101 }
103 if (!ConvertUTF8ToUnicode(message, pair.String)) 102 if (!ConvertUTF8ToUnicode(message, pair.String))
104 return false; 103 return false;
diff --git a/CPP/Common/UTFConvert.cpp b/CPP/Common/UTFConvert.cpp
index fb166b7..509de76 100644
--- a/CPP/Common/UTFConvert.cpp
+++ b/CPP/Common/UTFConvert.cpp
@@ -135,7 +135,7 @@ we can place 128 ESCAPE chars to
135#endif 135#endif
136 136
137#define IS_SURROGATE_POINT(v) (((v) & (UInt32)0xfffff800) == 0xd800) 137#define IS_SURROGATE_POINT(v) (((v) & (UInt32)0xfffff800) == 0xd800)
138#define IS_LOW_SURROGATE_POINT(v) (((v) & (UInt32)0xfffffC00) == 0xdc00) 138#define IS_LOW_SURROGATE_POINT(v) (((v) & (UInt32)0xfffffc00) == 0xdc00)
139 139
140 140
141#define UTF_ERROR_UTF8_CHECK \ 141#define UTF_ERROR_UTF8_CHECK \
@@ -168,14 +168,14 @@ void CUtf8Check::Check_Buf(const char *src, size_t size) throw()
168 if (c < 0x80) 168 if (c < 0x80)
169 continue; 169 continue;
170 170
171 if (c < 0xc0 + 2) // it's limit for 0x140000 unicode codes : win32 compatibility 171 if (c < 0xc0 + 2)
172 UTF_ERROR_UTF8_CHECK 172 UTF_ERROR_UTF8_CHECK
173 173
174 unsigned numBytes; 174 unsigned numBytes;
175
176 UInt32 val = c; 175 UInt32 val = c;
177 MY_UTF8_HEAD_PARSE2(1) 176 MY_UTF8_HEAD_PARSE2(1)
178 else MY_UTF8_HEAD_PARSE2(2) 177 else MY_UTF8_HEAD_PARSE2(2)
178 else MY_UTF8_HEAD_PARSE2(3)
179 else MY_UTF8_HEAD_PARSE2(4) 179 else MY_UTF8_HEAD_PARSE2(4)
180 else MY_UTF8_HEAD_PARSE2(5) 180 else MY_UTF8_HEAD_PARSE2(5)
181 else 181 else
@@ -768,7 +768,7 @@ void Convert_UTF16_To_UTF32(const UString &src, UString &dest)
768 if (c >= 0xd800 && c < 0xdc00 && i < src.Len()) 768 if (c >= 0xd800 && c < 0xdc00 && i < src.Len())
769 { 769 {
770 const wchar_t c2 = src[i]; 770 const wchar_t c2 = src[i];
771 if (c2 >= 0xdc00 && c2 < 0x10000) 771 if (c2 >= 0xdc00 && c2 < 0xe000)
772 { 772 {
773 // printf("\nSurragate [%d]: %4x %4x -> ", i, (int)c, (int)c2); 773 // printf("\nSurragate [%d]: %4x %4x -> ", i, (int)c, (int)c2);
774 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff); 774 c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
diff --git a/CPP/Common/Xxh64Reg.cpp b/CPP/Common/Xxh64Reg.cpp
new file mode 100644
index 0000000..8abd15e
--- /dev/null
+++ b/CPP/Common/Xxh64Reg.cpp
@@ -0,0 +1,97 @@
1// Xxh64Reg.cpp
2
3#include "StdAfx.h"
4
5#include "../../C/Xxh64.h"
6#include "../../C/CpuArch.h"
7
8// #define Z7_USE_HHX64_ORIGINAL
9#ifdef Z7_USE_HHX64_ORIGINAL
10#ifdef __clang__
11#include "../../C/zstd7z/7z_zstd_cmpl.h"
12#pragma GCC diagnostic ignored "-Wlanguage-extension-token"
13#endif
14#define XXH_STATIC_LINKING_ONLY
15#include "../../C/zstd7z/common/xxhash.h"
16#endif
17
18#include "../Common/MyCom.h"
19
20#include "../7zip/Common/RegisterCodec.h"
21
22Z7_CLASS_IMP_COM_1(
23 CXxh64Hasher
24 , IHasher
25)
26 CXxh64 _state;
27public:
28 Byte _mtDummy[1 << 7]; // it's public to eliminate clang warning: unused private field
29 CXxh64Hasher() { Init(); }
30};
31
32Z7_COM7F_IMF2(void, CXxh64Hasher::Init())
33{
34 Xxh64_Init(&_state);
35}
36
37Z7_COM7F_IMF2(void, CXxh64Hasher::Update(const void *data, UInt32 size))
38{
39#if 1
40 Xxh64_Update(&_state, data, size);
41#else // for debug:
42 for (;;)
43 {
44 if (size == 0)
45 return;
46 UInt32 size2 = (size * 0x85EBCA87) % size / 8;
47 if (size2 == 0)
48 size2 = 1;
49 Xxh64_Update(&_state, data, size2);
50 data = (const void *)((const Byte *)data + size2);
51 size -= size2;
52 }
53#endif
54}
55
56Z7_COM7F_IMF2(void, CXxh64Hasher::Final(Byte *digest))
57{
58 const UInt64 val = Xxh64_Digest(&_state);
59 SetUi64(digest, val)
60}
61
62REGISTER_HASHER(CXxh64Hasher, 0x211, "XXH64", 8)
63
64
65
66#ifdef Z7_USE_HHX64_ORIGINAL
67namespace NOriginal
68{
69Z7_CLASS_IMP_COM_1(
70 CXxh64Hasher
71 , IHasher
72)
73 XXH64_state_t _state;
74public:
75 Byte _mtDummy[1 << 7]; // it's public to eliminate clang warning: unused private field
76 CXxh64Hasher() { Init(); }
77};
78
79Z7_COM7F_IMF2(void, CXxh64Hasher::Init())
80{
81 XXH64_reset(&_state, 0);
82}
83
84Z7_COM7F_IMF2(void, CXxh64Hasher::Update(const void *data, UInt32 size))
85{
86 XXH64_update(&_state, data, size);
87}
88
89Z7_COM7F_IMF2(void, CXxh64Hasher::Final(Byte *digest))
90{
91 const UInt64 val = XXH64_digest(&_state);
92 SetUi64(digest, val)
93}
94
95REGISTER_HASHER(CXxh64Hasher, 0x212, "XXH64a", 8)
96}
97#endif