1*f6dc9357SAndroid Build Coastguard Worker // Main.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyWindows.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_OLD_WIN_SDK
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
12*f6dc9357SAndroid Build Coastguard Worker #include <psapi.h>
13*f6dc9357SAndroid Build Coastguard Worker #else
14*f6dc9357SAndroid Build Coastguard Worker #include <Psapi.h>
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #else // Z7_OLD_WIN_SDK
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker typedef struct {
20*f6dc9357SAndroid Build Coastguard Worker DWORD cb;
21*f6dc9357SAndroid Build Coastguard Worker DWORD PageFaultCount;
22*f6dc9357SAndroid Build Coastguard Worker SIZE_T PeakWorkingSetSize;
23*f6dc9357SAndroid Build Coastguard Worker SIZE_T WorkingSetSize;
24*f6dc9357SAndroid Build Coastguard Worker SIZE_T QuotaPeakPagedPoolUsage;
25*f6dc9357SAndroid Build Coastguard Worker SIZE_T QuotaPagedPoolUsage;
26*f6dc9357SAndroid Build Coastguard Worker SIZE_T QuotaPeakNonPagedPoolUsage;
27*f6dc9357SAndroid Build Coastguard Worker SIZE_T QuotaNonPagedPoolUsage;
28*f6dc9357SAndroid Build Coastguard Worker SIZE_T PagefileUsage;
29*f6dc9357SAndroid Build Coastguard Worker SIZE_T PeakPagefileUsage;
30*f6dc9357SAndroid Build Coastguard Worker } PROCESS_MEMORY_COUNTERS;
31*f6dc9357SAndroid Build Coastguard Worker typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_OLD_WIN_SDK
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32
36*f6dc9357SAndroid Build Coastguard Worker #include <unistd.h>
37*f6dc9357SAndroid Build Coastguard Worker #include <sys/ioctl.h>
38*f6dc9357SAndroid Build Coastguard Worker #include <sys/time.h>
39*f6dc9357SAndroid Build Coastguard Worker #include <sys/times.h>
40*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
43*f6dc9357SAndroid Build Coastguard Worker
44*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyInitGuid.h"
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/CommandLineParser.h"
47*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
48*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyException.h"
49*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StdInStream.h"
50*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StdOutStream.h"
51*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
52*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
53*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h"
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
56*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/TimeUtils.h"
57*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveCommandLine.h"
60*f6dc9357SAndroid Build Coastguard Worker #include "../Common/Bench.h"
61*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ExitCode.h"
62*f6dc9357SAndroid Build Coastguard Worker #include "../Common/Extract.h"
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
65*f6dc9357SAndroid Build Coastguard Worker #include "../Common/LoadCodecs.h"
66*f6dc9357SAndroid Build Coastguard Worker #endif
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/RegisterCodec.h"
69*f6dc9357SAndroid Build Coastguard Worker
70*f6dc9357SAndroid Build Coastguard Worker #include "BenchCon.h"
71*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h"
72*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallbackConsole.h"
73*f6dc9357SAndroid Build Coastguard Worker #include "HashCon.h"
74*f6dc9357SAndroid Build Coastguard Worker #include "List.h"
75*f6dc9357SAndroid Build Coastguard Worker #include "OpenCallbackConsole.h"
76*f6dc9357SAndroid Build Coastguard Worker #include "UpdateCallbackConsole.h"
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_PROG_VARIANT_R
79*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/7zVersion.h"
80*f6dc9357SAndroid Build Coastguard Worker #else
81*f6dc9357SAndroid Build Coastguard Worker #include "../../MyVersion.h"
82*f6dc9357SAndroid Build Coastguard Worker #endif
83*f6dc9357SAndroid Build Coastguard Worker
84*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
85*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
86*f6dc9357SAndroid Build Coastguard Worker using namespace NCommandLineParser;
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
89*f6dc9357SAndroid Build Coastguard Worker extern
90*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
91*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance = NULL;
92*f6dc9357SAndroid Build Coastguard Worker #endif
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker extern CStdOutStream *g_StdStream;
95*f6dc9357SAndroid Build Coastguard Worker extern CStdOutStream *g_ErrStream;
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumCodecs;
98*f6dc9357SAndroid Build Coastguard Worker extern const CCodecInfo *g_Codecs[];
99*f6dc9357SAndroid Build Coastguard Worker
100*f6dc9357SAndroid Build Coastguard Worker extern unsigned g_NumHashers;
101*f6dc9357SAndroid Build Coastguard Worker extern const CHasherInfo *g_Hashers[];
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
104*f6dc9357SAndroid Build Coastguard Worker extern
105*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
106*f6dc9357SAndroid Build Coastguard Worker const CExternalCodecs *g_ExternalCodecs_Ptr;
107*f6dc9357SAndroid Build Coastguard Worker #endif
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker DECLARE_AND_SET_CLIENT_VERSION_VAR
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_PROG_VARIANT_Z)
112*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX "z"
113*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX_2 " (z)"
114*f6dc9357SAndroid Build Coastguard Worker #elif defined(Z7_PROG_VARIANT_R)
115*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX "r"
116*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX_2 " (r)"
117*f6dc9357SAndroid Build Coastguard Worker #elif defined(Z7_PROG_VARIANT_A) || !defined(Z7_EXTERNAL_CODECS)
118*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX "a"
119*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX_2 " (a)"
120*f6dc9357SAndroid Build Coastguard Worker #else
121*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX ""
122*f6dc9357SAndroid Build Coastguard Worker #define PROG_POSTFIX_2 ""
123*f6dc9357SAndroid Build Coastguard Worker #endif
124*f6dc9357SAndroid Build Coastguard Worker
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker static const char * const kCopyrightString = "\n7-Zip"
127*f6dc9357SAndroid Build Coastguard Worker PROG_POSTFIX_2
128*f6dc9357SAndroid Build Coastguard Worker " " MY_VERSION_CPU
129*f6dc9357SAndroid Build Coastguard Worker " : " MY_COPYRIGHT_DATE "\n";
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Worker static const char * const kHelpString =
132*f6dc9357SAndroid Build Coastguard Worker "Usage: 7z"
133*f6dc9357SAndroid Build Coastguard Worker PROG_POSTFIX
134*f6dc9357SAndroid Build Coastguard Worker " <command> [<switches>...] <archive_name> [<file_names>...] [@listfile]\n"
135*f6dc9357SAndroid Build Coastguard Worker "\n"
136*f6dc9357SAndroid Build Coastguard Worker "<Commands>\n"
137*f6dc9357SAndroid Build Coastguard Worker " a : Add files to archive\n"
138*f6dc9357SAndroid Build Coastguard Worker " b : Benchmark\n"
139*f6dc9357SAndroid Build Coastguard Worker " d : Delete files from archive\n"
140*f6dc9357SAndroid Build Coastguard Worker " e : Extract files from archive (without using directory names)\n"
141*f6dc9357SAndroid Build Coastguard Worker " h : Calculate hash values for files\n"
142*f6dc9357SAndroid Build Coastguard Worker " i : Show information about supported formats\n"
143*f6dc9357SAndroid Build Coastguard Worker " l : List contents of archive\n"
144*f6dc9357SAndroid Build Coastguard Worker " rn : Rename files in archive\n"
145*f6dc9357SAndroid Build Coastguard Worker " t : Test integrity of archive\n"
146*f6dc9357SAndroid Build Coastguard Worker " u : Update files to archive\n"
147*f6dc9357SAndroid Build Coastguard Worker " x : eXtract files with full paths\n"
148*f6dc9357SAndroid Build Coastguard Worker "\n"
149*f6dc9357SAndroid Build Coastguard Worker "<Switches>\n"
150*f6dc9357SAndroid Build Coastguard Worker " -- : Stop switches and @listfile parsing\n"
151*f6dc9357SAndroid Build Coastguard Worker " -ai[r[-|0]][m[-|2]][w[-]]{@listfile|!wildcard} : Include archives\n"
152*f6dc9357SAndroid Build Coastguard Worker " -ax[r[-|0]][m[-|2]][w[-]]{@listfile|!wildcard} : eXclude archives\n"
153*f6dc9357SAndroid Build Coastguard Worker " -ao{a|s|t|u} : set Overwrite mode\n"
154*f6dc9357SAndroid Build Coastguard Worker " -an : disable archive_name field\n"
155*f6dc9357SAndroid Build Coastguard Worker " -bb[0-3] : set output log level\n"
156*f6dc9357SAndroid Build Coastguard Worker " -bd : disable progress indicator\n"
157*f6dc9357SAndroid Build Coastguard Worker " -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line\n"
158*f6dc9357SAndroid Build Coastguard Worker " -bt : show execution time statistics\n"
159*f6dc9357SAndroid Build Coastguard Worker " -i[r[-|0]][m[-|2]][w[-]]{@listfile|!wildcard} : Include filenames\n"
160*f6dc9357SAndroid Build Coastguard Worker " -m{Parameters} : set compression Method\n"
161*f6dc9357SAndroid Build Coastguard Worker " -mmt[N] : set number of CPU threads\n"
162*f6dc9357SAndroid Build Coastguard Worker " -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)\n"
163*f6dc9357SAndroid Build Coastguard Worker " -o{Directory} : set Output directory\n"
164*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
165*f6dc9357SAndroid Build Coastguard Worker " -p{Password} : set Password\n"
166*f6dc9357SAndroid Build Coastguard Worker #endif
167*f6dc9357SAndroid Build Coastguard Worker " -r[-|0] : Recurse subdirectories for name search\n"
168*f6dc9357SAndroid Build Coastguard Worker " -sa{a|e|s} : set Archive name mode\n"
169*f6dc9357SAndroid Build Coastguard Worker " -scc{UTF-8|WIN|DOS} : set charset for console input/output\n"
170*f6dc9357SAndroid Build Coastguard Worker " -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files\n"
171*f6dc9357SAndroid Build Coastguard Worker " -scrc[CRC32|CRC64|SHA256"
172*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_PROG_VARIANT_R
173*f6dc9357SAndroid Build Coastguard Worker "|SHA1|XXH64"
174*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_PROG_VARIANT_Z
175*f6dc9357SAndroid Build Coastguard Worker "|BLAKE2SP"
176*f6dc9357SAndroid Build Coastguard Worker #endif
177*f6dc9357SAndroid Build Coastguard Worker #endif
178*f6dc9357SAndroid Build Coastguard Worker "|*] : set hash function for x, e, h commands\n"
179*f6dc9357SAndroid Build Coastguard Worker " -sdel : delete files after compression\n"
180*f6dc9357SAndroid Build Coastguard Worker " -seml[.] : send archive by email\n"
181*f6dc9357SAndroid Build Coastguard Worker " -sfx[{name}] : Create SFX archive\n"
182*f6dc9357SAndroid Build Coastguard Worker " -si[{name}] : read data from stdin\n"
183*f6dc9357SAndroid Build Coastguard Worker " -slp : set Large Pages mode\n"
184*f6dc9357SAndroid Build Coastguard Worker " -slt : show technical information for l (List) command\n"
185*f6dc9357SAndroid Build Coastguard Worker " -snh : store hard links as links\n"
186*f6dc9357SAndroid Build Coastguard Worker " -snl : store symbolic links as links\n"
187*f6dc9357SAndroid Build Coastguard Worker " -sni : store NT security information\n"
188*f6dc9357SAndroid Build Coastguard Worker " -sns[-] : store NTFS alternate streams\n"
189*f6dc9357SAndroid Build Coastguard Worker " -so : write data to stdout\n"
190*f6dc9357SAndroid Build Coastguard Worker " -spd : disable wildcard matching for file names\n"
191*f6dc9357SAndroid Build Coastguard Worker " -spe : eliminate duplication of root folder for extract command\n"
192*f6dc9357SAndroid Build Coastguard Worker " -spf[2] : use fully qualified file paths\n"
193*f6dc9357SAndroid Build Coastguard Worker " -ssc[-] : set sensitive case mode\n"
194*f6dc9357SAndroid Build Coastguard Worker " -sse : stop archive creating, if it can't open some input file\n"
195*f6dc9357SAndroid Build Coastguard Worker " -ssp : do not change Last Access Time of source files while archiving\n"
196*f6dc9357SAndroid Build Coastguard Worker " -ssw : compress shared files\n"
197*f6dc9357SAndroid Build Coastguard Worker " -stl : set archive timestamp from the most recently modified file\n"
198*f6dc9357SAndroid Build Coastguard Worker " -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)\n"
199*f6dc9357SAndroid Build Coastguard Worker " -stx{Type} : exclude archive type\n"
200*f6dc9357SAndroid Build Coastguard Worker " -t{Type} : Set type of archive\n"
201*f6dc9357SAndroid Build Coastguard Worker " -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options\n"
202*f6dc9357SAndroid Build Coastguard Worker " -v{Size}[b|k|m|g] : Create volumes\n"
203*f6dc9357SAndroid Build Coastguard Worker " -w[{path}] : assign Work directory. Empty path means a temporary directory\n"
204*f6dc9357SAndroid Build Coastguard Worker " -x[r[-|0]][m[-|2]][w[-]]{@listfile|!wildcard} : eXclude filenames\n"
205*f6dc9357SAndroid Build Coastguard Worker " -y : assume Yes on all queries\n";
206*f6dc9357SAndroid Build Coastguard Worker
207*f6dc9357SAndroid Build Coastguard Worker // ---------------------------
208*f6dc9357SAndroid Build Coastguard Worker // exception messages
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard Worker static const char * const kEverythingIsOk = "Everything is Ok";
211*f6dc9357SAndroid Build Coastguard Worker static const char * const kUserErrorMessage = "Incorrect command line";
212*f6dc9357SAndroid Build Coastguard Worker static const char * const kNoFormats = "7-Zip cannot find the code that works with archives.";
213*f6dc9357SAndroid Build Coastguard Worker static const char * const kUnsupportedArcTypeMessage = "Unsupported archive type";
214*f6dc9357SAndroid Build Coastguard Worker // static const char * const kUnsupportedUpdateArcType = "Can't create archive for that type";
215*f6dc9357SAndroid Build Coastguard Worker
216*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_EXTRACT_ONLY
217*f6dc9357SAndroid Build Coastguard Worker #define kDefaultSfxModule "7zCon.sfx"
218*f6dc9357SAndroid Build Coastguard Worker #endif
219*f6dc9357SAndroid Build Coastguard Worker
220*f6dc9357SAndroid Build Coastguard Worker Z7_ATTR_NORETURN
ShowMessageAndThrowException(LPCSTR message,NExitCode::EEnum code)221*f6dc9357SAndroid Build Coastguard Worker static void ShowMessageAndThrowException(LPCSTR message, NExitCode::EEnum code)
222*f6dc9357SAndroid Build Coastguard Worker {
223*f6dc9357SAndroid Build Coastguard Worker if (g_ErrStream)
224*f6dc9357SAndroid Build Coastguard Worker *g_ErrStream << endl << "ERROR: " << message << endl;
225*f6dc9357SAndroid Build Coastguard Worker throw code;
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker
228*f6dc9357SAndroid Build Coastguard Worker
229*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
230*f6dc9357SAndroid Build Coastguard Worker #define ShowProgInfo(so)
231*f6dc9357SAndroid Build Coastguard Worker #else
ShowProgInfo(CStdOutStream * so)232*f6dc9357SAndroid Build Coastguard Worker static void ShowProgInfo(CStdOutStream *so)
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker if (!so)
235*f6dc9357SAndroid Build Coastguard Worker return;
236*f6dc9357SAndroid Build Coastguard Worker
237*f6dc9357SAndroid Build Coastguard Worker *so
238*f6dc9357SAndroid Build Coastguard Worker
239*f6dc9357SAndroid Build Coastguard Worker /*
240*f6dc9357SAndroid Build Coastguard Worker #ifdef __DATE__
241*f6dc9357SAndroid Build Coastguard Worker << " " << __DATE__
242*f6dc9357SAndroid Build Coastguard Worker #endif
243*f6dc9357SAndroid Build Coastguard Worker #ifdef __TIME__
244*f6dc9357SAndroid Build Coastguard Worker << " " << __TIME__
245*f6dc9357SAndroid Build Coastguard Worker #endif
246*f6dc9357SAndroid Build Coastguard Worker */
247*f6dc9357SAndroid Build Coastguard Worker
248*f6dc9357SAndroid Build Coastguard Worker << " " << (unsigned)(sizeof(void *)) * 8 << "-bit"
249*f6dc9357SAndroid Build Coastguard Worker
250*f6dc9357SAndroid Build Coastguard Worker #ifdef __ILP32__
251*f6dc9357SAndroid Build Coastguard Worker << " ILP32"
252*f6dc9357SAndroid Build Coastguard Worker #endif
253*f6dc9357SAndroid Build Coastguard Worker
254*f6dc9357SAndroid Build Coastguard Worker #ifdef __ARM_ARCH
255*f6dc9357SAndroid Build Coastguard Worker << " arm_v:" << __ARM_ARCH
256*f6dc9357SAndroid Build Coastguard Worker #if (__ARM_ARCH == 8)
257*f6dc9357SAndroid Build Coastguard Worker // for macos:
258*f6dc9357SAndroid Build Coastguard Worker #if defined(__ARM_ARCH_8_9__)
259*f6dc9357SAndroid Build Coastguard Worker << ".9"
260*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_8__)
261*f6dc9357SAndroid Build Coastguard Worker << ".8"
262*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_7__)
263*f6dc9357SAndroid Build Coastguard Worker << ".7"
264*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_6__)
265*f6dc9357SAndroid Build Coastguard Worker << ".6"
266*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_5__)
267*f6dc9357SAndroid Build Coastguard Worker << ".5"
268*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_4__)
269*f6dc9357SAndroid Build Coastguard Worker << ".4"
270*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_3__)
271*f6dc9357SAndroid Build Coastguard Worker << ".3"
272*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_2__)
273*f6dc9357SAndroid Build Coastguard Worker << ".2"
274*f6dc9357SAndroid Build Coastguard Worker #elif defined(__ARM_ARCH_8_1__)
275*f6dc9357SAndroid Build Coastguard Worker << ".1"
276*f6dc9357SAndroid Build Coastguard Worker #endif
277*f6dc9357SAndroid Build Coastguard Worker #endif
278*f6dc9357SAndroid Build Coastguard Worker
279*f6dc9357SAndroid Build Coastguard Worker #if defined(__ARM_ARCH_PROFILE) && \
280*f6dc9357SAndroid Build Coastguard Worker ( __ARM_ARCH_PROFILE >= 'A' && __ARM_ARCH_PROFILE <= 'Z' \
281*f6dc9357SAndroid Build Coastguard Worker || __ARM_ARCH_PROFILE >= 65 && __ARM_ARCH_PROFILE <= 65 + 25)
282*f6dc9357SAndroid Build Coastguard Worker << "-" << (char)__ARM_ARCH_PROFILE
283*f6dc9357SAndroid Build Coastguard Worker #endif
284*f6dc9357SAndroid Build Coastguard Worker
285*f6dc9357SAndroid Build Coastguard Worker #ifdef __ARM_ARCH_ISA_THUMB
286*f6dc9357SAndroid Build Coastguard Worker << " thumb:" << __ARM_ARCH_ISA_THUMB
287*f6dc9357SAndroid Build Coastguard Worker #endif
288*f6dc9357SAndroid Build Coastguard Worker #endif
289*f6dc9357SAndroid Build Coastguard Worker
290*f6dc9357SAndroid Build Coastguard Worker #ifdef _MIPS_ARCH
291*f6dc9357SAndroid Build Coastguard Worker << " mips_arch:" << _MIPS_ARCH
292*f6dc9357SAndroid Build Coastguard Worker #endif
293*f6dc9357SAndroid Build Coastguard Worker #ifdef __mips_isa_rev
294*f6dc9357SAndroid Build Coastguard Worker << " mips_isa_rev:" << __mips_isa_rev
295*f6dc9357SAndroid Build Coastguard Worker #endif
296*f6dc9357SAndroid Build Coastguard Worker
297*f6dc9357SAndroid Build Coastguard Worker #ifdef __iset__
298*f6dc9357SAndroid Build Coastguard Worker << " e2k_v:" << __iset__
299*f6dc9357SAndroid Build Coastguard Worker #endif
300*f6dc9357SAndroid Build Coastguard Worker ;
301*f6dc9357SAndroid Build Coastguard Worker
302*f6dc9357SAndroid Build Coastguard Worker
303*f6dc9357SAndroid Build Coastguard Worker
304*f6dc9357SAndroid Build Coastguard Worker #ifdef ENV_HAVE_LOCALE
305*f6dc9357SAndroid Build Coastguard Worker *so << " locale=" << GetLocale();
306*f6dc9357SAndroid Build Coastguard Worker #endif
307*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker const bool is_IsNativeUTF8 = IsNativeUTF8();
310*f6dc9357SAndroid Build Coastguard Worker if (!is_IsNativeUTF8)
311*f6dc9357SAndroid Build Coastguard Worker *so << " UTF8=" << (is_IsNativeUTF8 ? "+" : "-");
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker if (!g_ForceToUTF8)
314*f6dc9357SAndroid Build Coastguard Worker *so << " use-UTF8=" << (g_ForceToUTF8 ? "+" : "-");
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker const unsigned wchar_t_size = (unsigned)sizeof(wchar_t);
317*f6dc9357SAndroid Build Coastguard Worker if (wchar_t_size != 4)
318*f6dc9357SAndroid Build Coastguard Worker *so << " wchar_t=" << wchar_t_size * 8 << "-bit";
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker const unsigned off_t_size = (unsigned)sizeof(off_t);
322*f6dc9357SAndroid Build Coastguard Worker if (off_t_size != 8)
323*f6dc9357SAndroid Build Coastguard Worker *so << " Files=" << off_t_size * 8 << "-bit";
324*f6dc9357SAndroid Build Coastguard Worker }
325*f6dc9357SAndroid Build Coastguard Worker #endif
326*f6dc9357SAndroid Build Coastguard Worker
327*f6dc9357SAndroid Build Coastguard Worker {
328*f6dc9357SAndroid Build Coastguard Worker const UInt32 numCpus = NWindows::NSystem::GetNumberOfProcessors();
329*f6dc9357SAndroid Build Coastguard Worker *so << " Threads:" << numCpus;
330*f6dc9357SAndroid Build Coastguard Worker const UInt64 openMAX= NWindows::NSystem::Get_File_OPEN_MAX();
331*f6dc9357SAndroid Build Coastguard Worker *so << " OPEN_MAX:" << openMAX;
332*f6dc9357SAndroid Build Coastguard Worker {
333*f6dc9357SAndroid Build Coastguard Worker FString temp;
334*f6dc9357SAndroid Build Coastguard Worker NDir::MyGetTempPath(temp);
335*f6dc9357SAndroid Build Coastguard Worker if (!temp.IsEqualTo(STRING_PATH_SEPARATOR "tmp" STRING_PATH_SEPARATOR))
336*f6dc9357SAndroid Build Coastguard Worker *so << " temp_path:" << temp;
337*f6dc9357SAndroid Build Coastguard Worker }
338*f6dc9357SAndroid Build Coastguard Worker }
339*f6dc9357SAndroid Build Coastguard Worker
340*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_7ZIP_ASM
341*f6dc9357SAndroid Build Coastguard Worker *so << ", ASM";
342*f6dc9357SAndroid Build Coastguard Worker #endif
343*f6dc9357SAndroid Build Coastguard Worker
344*f6dc9357SAndroid Build Coastguard Worker /*
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker AString s;
347*f6dc9357SAndroid Build Coastguard Worker GetCpuName(s);
348*f6dc9357SAndroid Build Coastguard Worker s.Trim();
349*f6dc9357SAndroid Build Coastguard Worker *so << ", " << s;
350*f6dc9357SAndroid Build Coastguard Worker }
351*f6dc9357SAndroid Build Coastguard Worker
352*f6dc9357SAndroid Build Coastguard Worker #ifdef __ARM_FEATURE_CRC32
353*f6dc9357SAndroid Build Coastguard Worker << " CRC32"
354*f6dc9357SAndroid Build Coastguard Worker #endif
355*f6dc9357SAndroid Build Coastguard Worker
356*f6dc9357SAndroid Build Coastguard Worker
357*f6dc9357SAndroid Build Coastguard Worker #if (defined MY_CPU_X86_OR_AMD64 || defined(MY_CPU_ARM_OR_ARM64))
358*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_AES()) *so << ",AES";
359*f6dc9357SAndroid Build Coastguard Worker #endif
360*f6dc9357SAndroid Build Coastguard Worker
361*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_ARM_OR_ARM64
362*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_CRC32()) *so << ",CRC32";
363*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32)
364*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_CRYPTO()) *so << ",CRYPTO";
365*f6dc9357SAndroid Build Coastguard Worker #else
366*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_SHA1()) *so << ",SHA1";
367*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_SHA2()) *so << ",SHA2";
368*f6dc9357SAndroid Build Coastguard Worker #endif
369*f6dc9357SAndroid Build Coastguard Worker #endif
370*f6dc9357SAndroid Build Coastguard Worker */
371*f6dc9357SAndroid Build Coastguard Worker
372*f6dc9357SAndroid Build Coastguard Worker *so << endl;
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker #endif
375*f6dc9357SAndroid Build Coastguard Worker
ShowCopyrightAndHelp(CStdOutStream * so,bool needHelp)376*f6dc9357SAndroid Build Coastguard Worker static void ShowCopyrightAndHelp(CStdOutStream *so, bool needHelp)
377*f6dc9357SAndroid Build Coastguard Worker {
378*f6dc9357SAndroid Build Coastguard Worker if (!so)
379*f6dc9357SAndroid Build Coastguard Worker return;
380*f6dc9357SAndroid Build Coastguard Worker *so << kCopyrightString;
381*f6dc9357SAndroid Build Coastguard Worker // *so << "# CPUs: " << (UInt64)NWindows::NSystem::GetNumberOfProcessors() << endl;
382*f6dc9357SAndroid Build Coastguard Worker ShowProgInfo(so);
383*f6dc9357SAndroid Build Coastguard Worker *so << endl;
384*f6dc9357SAndroid Build Coastguard Worker if (needHelp)
385*f6dc9357SAndroid Build Coastguard Worker *so << kHelpString;
386*f6dc9357SAndroid Build Coastguard Worker }
387*f6dc9357SAndroid Build Coastguard Worker
388*f6dc9357SAndroid Build Coastguard Worker
PrintStringRight(CStdOutStream & so,const char * s,unsigned size)389*f6dc9357SAndroid Build Coastguard Worker static void PrintStringRight(CStdOutStream &so, const char *s, unsigned size)
390*f6dc9357SAndroid Build Coastguard Worker {
391*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
392*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = len; i < size; i++)
393*f6dc9357SAndroid Build Coastguard Worker so << ' ';
394*f6dc9357SAndroid Build Coastguard Worker so << s;
395*f6dc9357SAndroid Build Coastguard Worker }
396*f6dc9357SAndroid Build Coastguard Worker
PrintUInt32(CStdOutStream & so,UInt32 val,unsigned size)397*f6dc9357SAndroid Build Coastguard Worker static void PrintUInt32(CStdOutStream &so, UInt32 val, unsigned size)
398*f6dc9357SAndroid Build Coastguard Worker {
399*f6dc9357SAndroid Build Coastguard Worker char s[16];
400*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(val, s);
401*f6dc9357SAndroid Build Coastguard Worker PrintStringRight(so, s, size);
402*f6dc9357SAndroid Build Coastguard Worker }
403*f6dc9357SAndroid Build Coastguard Worker
404*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
PrintNumber(CStdOutStream & so,UInt32 val,unsigned numDigits)405*f6dc9357SAndroid Build Coastguard Worker static void PrintNumber(CStdOutStream &so, UInt32 val, unsigned numDigits)
406*f6dc9357SAndroid Build Coastguard Worker {
407*f6dc9357SAndroid Build Coastguard Worker AString s;
408*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(val);
409*f6dc9357SAndroid Build Coastguard Worker while (s.Len() < numDigits)
410*f6dc9357SAndroid Build Coastguard Worker s.InsertAtFront('0');
411*f6dc9357SAndroid Build Coastguard Worker so << s;
412*f6dc9357SAndroid Build Coastguard Worker }
413*f6dc9357SAndroid Build Coastguard Worker #endif
414*f6dc9357SAndroid Build Coastguard Worker
PrintLibIndex(CStdOutStream & so,int libIndex)415*f6dc9357SAndroid Build Coastguard Worker static void PrintLibIndex(CStdOutStream &so, int libIndex)
416*f6dc9357SAndroid Build Coastguard Worker {
417*f6dc9357SAndroid Build Coastguard Worker if (libIndex >= 0)
418*f6dc9357SAndroid Build Coastguard Worker PrintUInt32(so, (UInt32)libIndex, 2);
419*f6dc9357SAndroid Build Coastguard Worker else
420*f6dc9357SAndroid Build Coastguard Worker so << " ";
421*f6dc9357SAndroid Build Coastguard Worker so << ' ';
422*f6dc9357SAndroid Build Coastguard Worker }
423*f6dc9357SAndroid Build Coastguard Worker
PrintString(CStdOutStream & so,const UString & s,unsigned size)424*f6dc9357SAndroid Build Coastguard Worker static void PrintString(CStdOutStream &so, const UString &s, unsigned size)
425*f6dc9357SAndroid Build Coastguard Worker {
426*f6dc9357SAndroid Build Coastguard Worker unsigned len = s.Len();
427*f6dc9357SAndroid Build Coastguard Worker so << s;
428*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = len; i < size; i++)
429*f6dc9357SAndroid Build Coastguard Worker so << ' ';
430*f6dc9357SAndroid Build Coastguard Worker }
431*f6dc9357SAndroid Build Coastguard Worker
PrintWarningsPaths(const CErrorPathCodes & pc,CStdOutStream & so)432*f6dc9357SAndroid Build Coastguard Worker static void PrintWarningsPaths(const CErrorPathCodes &pc, CStdOutStream &so)
433*f6dc9357SAndroid Build Coastguard Worker {
434*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, pc.Paths)
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker so.NormalizePrint_UString_Path(fs2us(pc.Paths[i]));
437*f6dc9357SAndroid Build Coastguard Worker so << " : ";
438*f6dc9357SAndroid Build Coastguard Worker so << NError::MyFormatMessage(pc.Codes[i]) << endl;
439*f6dc9357SAndroid Build Coastguard Worker }
440*f6dc9357SAndroid Build Coastguard Worker so << "----------------" << endl;
441*f6dc9357SAndroid Build Coastguard Worker }
442*f6dc9357SAndroid Build Coastguard Worker
WarningsCheck(HRESULT result,const CCallbackConsoleBase & callback,const CUpdateErrorInfo & errorInfo,CStdOutStream * so,CStdOutStream * se,bool showHeaders)443*f6dc9357SAndroid Build Coastguard Worker static int WarningsCheck(HRESULT result, const CCallbackConsoleBase &callback,
444*f6dc9357SAndroid Build Coastguard Worker const CUpdateErrorInfo &errorInfo,
445*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *so,
446*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *se,
447*f6dc9357SAndroid Build Coastguard Worker bool showHeaders)
448*f6dc9357SAndroid Build Coastguard Worker {
449*f6dc9357SAndroid Build Coastguard Worker int exitCode = NExitCode::kSuccess;
450*f6dc9357SAndroid Build Coastguard Worker
451*f6dc9357SAndroid Build Coastguard Worker if (callback.ScanErrors.Paths.Size() != 0)
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker if (se)
454*f6dc9357SAndroid Build Coastguard Worker {
455*f6dc9357SAndroid Build Coastguard Worker *se << endl;
456*f6dc9357SAndroid Build Coastguard Worker *se << "Scan WARNINGS for files and folders:" << endl << endl;
457*f6dc9357SAndroid Build Coastguard Worker PrintWarningsPaths(callback.ScanErrors, *se);
458*f6dc9357SAndroid Build Coastguard Worker *se << "Scan WARNINGS: " << callback.ScanErrors.Paths.Size();
459*f6dc9357SAndroid Build Coastguard Worker *se << endl;
460*f6dc9357SAndroid Build Coastguard Worker }
461*f6dc9357SAndroid Build Coastguard Worker exitCode = NExitCode::kWarning;
462*f6dc9357SAndroid Build Coastguard Worker }
463*f6dc9357SAndroid Build Coastguard Worker
464*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK || errorInfo.ThereIsError())
465*f6dc9357SAndroid Build Coastguard Worker {
466*f6dc9357SAndroid Build Coastguard Worker if (se)
467*f6dc9357SAndroid Build Coastguard Worker {
468*f6dc9357SAndroid Build Coastguard Worker UString message;
469*f6dc9357SAndroid Build Coastguard Worker if (!errorInfo.Message.IsEmpty())
470*f6dc9357SAndroid Build Coastguard Worker {
471*f6dc9357SAndroid Build Coastguard Worker message += errorInfo.Message.Ptr();
472*f6dc9357SAndroid Build Coastguard Worker message.Add_LF();
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker {
475*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, errorInfo.FileNames)
476*f6dc9357SAndroid Build Coastguard Worker {
477*f6dc9357SAndroid Build Coastguard Worker message += fs2us(errorInfo.FileNames[i]);
478*f6dc9357SAndroid Build Coastguard Worker message.Add_LF();
479*f6dc9357SAndroid Build Coastguard Worker }
480*f6dc9357SAndroid Build Coastguard Worker }
481*f6dc9357SAndroid Build Coastguard Worker if (errorInfo.SystemError != 0)
482*f6dc9357SAndroid Build Coastguard Worker {
483*f6dc9357SAndroid Build Coastguard Worker message += NError::MyFormatMessage(errorInfo.SystemError);
484*f6dc9357SAndroid Build Coastguard Worker message.Add_LF();
485*f6dc9357SAndroid Build Coastguard Worker }
486*f6dc9357SAndroid Build Coastguard Worker if (!message.IsEmpty())
487*f6dc9357SAndroid Build Coastguard Worker *se << L"\nError:\n" << message;
488*f6dc9357SAndroid Build Coastguard Worker }
489*f6dc9357SAndroid Build Coastguard Worker
490*f6dc9357SAndroid Build Coastguard Worker // we will work with (result) later
491*f6dc9357SAndroid Build Coastguard Worker // throw CSystemException(result);
492*f6dc9357SAndroid Build Coastguard Worker return NExitCode::kFatalError;
493*f6dc9357SAndroid Build Coastguard Worker }
494*f6dc9357SAndroid Build Coastguard Worker
495*f6dc9357SAndroid Build Coastguard Worker unsigned numErrors = callback.FailedFiles.Paths.Size();
496*f6dc9357SAndroid Build Coastguard Worker if (numErrors == 0)
497*f6dc9357SAndroid Build Coastguard Worker {
498*f6dc9357SAndroid Build Coastguard Worker if (showHeaders)
499*f6dc9357SAndroid Build Coastguard Worker if (callback.ScanErrors.Paths.Size() == 0)
500*f6dc9357SAndroid Build Coastguard Worker if (so)
501*f6dc9357SAndroid Build Coastguard Worker {
502*f6dc9357SAndroid Build Coastguard Worker if (se)
503*f6dc9357SAndroid Build Coastguard Worker se->Flush();
504*f6dc9357SAndroid Build Coastguard Worker *so << kEverythingIsOk << endl;
505*f6dc9357SAndroid Build Coastguard Worker }
506*f6dc9357SAndroid Build Coastguard Worker }
507*f6dc9357SAndroid Build Coastguard Worker else
508*f6dc9357SAndroid Build Coastguard Worker {
509*f6dc9357SAndroid Build Coastguard Worker if (se)
510*f6dc9357SAndroid Build Coastguard Worker {
511*f6dc9357SAndroid Build Coastguard Worker *se << endl;
512*f6dc9357SAndroid Build Coastguard Worker *se << "WARNINGS for files:" << endl << endl;
513*f6dc9357SAndroid Build Coastguard Worker PrintWarningsPaths(callback.FailedFiles, *se);
514*f6dc9357SAndroid Build Coastguard Worker *se << "WARNING: Cannot open " << numErrors << " file";
515*f6dc9357SAndroid Build Coastguard Worker if (numErrors > 1)
516*f6dc9357SAndroid Build Coastguard Worker *se << 's';
517*f6dc9357SAndroid Build Coastguard Worker *se << endl;
518*f6dc9357SAndroid Build Coastguard Worker }
519*f6dc9357SAndroid Build Coastguard Worker exitCode = NExitCode::kWarning;
520*f6dc9357SAndroid Build Coastguard Worker }
521*f6dc9357SAndroid Build Coastguard Worker
522*f6dc9357SAndroid Build Coastguard Worker return exitCode;
523*f6dc9357SAndroid Build Coastguard Worker }
524*f6dc9357SAndroid Build Coastguard Worker
ThrowException_if_Error(HRESULT res)525*f6dc9357SAndroid Build Coastguard Worker static void ThrowException_if_Error(HRESULT res)
526*f6dc9357SAndroid Build Coastguard Worker {
527*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
528*f6dc9357SAndroid Build Coastguard Worker throw CSystemException(res);
529*f6dc9357SAndroid Build Coastguard Worker }
530*f6dc9357SAndroid Build Coastguard Worker
PrintNum(UInt64 val,unsigned numDigits,char c=' ')531*f6dc9357SAndroid Build Coastguard Worker static void PrintNum(UInt64 val, unsigned numDigits, char c = ' ')
532*f6dc9357SAndroid Build Coastguard Worker {
533*f6dc9357SAndroid Build Coastguard Worker char temp[64];
534*f6dc9357SAndroid Build Coastguard Worker char *p = temp + 32;
535*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(val, p);
536*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(p);
537*f6dc9357SAndroid Build Coastguard Worker for (; len < numDigits; len++)
538*f6dc9357SAndroid Build Coastguard Worker *--p = c;
539*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << p;
540*f6dc9357SAndroid Build Coastguard Worker }
541*f6dc9357SAndroid Build Coastguard Worker
542*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
543*f6dc9357SAndroid Build Coastguard Worker
PrintTime(const char * s,UInt64 val,UInt64 total)544*f6dc9357SAndroid Build Coastguard Worker static void PrintTime(const char *s, UInt64 val, UInt64 total)
545*f6dc9357SAndroid Build Coastguard Worker {
546*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << endl << s << " Time =";
547*f6dc9357SAndroid Build Coastguard Worker const UInt32 kFreq = 10000000;
548*f6dc9357SAndroid Build Coastguard Worker UInt64 sec = val / kFreq;
549*f6dc9357SAndroid Build Coastguard Worker PrintNum(sec, 6);
550*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << '.';
551*f6dc9357SAndroid Build Coastguard Worker UInt32 ms = (UInt32)(val - (sec * kFreq)) / (kFreq / 1000);
552*f6dc9357SAndroid Build Coastguard Worker PrintNum(ms, 3, '0');
553*f6dc9357SAndroid Build Coastguard Worker
554*f6dc9357SAndroid Build Coastguard Worker while (val > ((UInt64)1 << 56))
555*f6dc9357SAndroid Build Coastguard Worker {
556*f6dc9357SAndroid Build Coastguard Worker val >>= 1;
557*f6dc9357SAndroid Build Coastguard Worker total >>= 1;
558*f6dc9357SAndroid Build Coastguard Worker }
559*f6dc9357SAndroid Build Coastguard Worker
560*f6dc9357SAndroid Build Coastguard Worker UInt64 percent = 0;
561*f6dc9357SAndroid Build Coastguard Worker if (total != 0)
562*f6dc9357SAndroid Build Coastguard Worker percent = val * 100 / total;
563*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " =";
564*f6dc9357SAndroid Build Coastguard Worker PrintNum(percent, 5);
565*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << '%';
566*f6dc9357SAndroid Build Coastguard Worker }
567*f6dc9357SAndroid Build Coastguard Worker
568*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
569*f6dc9357SAndroid Build Coastguard Worker
570*f6dc9357SAndroid Build Coastguard Worker #define SHIFT_SIZE_VALUE(x, num) (((x) + (1 << (num)) - 1) >> (num))
571*f6dc9357SAndroid Build Coastguard Worker
PrintMemUsage(const char * s,UInt64 val)572*f6dc9357SAndroid Build Coastguard Worker static void PrintMemUsage(const char *s, UInt64 val)
573*f6dc9357SAndroid Build Coastguard Worker {
574*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " " << s << " Memory =";
575*f6dc9357SAndroid Build Coastguard Worker PrintNum(SHIFT_SIZE_VALUE(val, 20), 7);
576*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " MB";
577*f6dc9357SAndroid Build Coastguard Worker /*
578*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " =";
579*f6dc9357SAndroid Build Coastguard Worker PrintNum(SHIFT_SIZE_VALUE(val, 10), 9);
580*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " KB";
581*f6dc9357SAndroid Build Coastguard Worker */
582*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
583*f6dc9357SAndroid Build Coastguard Worker AString lp;
584*f6dc9357SAndroid Build Coastguard Worker Add_LargePages_String(lp);
585*f6dc9357SAndroid Build Coastguard Worker if (!lp.IsEmpty())
586*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << lp;
587*f6dc9357SAndroid Build Coastguard Worker #endif
588*f6dc9357SAndroid Build Coastguard Worker }
589*f6dc9357SAndroid Build Coastguard Worker
590*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
591*f6dc9357SAndroid Build Coastguard Worker typedef BOOL (WINAPI *Func_GetProcessMemoryInfo)(HANDLE Process,
592*f6dc9357SAndroid Build Coastguard Worker PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb);
593*f6dc9357SAndroid Build Coastguard Worker typedef BOOL (WINAPI *Func_QueryProcessCycleTime)(HANDLE Process, PULONG64 CycleTime);
594*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
595*f6dc9357SAndroid Build Coastguard Worker
596*f6dc9357SAndroid Build Coastguard Worker #endif
597*f6dc9357SAndroid Build Coastguard Worker
GetTime64(const FILETIME & t)598*f6dc9357SAndroid Build Coastguard Worker static inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; }
599*f6dc9357SAndroid Build Coastguard Worker
PrintStat()600*f6dc9357SAndroid Build Coastguard Worker static void PrintStat()
601*f6dc9357SAndroid Build Coastguard Worker {
602*f6dc9357SAndroid Build Coastguard Worker FILETIME creationTimeFT, exitTimeFT, kernelTimeFT, userTimeFT;
603*f6dc9357SAndroid Build Coastguard Worker if (!
604*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
605*f6dc9357SAndroid Build Coastguard Worker ::GetThreadTimes(::GetCurrentThread()
606*f6dc9357SAndroid Build Coastguard Worker #else
607*f6dc9357SAndroid Build Coastguard Worker // NT 3.5
608*f6dc9357SAndroid Build Coastguard Worker ::GetProcessTimes(::GetCurrentProcess()
609*f6dc9357SAndroid Build Coastguard Worker #endif
610*f6dc9357SAndroid Build Coastguard Worker , &creationTimeFT, &exitTimeFT, &kernelTimeFT, &userTimeFT))
611*f6dc9357SAndroid Build Coastguard Worker return;
612*f6dc9357SAndroid Build Coastguard Worker FILETIME curTimeFT;
613*f6dc9357SAndroid Build Coastguard Worker NTime::GetCurUtc_FiTime(curTimeFT);
614*f6dc9357SAndroid Build Coastguard Worker
615*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
616*f6dc9357SAndroid Build Coastguard Worker
617*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
618*f6dc9357SAndroid Build Coastguard Worker
619*f6dc9357SAndroid Build Coastguard Worker PROCESS_MEMORY_COUNTERS m;
620*f6dc9357SAndroid Build Coastguard Worker memset(&m, 0, sizeof(m));
621*f6dc9357SAndroid Build Coastguard Worker BOOL memDefined = FALSE;
622*f6dc9357SAndroid Build Coastguard Worker BOOL cycleDefined = FALSE;
623*f6dc9357SAndroid Build Coastguard Worker ULONG64 cycleTime = 0;
624*f6dc9357SAndroid Build Coastguard Worker {
625*f6dc9357SAndroid Build Coastguard Worker /* NT 4.0: GetProcessMemoryInfo() in Psapi.dll
626*f6dc9357SAndroid Build Coastguard Worker Win7: new function K32GetProcessMemoryInfo() in kernel32.dll
627*f6dc9357SAndroid Build Coastguard Worker It's faster to call kernel32.dll code than Psapi.dll code
628*f6dc9357SAndroid Build Coastguard Worker GetProcessMemoryInfo() requires Psapi.lib
629*f6dc9357SAndroid Build Coastguard Worker Psapi.lib in SDK7+ can link to K32GetProcessMemoryInfo in kernel32.dll
630*f6dc9357SAndroid Build Coastguard Worker The program with K32GetProcessMemoryInfo will not work on systems before Win7
631*f6dc9357SAndroid Build Coastguard Worker // memDefined = GetProcessMemoryInfo(GetCurrentProcess(), &m, sizeof(m));
632*f6dc9357SAndroid Build Coastguard Worker */
633*f6dc9357SAndroid Build Coastguard Worker const HMODULE kern = ::GetModuleHandleW(L"kernel32.dll");
634*f6dc9357SAndroid Build Coastguard Worker Func_GetProcessMemoryInfo
635*f6dc9357SAndroid Build Coastguard Worker my_GetProcessMemoryInfo = Z7_GET_PROC_ADDRESS(
636*f6dc9357SAndroid Build Coastguard Worker Func_GetProcessMemoryInfo, kern,
637*f6dc9357SAndroid Build Coastguard Worker "K32GetProcessMemoryInfo");
638*f6dc9357SAndroid Build Coastguard Worker if (!my_GetProcessMemoryInfo)
639*f6dc9357SAndroid Build Coastguard Worker {
640*f6dc9357SAndroid Build Coastguard Worker const HMODULE lib = LoadLibraryW(L"Psapi.dll");
641*f6dc9357SAndroid Build Coastguard Worker if (lib)
642*f6dc9357SAndroid Build Coastguard Worker my_GetProcessMemoryInfo = Z7_GET_PROC_ADDRESS(
643*f6dc9357SAndroid Build Coastguard Worker Func_GetProcessMemoryInfo, lib,
644*f6dc9357SAndroid Build Coastguard Worker "GetProcessMemoryInfo");
645*f6dc9357SAndroid Build Coastguard Worker }
646*f6dc9357SAndroid Build Coastguard Worker if (my_GetProcessMemoryInfo)
647*f6dc9357SAndroid Build Coastguard Worker memDefined = my_GetProcessMemoryInfo(GetCurrentProcess(), &m, sizeof(m));
648*f6dc9357SAndroid Build Coastguard Worker // FreeLibrary(lib);
649*f6dc9357SAndroid Build Coastguard Worker const
650*f6dc9357SAndroid Build Coastguard Worker Func_QueryProcessCycleTime
651*f6dc9357SAndroid Build Coastguard Worker my_QueryProcessCycleTime = Z7_GET_PROC_ADDRESS(
652*f6dc9357SAndroid Build Coastguard Worker Func_QueryProcessCycleTime, kern,
653*f6dc9357SAndroid Build Coastguard Worker "QueryProcessCycleTime");
654*f6dc9357SAndroid Build Coastguard Worker if (my_QueryProcessCycleTime)
655*f6dc9357SAndroid Build Coastguard Worker cycleDefined = my_QueryProcessCycleTime(GetCurrentProcess(), &cycleTime);
656*f6dc9357SAndroid Build Coastguard Worker }
657*f6dc9357SAndroid Build Coastguard Worker
658*f6dc9357SAndroid Build Coastguard Worker #endif
659*f6dc9357SAndroid Build Coastguard Worker
660*f6dc9357SAndroid Build Coastguard Worker UInt64 curTime = GetTime64(curTimeFT);
661*f6dc9357SAndroid Build Coastguard Worker UInt64 creationTime = GetTime64(creationTimeFT);
662*f6dc9357SAndroid Build Coastguard Worker UInt64 kernelTime = GetTime64(kernelTimeFT);
663*f6dc9357SAndroid Build Coastguard Worker UInt64 userTime = GetTime64(userTimeFT);
664*f6dc9357SAndroid Build Coastguard Worker
665*f6dc9357SAndroid Build Coastguard Worker UInt64 totalTime = curTime - creationTime;
666*f6dc9357SAndroid Build Coastguard Worker
667*f6dc9357SAndroid Build Coastguard Worker PrintTime("Kernel ", kernelTime, totalTime);
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker const UInt64 processTime = kernelTime + userTime;
670*f6dc9357SAndroid Build Coastguard Worker
671*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
672*f6dc9357SAndroid Build Coastguard Worker if (cycleDefined)
673*f6dc9357SAndroid Build Coastguard Worker {
674*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " Cnt:";
675*f6dc9357SAndroid Build Coastguard Worker PrintNum(cycleTime / 1000000, 15);
676*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " MCycles";
677*f6dc9357SAndroid Build Coastguard Worker }
678*f6dc9357SAndroid Build Coastguard Worker #endif
679*f6dc9357SAndroid Build Coastguard Worker
680*f6dc9357SAndroid Build Coastguard Worker PrintTime("User ", userTime, totalTime);
681*f6dc9357SAndroid Build Coastguard Worker
682*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
683*f6dc9357SAndroid Build Coastguard Worker if (cycleDefined)
684*f6dc9357SAndroid Build Coastguard Worker {
685*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " Freq (cnt/ptime):";
686*f6dc9357SAndroid Build Coastguard Worker UInt64 us = processTime / 10;
687*f6dc9357SAndroid Build Coastguard Worker if (us == 0)
688*f6dc9357SAndroid Build Coastguard Worker us = 1;
689*f6dc9357SAndroid Build Coastguard Worker PrintNum(cycleTime / us, 6);
690*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " MHz";
691*f6dc9357SAndroid Build Coastguard Worker }
692*f6dc9357SAndroid Build Coastguard Worker #endif
693*f6dc9357SAndroid Build Coastguard Worker
694*f6dc9357SAndroid Build Coastguard Worker PrintTime("Process", processTime, totalTime);
695*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
696*f6dc9357SAndroid Build Coastguard Worker if (memDefined) PrintMemUsage("Virtual ", m.PeakPagefileUsage);
697*f6dc9357SAndroid Build Coastguard Worker #endif
698*f6dc9357SAndroid Build Coastguard Worker
699*f6dc9357SAndroid Build Coastguard Worker PrintTime("Global ", totalTime, totalTime);
700*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
701*f6dc9357SAndroid Build Coastguard Worker if (memDefined) PrintMemUsage("Physical", m.PeakWorkingSetSize);
702*f6dc9357SAndroid Build Coastguard Worker #endif
703*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << endl;
704*f6dc9357SAndroid Build Coastguard Worker }
705*f6dc9357SAndroid Build Coastguard Worker
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker #else // ! _WIN32
708*f6dc9357SAndroid Build Coastguard Worker
Get_timeofday_us()709*f6dc9357SAndroid Build Coastguard Worker static UInt64 Get_timeofday_us()
710*f6dc9357SAndroid Build Coastguard Worker {
711*f6dc9357SAndroid Build Coastguard Worker struct timeval now;
712*f6dc9357SAndroid Build Coastguard Worker if (gettimeofday(&now, NULL) == 0)
713*f6dc9357SAndroid Build Coastguard Worker return (UInt64)now.tv_sec * 1000000 + (UInt64)now.tv_usec;
714*f6dc9357SAndroid Build Coastguard Worker return 0;
715*f6dc9357SAndroid Build Coastguard Worker }
716*f6dc9357SAndroid Build Coastguard Worker
PrintTime(const char * s,UInt64 val,UInt64 total_us,UInt64 kFreq)717*f6dc9357SAndroid Build Coastguard Worker static void PrintTime(const char *s, UInt64 val, UInt64 total_us, UInt64 kFreq)
718*f6dc9357SAndroid Build Coastguard Worker {
719*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << endl << s << " Time =";
720*f6dc9357SAndroid Build Coastguard Worker
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker UInt64 sec, ms;
723*f6dc9357SAndroid Build Coastguard Worker
724*f6dc9357SAndroid Build Coastguard Worker if (kFreq == 0)
725*f6dc9357SAndroid Build Coastguard Worker {
726*f6dc9357SAndroid Build Coastguard Worker sec = val / 1000000;
727*f6dc9357SAndroid Build Coastguard Worker ms = val % 1000000 / 1000;
728*f6dc9357SAndroid Build Coastguard Worker }
729*f6dc9357SAndroid Build Coastguard Worker else
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker sec = val / kFreq;
732*f6dc9357SAndroid Build Coastguard Worker ms = (UInt32)((val - (sec * kFreq)) * 1000 / kFreq);
733*f6dc9357SAndroid Build Coastguard Worker }
734*f6dc9357SAndroid Build Coastguard Worker
735*f6dc9357SAndroid Build Coastguard Worker PrintNum(sec, 6);
736*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << '.';
737*f6dc9357SAndroid Build Coastguard Worker PrintNum(ms, 3, '0');
738*f6dc9357SAndroid Build Coastguard Worker }
739*f6dc9357SAndroid Build Coastguard Worker
740*f6dc9357SAndroid Build Coastguard Worker if (total_us == 0)
741*f6dc9357SAndroid Build Coastguard Worker return;
742*f6dc9357SAndroid Build Coastguard Worker
743*f6dc9357SAndroid Build Coastguard Worker UInt64 percent = 0;
744*f6dc9357SAndroid Build Coastguard Worker if (kFreq == 0)
745*f6dc9357SAndroid Build Coastguard Worker percent = val * 100 / total_us;
746*f6dc9357SAndroid Build Coastguard Worker else
747*f6dc9357SAndroid Build Coastguard Worker {
748*f6dc9357SAndroid Build Coastguard Worker const UInt64 kMaxVal = (UInt64)(Int64)-1;
749*f6dc9357SAndroid Build Coastguard Worker UInt32 m = 100000000;
750*f6dc9357SAndroid Build Coastguard Worker for (;;)
751*f6dc9357SAndroid Build Coastguard Worker {
752*f6dc9357SAndroid Build Coastguard Worker if (m == 0 || kFreq == 0)
753*f6dc9357SAndroid Build Coastguard Worker break;
754*f6dc9357SAndroid Build Coastguard Worker if (kMaxVal / m > val &&
755*f6dc9357SAndroid Build Coastguard Worker kMaxVal / kFreq > total_us)
756*f6dc9357SAndroid Build Coastguard Worker break;
757*f6dc9357SAndroid Build Coastguard Worker if (val > m)
758*f6dc9357SAndroid Build Coastguard Worker val >>= 1;
759*f6dc9357SAndroid Build Coastguard Worker else
760*f6dc9357SAndroid Build Coastguard Worker m >>= 1;
761*f6dc9357SAndroid Build Coastguard Worker if (kFreq > total_us)
762*f6dc9357SAndroid Build Coastguard Worker kFreq >>= 1;
763*f6dc9357SAndroid Build Coastguard Worker else
764*f6dc9357SAndroid Build Coastguard Worker total_us >>= 1;
765*f6dc9357SAndroid Build Coastguard Worker }
766*f6dc9357SAndroid Build Coastguard Worker const UInt64 total = kFreq * total_us;
767*f6dc9357SAndroid Build Coastguard Worker if (total != 0)
768*f6dc9357SAndroid Build Coastguard Worker percent = val * m / total;
769*f6dc9357SAndroid Build Coastguard Worker }
770*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << " =";
771*f6dc9357SAndroid Build Coastguard Worker PrintNum(percent, 5);
772*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << '%';
773*f6dc9357SAndroid Build Coastguard Worker }
774*f6dc9357SAndroid Build Coastguard Worker
PrintStat(const UInt64 startTime)775*f6dc9357SAndroid Build Coastguard Worker static void PrintStat(const UInt64 startTime)
776*f6dc9357SAndroid Build Coastguard Worker {
777*f6dc9357SAndroid Build Coastguard Worker tms t;
778*f6dc9357SAndroid Build Coastguard Worker /* clock_t res = */ times(&t);
779*f6dc9357SAndroid Build Coastguard Worker const UInt64 totalTime = Get_timeofday_us() - startTime;
780*f6dc9357SAndroid Build Coastguard Worker const UInt64 kFreq = (UInt64)sysconf(_SC_CLK_TCK);
781*f6dc9357SAndroid Build Coastguard Worker PrintTime("Kernel ", (UInt64)t.tms_stime, totalTime, kFreq);
782*f6dc9357SAndroid Build Coastguard Worker PrintTime("User ", (UInt64)t.tms_utime, totalTime, kFreq);
783*f6dc9357SAndroid Build Coastguard Worker PrintTime("Process", (UInt64)t.tms_utime + (UInt64)t.tms_stime, totalTime, kFreq);
784*f6dc9357SAndroid Build Coastguard Worker PrintTime("Global ", totalTime, totalTime, 0);
785*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << endl;
786*f6dc9357SAndroid Build Coastguard Worker }
787*f6dc9357SAndroid Build Coastguard Worker
788*f6dc9357SAndroid Build Coastguard Worker #endif // ! _WIN32
789*f6dc9357SAndroid Build Coastguard Worker
790*f6dc9357SAndroid Build Coastguard Worker
791*f6dc9357SAndroid Build Coastguard Worker
792*f6dc9357SAndroid Build Coastguard Worker
793*f6dc9357SAndroid Build Coastguard Worker
PrintHexId(CStdOutStream & so,UInt64 id)794*f6dc9357SAndroid Build Coastguard Worker static void PrintHexId(CStdOutStream &so, UInt64 id)
795*f6dc9357SAndroid Build Coastguard Worker {
796*f6dc9357SAndroid Build Coastguard Worker char s[32];
797*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToHex(id, s);
798*f6dc9357SAndroid Build Coastguard Worker PrintStringRight(so, s, 8);
799*f6dc9357SAndroid Build Coastguard Worker }
800*f6dc9357SAndroid Build Coastguard Worker
801*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
802*f6dc9357SAndroid Build Coastguard Worker void Set_ModuleDirPrefix_From_ProgArg0(const char *s);
803*f6dc9357SAndroid Build Coastguard Worker #endif
804*f6dc9357SAndroid Build Coastguard Worker
805*f6dc9357SAndroid Build Coastguard Worker int Main2(
806*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
807*f6dc9357SAndroid Build Coastguard Worker int numArgs, char *args[]
808*f6dc9357SAndroid Build Coastguard Worker #endif
809*f6dc9357SAndroid Build Coastguard Worker );
Main2(int numArgs,char * args[])810*f6dc9357SAndroid Build Coastguard Worker int Main2(
811*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
812*f6dc9357SAndroid Build Coastguard Worker int numArgs, char *args[]
813*f6dc9357SAndroid Build Coastguard Worker #endif
814*f6dc9357SAndroid Build Coastguard Worker )
815*f6dc9357SAndroid Build Coastguard Worker {
816*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_SIZEOF_POINTER)
817*f6dc9357SAndroid Build Coastguard Worker { unsigned k = sizeof(void *); if (k != MY_CPU_SIZEOF_POINTER) throw "incorrect MY_CPU_PTR_SIZE"; }
818*f6dc9357SAndroid Build Coastguard Worker #endif
819*f6dc9357SAndroid Build Coastguard Worker
820*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
821*f6dc9357SAndroid Build Coastguard Worker SetFileApisToOEM();
822*f6dc9357SAndroid Build Coastguard Worker #endif
823*f6dc9357SAndroid Build Coastguard Worker
824*f6dc9357SAndroid Build Coastguard Worker #ifdef ENV_HAVE_LOCALE
825*f6dc9357SAndroid Build Coastguard Worker // printf("\nBefore SetLocale() : %s\n", IsNativeUtf8() ? "NATIVE UTF-8" : "IS NOT NATIVE UTF-8");
826*f6dc9357SAndroid Build Coastguard Worker MY_SetLocale();
827*f6dc9357SAndroid Build Coastguard Worker // printf("\nAfter SetLocale() : %s\n", IsNativeUtf8() ? "NATIVE UTF-8" : "IS NOT NATIVE UTF-8");
828*f6dc9357SAndroid Build Coastguard Worker #endif
829*f6dc9357SAndroid Build Coastguard Worker
830*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
831*f6dc9357SAndroid Build Coastguard Worker const UInt64 startTime = Get_timeofday_us();
832*f6dc9357SAndroid Build Coastguard Worker #endif
833*f6dc9357SAndroid Build Coastguard Worker
834*f6dc9357SAndroid Build Coastguard Worker /*
835*f6dc9357SAndroid Build Coastguard Worker {
836*f6dc9357SAndroid Build Coastguard Worker g_StdOut << "DWORD:" << (unsigned)sizeof(DWORD);
837*f6dc9357SAndroid Build Coastguard Worker g_StdOut << " LONG:" << (unsigned)sizeof(LONG);
838*f6dc9357SAndroid Build Coastguard Worker g_StdOut << " long:" << (unsigned)sizeof(long);
839*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN64
840*f6dc9357SAndroid Build Coastguard Worker // g_StdOut << " long long:" << (unsigned)sizeof(long long);
841*f6dc9357SAndroid Build Coastguard Worker #endif
842*f6dc9357SAndroid Build Coastguard Worker g_StdOut << " int:" << (unsigned)sizeof(int);
843*f6dc9357SAndroid Build Coastguard Worker g_StdOut << " void*:" << (unsigned)sizeof(void *);
844*f6dc9357SAndroid Build Coastguard Worker g_StdOut << endl;
845*f6dc9357SAndroid Build Coastguard Worker }
846*f6dc9357SAndroid Build Coastguard Worker */
847*f6dc9357SAndroid Build Coastguard Worker
848*f6dc9357SAndroid Build Coastguard Worker UStringVector commandStrings;
849*f6dc9357SAndroid Build Coastguard Worker
850*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
851*f6dc9357SAndroid Build Coastguard Worker NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
852*f6dc9357SAndroid Build Coastguard Worker #else
853*f6dc9357SAndroid Build Coastguard Worker {
854*f6dc9357SAndroid Build Coastguard Worker if (numArgs > 0)
855*f6dc9357SAndroid Build Coastguard Worker Set_ModuleDirPrefix_From_ProgArg0(args[0]);
856*f6dc9357SAndroid Build Coastguard Worker
857*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < numArgs; i++)
858*f6dc9357SAndroid Build Coastguard Worker {
859*f6dc9357SAndroid Build Coastguard Worker AString a (args[i]);
860*f6dc9357SAndroid Build Coastguard Worker #if 0
861*f6dc9357SAndroid Build Coastguard Worker printf("\n%d %s :", i, a.Ptr());
862*f6dc9357SAndroid Build Coastguard Worker for (unsigned k = 0; k < a.Len(); k++)
863*f6dc9357SAndroid Build Coastguard Worker printf(" %2x", (unsigned)(Byte)a[k]);
864*f6dc9357SAndroid Build Coastguard Worker #endif
865*f6dc9357SAndroid Build Coastguard Worker const UString s = MultiByteToUnicodeString(a);
866*f6dc9357SAndroid Build Coastguard Worker commandStrings.Add(s);
867*f6dc9357SAndroid Build Coastguard Worker }
868*f6dc9357SAndroid Build Coastguard Worker // printf("\n");
869*f6dc9357SAndroid Build Coastguard Worker }
870*f6dc9357SAndroid Build Coastguard Worker
871*f6dc9357SAndroid Build Coastguard Worker #endif
872*f6dc9357SAndroid Build Coastguard Worker
873*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
874*f6dc9357SAndroid Build Coastguard Worker if (commandStrings.Size() > 0)
875*f6dc9357SAndroid Build Coastguard Worker commandStrings.Delete(0);
876*f6dc9357SAndroid Build Coastguard Worker #endif
877*f6dc9357SAndroid Build Coastguard Worker
878*f6dc9357SAndroid Build Coastguard Worker if (commandStrings.Size() == 0)
879*f6dc9357SAndroid Build Coastguard Worker {
880*f6dc9357SAndroid Build Coastguard Worker ShowCopyrightAndHelp(g_StdStream, true);
881*f6dc9357SAndroid Build Coastguard Worker return 0;
882*f6dc9357SAndroid Build Coastguard Worker }
883*f6dc9357SAndroid Build Coastguard Worker
884*f6dc9357SAndroid Build Coastguard Worker CArcCmdLineOptions options;
885*f6dc9357SAndroid Build Coastguard Worker
886*f6dc9357SAndroid Build Coastguard Worker CArcCmdLineParser parser;
887*f6dc9357SAndroid Build Coastguard Worker
888*f6dc9357SAndroid Build Coastguard Worker parser.Parse1(commandStrings, options);
889*f6dc9357SAndroid Build Coastguard Worker
890*f6dc9357SAndroid Build Coastguard Worker g_StdOut.IsTerminalMode = options.IsStdOutTerminal;
891*f6dc9357SAndroid Build Coastguard Worker g_StdErr.IsTerminalMode = options.IsStdErrTerminal;
892*f6dc9357SAndroid Build Coastguard Worker
893*f6dc9357SAndroid Build Coastguard Worker if (options.Number_for_Out != k_OutStream_stdout)
894*f6dc9357SAndroid Build Coastguard Worker g_StdStream = (options.Number_for_Out == k_OutStream_stderr ? &g_StdErr : NULL);
895*f6dc9357SAndroid Build Coastguard Worker
896*f6dc9357SAndroid Build Coastguard Worker if (options.Number_for_Errors != k_OutStream_stderr)
897*f6dc9357SAndroid Build Coastguard Worker g_ErrStream = (options.Number_for_Errors == k_OutStream_stdout ? &g_StdOut : NULL);
898*f6dc9357SAndroid Build Coastguard Worker
899*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *percentsStream = NULL;
900*f6dc9357SAndroid Build Coastguard Worker if (options.Number_for_Percents != k_OutStream_disabled)
901*f6dc9357SAndroid Build Coastguard Worker percentsStream = (options.Number_for_Percents == k_OutStream_stderr) ? &g_StdErr : &g_StdOut;
902*f6dc9357SAndroid Build Coastguard Worker
903*f6dc9357SAndroid Build Coastguard Worker if (options.HelpMode)
904*f6dc9357SAndroid Build Coastguard Worker {
905*f6dc9357SAndroid Build Coastguard Worker ShowCopyrightAndHelp(g_StdStream, true);
906*f6dc9357SAndroid Build Coastguard Worker return 0;
907*f6dc9357SAndroid Build Coastguard Worker }
908*f6dc9357SAndroid Build Coastguard Worker
909*f6dc9357SAndroid Build Coastguard Worker if (options.EnableHeaders)
910*f6dc9357SAndroid Build Coastguard Worker {
911*f6dc9357SAndroid Build Coastguard Worker ShowCopyrightAndHelp(g_StdStream, false);
912*f6dc9357SAndroid Build Coastguard Worker if (!parser.Parse1Log.IsEmpty())
913*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << parser.Parse1Log;
914*f6dc9357SAndroid Build Coastguard Worker }
915*f6dc9357SAndroid Build Coastguard Worker
916*f6dc9357SAndroid Build Coastguard Worker parser.Parse2(options);
917*f6dc9357SAndroid Build Coastguard Worker
918*f6dc9357SAndroid Build Coastguard Worker {
919*f6dc9357SAndroid Build Coastguard Worker int cp = options.ConsoleCodePage;
920*f6dc9357SAndroid Build Coastguard Worker
921*f6dc9357SAndroid Build Coastguard Worker int stdout_cp = cp;
922*f6dc9357SAndroid Build Coastguard Worker int stderr_cp = cp;
923*f6dc9357SAndroid Build Coastguard Worker int stdin_cp = cp;
924*f6dc9357SAndroid Build Coastguard Worker
925*f6dc9357SAndroid Build Coastguard Worker /*
926*f6dc9357SAndroid Build Coastguard Worker // these cases are complicated.
927*f6dc9357SAndroid Build Coastguard Worker // maybe we must use CRT functions instead of console WIN32.
928*f6dc9357SAndroid Build Coastguard Worker // different Windows/CRT versions also can work different ways.
929*f6dc9357SAndroid Build Coastguard Worker // so the following code was not enabled:
930*f6dc9357SAndroid Build Coastguard Worker if (cp == -1)
931*f6dc9357SAndroid Build Coastguard Worker {
932*f6dc9357SAndroid Build Coastguard Worker // we set CodePage only if stream is attached to terminal
933*f6dc9357SAndroid Build Coastguard Worker // maybe we should set CodePage even if is not terminal?
934*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
935*f6dc9357SAndroid Build Coastguard Worker {
936*f6dc9357SAndroid Build Coastguard Worker UINT ccp = GetConsoleOutputCP();
937*f6dc9357SAndroid Build Coastguard Worker if (ccp != 0)
938*f6dc9357SAndroid Build Coastguard Worker {
939*f6dc9357SAndroid Build Coastguard Worker if (options.IsStdOutTerminal) stdout_cp = ccp;
940*f6dc9357SAndroid Build Coastguard Worker if (options.IsStdErrTerminal) stderr_cp = ccp;
941*f6dc9357SAndroid Build Coastguard Worker }
942*f6dc9357SAndroid Build Coastguard Worker }
943*f6dc9357SAndroid Build Coastguard Worker if (options.IsInTerminal)
944*f6dc9357SAndroid Build Coastguard Worker {
945*f6dc9357SAndroid Build Coastguard Worker UINT ccp = GetConsoleCP();
946*f6dc9357SAndroid Build Coastguard Worker if (ccp != 0) stdin_cp = ccp;
947*f6dc9357SAndroid Build Coastguard Worker }
948*f6dc9357SAndroid Build Coastguard Worker #endif
949*f6dc9357SAndroid Build Coastguard Worker }
950*f6dc9357SAndroid Build Coastguard Worker */
951*f6dc9357SAndroid Build Coastguard Worker
952*f6dc9357SAndroid Build Coastguard Worker if (stdout_cp != -1) g_StdOut.CodePage = stdout_cp;
953*f6dc9357SAndroid Build Coastguard Worker if (stderr_cp != -1) g_StdErr.CodePage = stderr_cp;
954*f6dc9357SAndroid Build Coastguard Worker if (stdin_cp != -1) g_StdIn.CodePage = stdin_cp;
955*f6dc9357SAndroid Build Coastguard Worker }
956*f6dc9357SAndroid Build Coastguard Worker g_StdOut.ListPathSeparatorSlash = options.ListPathSeparatorSlash;
957*f6dc9357SAndroid Build Coastguard Worker g_StdErr.ListPathSeparatorSlash = options.ListPathSeparatorSlash;
958*f6dc9357SAndroid Build Coastguard Worker
959*f6dc9357SAndroid Build Coastguard Worker unsigned percentsNameLevel = 1;
960*f6dc9357SAndroid Build Coastguard Worker if (options.LogLevel == 0 || options.Number_for_Percents != options.Number_for_Out)
961*f6dc9357SAndroid Build Coastguard Worker percentsNameLevel = 2;
962*f6dc9357SAndroid Build Coastguard Worker
963*f6dc9357SAndroid Build Coastguard Worker unsigned consoleWidth = 80;
964*f6dc9357SAndroid Build Coastguard Worker
965*f6dc9357SAndroid Build Coastguard Worker if (percentsStream)
966*f6dc9357SAndroid Build Coastguard Worker {
967*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
968*f6dc9357SAndroid Build Coastguard Worker
969*f6dc9357SAndroid Build Coastguard Worker #if !defined(UNDER_CE)
970*f6dc9357SAndroid Build Coastguard Worker CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
971*f6dc9357SAndroid Build Coastguard Worker if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consoleInfo))
972*f6dc9357SAndroid Build Coastguard Worker consoleWidth = (USHORT)consoleInfo.dwSize.X;
973*f6dc9357SAndroid Build Coastguard Worker #endif
974*f6dc9357SAndroid Build Coastguard Worker
975*f6dc9357SAndroid Build Coastguard Worker #else
976*f6dc9357SAndroid Build Coastguard Worker
977*f6dc9357SAndroid Build Coastguard Worker #if !defined(__sun)
978*f6dc9357SAndroid Build Coastguard Worker struct winsize w;
979*f6dc9357SAndroid Build Coastguard Worker if (ioctl(0, TIOCGWINSZ, &w) == 0)
980*f6dc9357SAndroid Build Coastguard Worker consoleWidth = w.ws_col;
981*f6dc9357SAndroid Build Coastguard Worker #endif
982*f6dc9357SAndroid Build Coastguard Worker #endif
983*f6dc9357SAndroid Build Coastguard Worker }
984*f6dc9357SAndroid Build Coastguard Worker
985*f6dc9357SAndroid Build Coastguard Worker CREATE_CODECS_OBJECT
986*f6dc9357SAndroid Build Coastguard Worker
987*f6dc9357SAndroid Build Coastguard Worker codecs->CaseSensitive_Change = options.CaseSensitive_Change;
988*f6dc9357SAndroid Build Coastguard Worker codecs->CaseSensitive = options.CaseSensitive;
989*f6dc9357SAndroid Build Coastguard Worker ThrowException_if_Error(codecs->Load());
990*f6dc9357SAndroid Build Coastguard Worker Codecs_AddHashArcHandler(codecs);
991*f6dc9357SAndroid Build Coastguard Worker
992*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
993*f6dc9357SAndroid Build Coastguard Worker {
994*f6dc9357SAndroid Build Coastguard Worker g_ExternalCodecs_Ptr = &_externalCodecs;
995*f6dc9357SAndroid Build Coastguard Worker UString s;
996*f6dc9357SAndroid Build Coastguard Worker codecs->GetCodecsErrorMessage(s);
997*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
998*f6dc9357SAndroid Build Coastguard Worker {
999*f6dc9357SAndroid Build Coastguard Worker CStdOutStream &so = (g_StdStream ? *g_StdStream : g_StdOut);
1000*f6dc9357SAndroid Build Coastguard Worker so << endl << s << endl;
1001*f6dc9357SAndroid Build Coastguard Worker }
1002*f6dc9357SAndroid Build Coastguard Worker }
1003*f6dc9357SAndroid Build Coastguard Worker #endif
1004*f6dc9357SAndroid Build Coastguard Worker
1005*f6dc9357SAndroid Build Coastguard Worker const bool isExtractGroupCommand = options.Command.IsFromExtractGroup();
1006*f6dc9357SAndroid Build Coastguard Worker
1007*f6dc9357SAndroid Build Coastguard Worker if (codecs->Formats.Size() == 0 &&
1008*f6dc9357SAndroid Build Coastguard Worker (isExtractGroupCommand
1009*f6dc9357SAndroid Build Coastguard Worker || options.Command.CommandType == NCommandType::kList
1010*f6dc9357SAndroid Build Coastguard Worker || options.Command.IsFromUpdateGroup()))
1011*f6dc9357SAndroid Build Coastguard Worker {
1012*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1013*f6dc9357SAndroid Build Coastguard Worker if (!codecs->MainDll_ErrorPath.IsEmpty())
1014*f6dc9357SAndroid Build Coastguard Worker {
1015*f6dc9357SAndroid Build Coastguard Worker UString s ("Can't load module: ");
1016*f6dc9357SAndroid Build Coastguard Worker s += fs2us(codecs->MainDll_ErrorPath);
1017*f6dc9357SAndroid Build Coastguard Worker throw s;
1018*f6dc9357SAndroid Build Coastguard Worker }
1019*f6dc9357SAndroid Build Coastguard Worker #endif
1020*f6dc9357SAndroid Build Coastguard Worker throw kNoFormats;
1021*f6dc9357SAndroid Build Coastguard Worker }
1022*f6dc9357SAndroid Build Coastguard Worker
1023*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COpenType> types;
1024*f6dc9357SAndroid Build Coastguard Worker if (!ParseOpenTypes(*codecs, options.ArcType, types))
1025*f6dc9357SAndroid Build Coastguard Worker {
1026*f6dc9357SAndroid Build Coastguard Worker throw kUnsupportedArcTypeMessage;
1027*f6dc9357SAndroid Build Coastguard Worker }
1028*f6dc9357SAndroid Build Coastguard Worker
1029*f6dc9357SAndroid Build Coastguard Worker
1030*f6dc9357SAndroid Build Coastguard Worker CIntVector excludedFormats;
1031*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (k, options.ExcludedArcTypes)
1032*f6dc9357SAndroid Build Coastguard Worker {
1033*f6dc9357SAndroid Build Coastguard Worker CIntVector tempIndices;
1034*f6dc9357SAndroid Build Coastguard Worker if (!codecs->FindFormatForArchiveType(options.ExcludedArcTypes[k], tempIndices)
1035*f6dc9357SAndroid Build Coastguard Worker || tempIndices.Size() != 1)
1036*f6dc9357SAndroid Build Coastguard Worker throw kUnsupportedArcTypeMessage;
1037*f6dc9357SAndroid Build Coastguard Worker
1038*f6dc9357SAndroid Build Coastguard Worker
1039*f6dc9357SAndroid Build Coastguard Worker
1040*f6dc9357SAndroid Build Coastguard Worker excludedFormats.AddToUniqueSorted(tempIndices[0]);
1041*f6dc9357SAndroid Build Coastguard Worker // excludedFormats.Sort();
1042*f6dc9357SAndroid Build Coastguard Worker }
1043*f6dc9357SAndroid Build Coastguard Worker
1044*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1045*f6dc9357SAndroid Build Coastguard Worker if (isExtractGroupCommand
1046*f6dc9357SAndroid Build Coastguard Worker || options.Command.IsFromUpdateGroup()
1047*f6dc9357SAndroid Build Coastguard Worker || options.Command.CommandType == NCommandType::kHash
1048*f6dc9357SAndroid Build Coastguard Worker || options.Command.CommandType == NCommandType::kBenchmark)
1049*f6dc9357SAndroid Build Coastguard Worker ThrowException_if_Error(_externalCodecs.Load());
1050*f6dc9357SAndroid Build Coastguard Worker #endif
1051*f6dc9357SAndroid Build Coastguard Worker
1052*f6dc9357SAndroid Build Coastguard Worker int retCode = NExitCode::kSuccess;
1053*f6dc9357SAndroid Build Coastguard Worker HRESULT hresultMain = S_OK;
1054*f6dc9357SAndroid Build Coastguard Worker
1055*f6dc9357SAndroid Build Coastguard Worker // bool showStat = options.ShowTime;
1056*f6dc9357SAndroid Build Coastguard Worker
1057*f6dc9357SAndroid Build Coastguard Worker /*
1058*f6dc9357SAndroid Build Coastguard Worker if (!options.EnableHeaders ||
1059*f6dc9357SAndroid Build Coastguard Worker options.TechMode)
1060*f6dc9357SAndroid Build Coastguard Worker showStat = false;
1061*f6dc9357SAndroid Build Coastguard Worker */
1062*f6dc9357SAndroid Build Coastguard Worker
1063*f6dc9357SAndroid Build Coastguard Worker
1064*f6dc9357SAndroid Build Coastguard Worker if (options.Command.CommandType == NCommandType::kInfo)
1065*f6dc9357SAndroid Build Coastguard Worker {
1066*f6dc9357SAndroid Build Coastguard Worker CStdOutStream &so = (g_StdStream ? *g_StdStream : g_StdOut);
1067*f6dc9357SAndroid Build Coastguard Worker unsigned i;
1068*f6dc9357SAndroid Build Coastguard Worker
1069*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1070*f6dc9357SAndroid Build Coastguard Worker so << endl << "Libs:" << endl;
1071*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < codecs->Libs.Size(); i++)
1072*f6dc9357SAndroid Build Coastguard Worker {
1073*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, (int)i);
1074*f6dc9357SAndroid Build Coastguard Worker const CCodecLib &lib = codecs->Libs[i];
1075*f6dc9357SAndroid Build Coastguard Worker // if (lib.Version != 0)
1076*f6dc9357SAndroid Build Coastguard Worker so << ": " << (lib.Version >> 16) << ".";
1077*f6dc9357SAndroid Build Coastguard Worker PrintNumber(so, lib.Version & 0xffff, 2);
1078*f6dc9357SAndroid Build Coastguard Worker so << " : " << lib.Path << endl;
1079*f6dc9357SAndroid Build Coastguard Worker }
1080*f6dc9357SAndroid Build Coastguard Worker #endif
1081*f6dc9357SAndroid Build Coastguard Worker
1082*f6dc9357SAndroid Build Coastguard Worker so << endl << "Formats:" << endl;
1083*f6dc9357SAndroid Build Coastguard Worker
1084*f6dc9357SAndroid Build Coastguard Worker const char * const kArcFlags = "KSNFMGOPBELHXCc+a+m+r+";
1085*f6dc9357SAndroid Build Coastguard Worker const char * const kArcTimeFlags = "wudn";
1086*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumArcFlags = (unsigned)strlen(kArcFlags);
1087*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumArcTimeFlags = (unsigned)strlen(kArcTimeFlags);
1088*f6dc9357SAndroid Build Coastguard Worker
1089*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < codecs->Formats.Size(); i++)
1090*f6dc9357SAndroid Build Coastguard Worker {
1091*f6dc9357SAndroid Build Coastguard Worker const CArcInfoEx &arc = codecs->Formats[i];
1092*f6dc9357SAndroid Build Coastguard Worker
1093*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1094*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, arc.LibIndex);
1095*f6dc9357SAndroid Build Coastguard Worker #else
1096*f6dc9357SAndroid Build Coastguard Worker so << " ";
1097*f6dc9357SAndroid Build Coastguard Worker #endif
1098*f6dc9357SAndroid Build Coastguard Worker
1099*f6dc9357SAndroid Build Coastguard Worker so << (char)(arc.UpdateEnabled ? 'C' : ' ');
1100*f6dc9357SAndroid Build Coastguard Worker
1101*f6dc9357SAndroid Build Coastguard Worker {
1102*f6dc9357SAndroid Build Coastguard Worker unsigned b;
1103*f6dc9357SAndroid Build Coastguard Worker for (b = 0; b < kNumArcFlags; b++)
1104*f6dc9357SAndroid Build Coastguard Worker so << (char)((arc.Flags & ((UInt32)1 << b)) != 0 ? kArcFlags[b] : '.');
1105*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1106*f6dc9357SAndroid Build Coastguard Worker }
1107*f6dc9357SAndroid Build Coastguard Worker
1108*f6dc9357SAndroid Build Coastguard Worker if (arc.TimeFlags != 0)
1109*f6dc9357SAndroid Build Coastguard Worker {
1110*f6dc9357SAndroid Build Coastguard Worker unsigned b;
1111*f6dc9357SAndroid Build Coastguard Worker for (b = 0; b < kNumArcTimeFlags; b++)
1112*f6dc9357SAndroid Build Coastguard Worker so << (char)((arc.TimeFlags & ((UInt32)1 << b)) != 0 ? kArcTimeFlags[b] : '.');
1113*f6dc9357SAndroid Build Coastguard Worker so << arc.Get_DefaultTimePrec();
1114*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1115*f6dc9357SAndroid Build Coastguard Worker }
1116*f6dc9357SAndroid Build Coastguard Worker
1117*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1118*f6dc9357SAndroid Build Coastguard Worker PrintString(so, arc.Name, 8);
1119*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1120*f6dc9357SAndroid Build Coastguard Worker UString s;
1121*f6dc9357SAndroid Build Coastguard Worker
1122*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (t, arc.Exts)
1123*f6dc9357SAndroid Build Coastguard Worker {
1124*f6dc9357SAndroid Build Coastguard Worker if (t != 0)
1125*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1126*f6dc9357SAndroid Build Coastguard Worker const CArcExtInfo &ext = arc.Exts[t];
1127*f6dc9357SAndroid Build Coastguard Worker s += ext.Ext;
1128*f6dc9357SAndroid Build Coastguard Worker if (!ext.AddExt.IsEmpty())
1129*f6dc9357SAndroid Build Coastguard Worker {
1130*f6dc9357SAndroid Build Coastguard Worker s += " (";
1131*f6dc9357SAndroid Build Coastguard Worker s += ext.AddExt;
1132*f6dc9357SAndroid Build Coastguard Worker s.Add_Char(')');
1133*f6dc9357SAndroid Build Coastguard Worker }
1134*f6dc9357SAndroid Build Coastguard Worker }
1135*f6dc9357SAndroid Build Coastguard Worker
1136*f6dc9357SAndroid Build Coastguard Worker PrintString(so, s, 13);
1137*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1138*f6dc9357SAndroid Build Coastguard Worker
1139*f6dc9357SAndroid Build Coastguard Worker if (arc.SignatureOffset != 0)
1140*f6dc9357SAndroid Build Coastguard Worker so << "offset=" << arc.SignatureOffset << ' ';
1141*f6dc9357SAndroid Build Coastguard Worker
1142*f6dc9357SAndroid Build Coastguard Worker // so << "numSignatures = " << arc.Signatures.Size() << " ";
1143*f6dc9357SAndroid Build Coastguard Worker
1144*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(si, arc.Signatures)
1145*f6dc9357SAndroid Build Coastguard Worker {
1146*f6dc9357SAndroid Build Coastguard Worker if (si != 0)
1147*f6dc9357SAndroid Build Coastguard Worker so << " || ";
1148*f6dc9357SAndroid Build Coastguard Worker
1149*f6dc9357SAndroid Build Coastguard Worker const CByteBuffer &sig = arc.Signatures[si];
1150*f6dc9357SAndroid Build Coastguard Worker
1151*f6dc9357SAndroid Build Coastguard Worker for (size_t j = 0; j < sig.Size(); j++)
1152*f6dc9357SAndroid Build Coastguard Worker {
1153*f6dc9357SAndroid Build Coastguard Worker if (j != 0)
1154*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1155*f6dc9357SAndroid Build Coastguard Worker const unsigned b = sig.ConstData()[j];
1156*f6dc9357SAndroid Build Coastguard Worker if (b > 0x20 && b < 0x80)
1157*f6dc9357SAndroid Build Coastguard Worker {
1158*f6dc9357SAndroid Build Coastguard Worker so << (char)b;
1159*f6dc9357SAndroid Build Coastguard Worker }
1160*f6dc9357SAndroid Build Coastguard Worker else
1161*f6dc9357SAndroid Build Coastguard Worker {
1162*f6dc9357SAndroid Build Coastguard Worker so << GET_HEX_CHAR_UPPER(b >> 4);
1163*f6dc9357SAndroid Build Coastguard Worker so << GET_HEX_CHAR_UPPER(b & 15);
1164*f6dc9357SAndroid Build Coastguard Worker }
1165*f6dc9357SAndroid Build Coastguard Worker }
1166*f6dc9357SAndroid Build Coastguard Worker }
1167*f6dc9357SAndroid Build Coastguard Worker so << endl;
1168*f6dc9357SAndroid Build Coastguard Worker }
1169*f6dc9357SAndroid Build Coastguard Worker
1170*f6dc9357SAndroid Build Coastguard Worker so << endl << "Codecs:" << endl; // << "Lib ID Name" << endl;
1171*f6dc9357SAndroid Build Coastguard Worker
1172*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < g_NumCodecs; i++)
1173*f6dc9357SAndroid Build Coastguard Worker {
1174*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo &cod = *g_Codecs[i];
1175*f6dc9357SAndroid Build Coastguard Worker
1176*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, -1);
1177*f6dc9357SAndroid Build Coastguard Worker
1178*f6dc9357SAndroid Build Coastguard Worker if (cod.NumStreams == 1)
1179*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1180*f6dc9357SAndroid Build Coastguard Worker else
1181*f6dc9357SAndroid Build Coastguard Worker so << cod.NumStreams;
1182*f6dc9357SAndroid Build Coastguard Worker
1183*f6dc9357SAndroid Build Coastguard Worker so << (char)(cod.CreateEncoder ? 'E' : ' ');
1184*f6dc9357SAndroid Build Coastguard Worker so << (char)(cod.CreateDecoder ? 'D' : ' ');
1185*f6dc9357SAndroid Build Coastguard Worker so << (char)(cod.IsFilter ? 'F' : ' ');
1186*f6dc9357SAndroid Build Coastguard Worker
1187*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1188*f6dc9357SAndroid Build Coastguard Worker PrintHexId(so, cod.Id);
1189*f6dc9357SAndroid Build Coastguard Worker so << ' ' << cod.Name << endl;
1190*f6dc9357SAndroid Build Coastguard Worker }
1191*f6dc9357SAndroid Build Coastguard Worker
1192*f6dc9357SAndroid Build Coastguard Worker
1193*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1194*f6dc9357SAndroid Build Coastguard Worker
1195*f6dc9357SAndroid Build Coastguard Worker UInt32 numMethods;
1196*f6dc9357SAndroid Build Coastguard Worker if (_externalCodecs.GetCodecs->GetNumMethods(&numMethods) == S_OK)
1197*f6dc9357SAndroid Build Coastguard Worker for (UInt32 j = 0; j < numMethods; j++)
1198*f6dc9357SAndroid Build Coastguard Worker {
1199*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, codecs->GetCodec_LibIndex(j));
1200*f6dc9357SAndroid Build Coastguard Worker
1201*f6dc9357SAndroid Build Coastguard Worker UInt32 numStreams = codecs->GetCodec_NumStreams(j);
1202*f6dc9357SAndroid Build Coastguard Worker if (numStreams == 1)
1203*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1204*f6dc9357SAndroid Build Coastguard Worker else
1205*f6dc9357SAndroid Build Coastguard Worker so << numStreams;
1206*f6dc9357SAndroid Build Coastguard Worker
1207*f6dc9357SAndroid Build Coastguard Worker so << (char)(codecs->GetCodec_EncoderIsAssigned(j) ? 'E' : ' ');
1208*f6dc9357SAndroid Build Coastguard Worker so << (char)(codecs->GetCodec_DecoderIsAssigned(j) ? 'D' : ' ');
1209*f6dc9357SAndroid Build Coastguard Worker {
1210*f6dc9357SAndroid Build Coastguard Worker bool isFilter_Assigned;
1211*f6dc9357SAndroid Build Coastguard Worker const bool isFilter = codecs->GetCodec_IsFilter(j, isFilter_Assigned);
1212*f6dc9357SAndroid Build Coastguard Worker so << (char)(isFilter ? 'F' : isFilter_Assigned ? ' ' : '*');
1213*f6dc9357SAndroid Build Coastguard Worker }
1214*f6dc9357SAndroid Build Coastguard Worker
1215*f6dc9357SAndroid Build Coastguard Worker
1216*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1217*f6dc9357SAndroid Build Coastguard Worker UInt64 id;
1218*f6dc9357SAndroid Build Coastguard Worker HRESULT res = codecs->GetCodec_Id(j, id);
1219*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
1220*f6dc9357SAndroid Build Coastguard Worker id = (UInt64)(Int64)-1;
1221*f6dc9357SAndroid Build Coastguard Worker PrintHexId(so, id);
1222*f6dc9357SAndroid Build Coastguard Worker so << ' ' << codecs->GetCodec_Name(j) << endl;
1223*f6dc9357SAndroid Build Coastguard Worker }
1224*f6dc9357SAndroid Build Coastguard Worker
1225*f6dc9357SAndroid Build Coastguard Worker #endif
1226*f6dc9357SAndroid Build Coastguard Worker
1227*f6dc9357SAndroid Build Coastguard Worker
1228*f6dc9357SAndroid Build Coastguard Worker so << endl << "Hashers:" << endl; // << " L Size ID Name" << endl;
1229*f6dc9357SAndroid Build Coastguard Worker
1230*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < g_NumHashers; i++)
1231*f6dc9357SAndroid Build Coastguard Worker {
1232*f6dc9357SAndroid Build Coastguard Worker const CHasherInfo &codec = *g_Hashers[i];
1233*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, -1);
1234*f6dc9357SAndroid Build Coastguard Worker PrintUInt32(so, codec.DigestSize, 4);
1235*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1236*f6dc9357SAndroid Build Coastguard Worker PrintHexId(so, codec.Id);
1237*f6dc9357SAndroid Build Coastguard Worker so << ' ' << codec.Name << endl;
1238*f6dc9357SAndroid Build Coastguard Worker }
1239*f6dc9357SAndroid Build Coastguard Worker
1240*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1241*f6dc9357SAndroid Build Coastguard Worker
1242*f6dc9357SAndroid Build Coastguard Worker numMethods = _externalCodecs.GetHashers->GetNumHashers();
1243*f6dc9357SAndroid Build Coastguard Worker for (UInt32 j = 0; j < numMethods; j++)
1244*f6dc9357SAndroid Build Coastguard Worker {
1245*f6dc9357SAndroid Build Coastguard Worker PrintLibIndex(so, codecs->GetHasherLibIndex(j));
1246*f6dc9357SAndroid Build Coastguard Worker PrintUInt32(so, codecs->GetHasherDigestSize(j), 4);
1247*f6dc9357SAndroid Build Coastguard Worker so << ' ';
1248*f6dc9357SAndroid Build Coastguard Worker PrintHexId(so, codecs->GetHasherId(j));
1249*f6dc9357SAndroid Build Coastguard Worker so << ' ' << codecs->GetHasherName(j) << endl;
1250*f6dc9357SAndroid Build Coastguard Worker }
1251*f6dc9357SAndroid Build Coastguard Worker
1252*f6dc9357SAndroid Build Coastguard Worker #endif
1253*f6dc9357SAndroid Build Coastguard Worker
1254*f6dc9357SAndroid Build Coastguard Worker }
1255*f6dc9357SAndroid Build Coastguard Worker else if (options.Command.CommandType == NCommandType::kBenchmark)
1256*f6dc9357SAndroid Build Coastguard Worker {
1257*f6dc9357SAndroid Build Coastguard Worker CStdOutStream &so = (g_StdStream ? *g_StdStream : g_StdOut);
1258*f6dc9357SAndroid Build Coastguard Worker hresultMain = BenchCon(EXTERNAL_CODECS_VARS_L
1259*f6dc9357SAndroid Build Coastguard Worker options.Properties, options.NumIterations, (FILE *)so);
1260*f6dc9357SAndroid Build Coastguard Worker if (hresultMain == S_FALSE)
1261*f6dc9357SAndroid Build Coastguard Worker {
1262*f6dc9357SAndroid Build Coastguard Worker so << endl;
1263*f6dc9357SAndroid Build Coastguard Worker if (g_ErrStream)
1264*f6dc9357SAndroid Build Coastguard Worker *g_ErrStream << "\nDecoding ERROR\n";
1265*f6dc9357SAndroid Build Coastguard Worker retCode = NExitCode::kFatalError;
1266*f6dc9357SAndroid Build Coastguard Worker hresultMain = S_OK;
1267*f6dc9357SAndroid Build Coastguard Worker }
1268*f6dc9357SAndroid Build Coastguard Worker }
1269*f6dc9357SAndroid Build Coastguard Worker else if (isExtractGroupCommand || options.Command.CommandType == NCommandType::kList)
1270*f6dc9357SAndroid Build Coastguard Worker {
1271*f6dc9357SAndroid Build Coastguard Worker UStringVector ArchivePathsSorted;
1272*f6dc9357SAndroid Build Coastguard Worker UStringVector ArchivePathsFullSorted;
1273*f6dc9357SAndroid Build Coastguard Worker
1274*f6dc9357SAndroid Build Coastguard Worker if (options.StdInMode)
1275*f6dc9357SAndroid Build Coastguard Worker {
1276*f6dc9357SAndroid Build Coastguard Worker ArchivePathsSorted.Add(options.ArcName_for_StdInMode);
1277*f6dc9357SAndroid Build Coastguard Worker ArchivePathsFullSorted.Add(options.ArcName_for_StdInMode);
1278*f6dc9357SAndroid Build Coastguard Worker }
1279*f6dc9357SAndroid Build Coastguard Worker else
1280*f6dc9357SAndroid Build Coastguard Worker {
1281*f6dc9357SAndroid Build Coastguard Worker CExtractScanConsole scan;
1282*f6dc9357SAndroid Build Coastguard Worker
1283*f6dc9357SAndroid Build Coastguard Worker scan.Init(options.EnableHeaders ? g_StdStream : NULL,
1284*f6dc9357SAndroid Build Coastguard Worker g_ErrStream, percentsStream,
1285*f6dc9357SAndroid Build Coastguard Worker options.DisablePercents);
1286*f6dc9357SAndroid Build Coastguard Worker scan.SetWindowWidth(consoleWidth);
1287*f6dc9357SAndroid Build Coastguard Worker
1288*f6dc9357SAndroid Build Coastguard Worker if (g_StdStream && options.EnableHeaders)
1289*f6dc9357SAndroid Build Coastguard Worker *g_StdStream << "Scanning the drive for archives:" << endl;
1290*f6dc9357SAndroid Build Coastguard Worker
1291*f6dc9357SAndroid Build Coastguard Worker CDirItemsStat st;
1292*f6dc9357SAndroid Build Coastguard Worker
1293*f6dc9357SAndroid Build Coastguard Worker scan.StartScanning();
1294*f6dc9357SAndroid Build Coastguard Worker
1295*f6dc9357SAndroid Build Coastguard Worker hresultMain = EnumerateDirItemsAndSort(
1296*f6dc9357SAndroid Build Coastguard Worker options.arcCensor,
1297*f6dc9357SAndroid Build Coastguard Worker NWildcard::k_RelatPath,
1298*f6dc9357SAndroid Build Coastguard Worker UString(), // addPathPrefix
1299*f6dc9357SAndroid Build Coastguard Worker ArchivePathsSorted,
1300*f6dc9357SAndroid Build Coastguard Worker ArchivePathsFullSorted,
1301*f6dc9357SAndroid Build Coastguard Worker st,
1302*f6dc9357SAndroid Build Coastguard Worker &scan);
1303*f6dc9357SAndroid Build Coastguard Worker
1304*f6dc9357SAndroid Build Coastguard Worker scan.CloseScanning();
1305*f6dc9357SAndroid Build Coastguard Worker
1306*f6dc9357SAndroid Build Coastguard Worker if (hresultMain == S_OK)
1307*f6dc9357SAndroid Build Coastguard Worker {
1308*f6dc9357SAndroid Build Coastguard Worker if (options.EnableHeaders)
1309*f6dc9357SAndroid Build Coastguard Worker scan.PrintStat(st);
1310*f6dc9357SAndroid Build Coastguard Worker }
1311*f6dc9357SAndroid Build Coastguard Worker else
1312*f6dc9357SAndroid Build Coastguard Worker {
1313*f6dc9357SAndroid Build Coastguard Worker /*
1314*f6dc9357SAndroid Build Coastguard Worker if (res != E_ABORT)
1315*f6dc9357SAndroid Build Coastguard Worker {
1316*f6dc9357SAndroid Build Coastguard Worker throw CSystemException(res);
1317*f6dc9357SAndroid Build Coastguard Worker // errorInfo.Message = "Scanning error";
1318*f6dc9357SAndroid Build Coastguard Worker }
1319*f6dc9357SAndroid Build Coastguard Worker return res;
1320*f6dc9357SAndroid Build Coastguard Worker */
1321*f6dc9357SAndroid Build Coastguard Worker }
1322*f6dc9357SAndroid Build Coastguard Worker }
1323*f6dc9357SAndroid Build Coastguard Worker
1324*f6dc9357SAndroid Build Coastguard Worker if (hresultMain == S_OK) {
1325*f6dc9357SAndroid Build Coastguard Worker if (isExtractGroupCommand)
1326*f6dc9357SAndroid Build Coastguard Worker {
1327*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackConsole *ecs = new CExtractCallbackConsole;
1328*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
1329*f6dc9357SAndroid Build Coastguard Worker
1330*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
1331*f6dc9357SAndroid Build Coastguard Worker ecs->PasswordIsDefined = options.PasswordEnabled;
1332*f6dc9357SAndroid Build Coastguard Worker ecs->Password = options.Password;
1333*f6dc9357SAndroid Build Coastguard Worker #endif
1334*f6dc9357SAndroid Build Coastguard Worker
1335*f6dc9357SAndroid Build Coastguard Worker ecs->Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
1336*f6dc9357SAndroid Build Coastguard Worker ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1);
1337*f6dc9357SAndroid Build Coastguard Worker
1338*f6dc9357SAndroid Build Coastguard Worker ecs->LogLevel = options.LogLevel;
1339*f6dc9357SAndroid Build Coastguard Worker ecs->PercentsNameLevel = percentsNameLevel;
1340*f6dc9357SAndroid Build Coastguard Worker
1341*f6dc9357SAndroid Build Coastguard Worker if (percentsStream)
1342*f6dc9357SAndroid Build Coastguard Worker ecs->SetWindowWidth(consoleWidth);
1343*f6dc9357SAndroid Build Coastguard Worker
1344*f6dc9357SAndroid Build Coastguard Worker /*
1345*f6dc9357SAndroid Build Coastguard Worker COpenCallbackConsole openCallback;
1346*f6dc9357SAndroid Build Coastguard Worker openCallback.Init(g_StdStream, g_ErrStream);
1347*f6dc9357SAndroid Build Coastguard Worker
1348*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
1349*f6dc9357SAndroid Build Coastguard Worker openCallback.PasswordIsDefined = options.PasswordEnabled;
1350*f6dc9357SAndroid Build Coastguard Worker openCallback.Password = options.Password;
1351*f6dc9357SAndroid Build Coastguard Worker #endif
1352*f6dc9357SAndroid Build Coastguard Worker */
1353*f6dc9357SAndroid Build Coastguard Worker
1354*f6dc9357SAndroid Build Coastguard Worker CExtractOptions eo;
1355*f6dc9357SAndroid Build Coastguard Worker (CExtractOptionsBase &)eo = options.ExtractOptions;
1356*f6dc9357SAndroid Build Coastguard Worker
1357*f6dc9357SAndroid Build Coastguard Worker eo.StdInMode = options.StdInMode;
1358*f6dc9357SAndroid Build Coastguard Worker eo.StdOutMode = options.StdOutMode;
1359*f6dc9357SAndroid Build Coastguard Worker eo.YesToAll = options.YesToAll;
1360*f6dc9357SAndroid Build Coastguard Worker eo.TestMode = options.Command.IsTestCommand();
1361*f6dc9357SAndroid Build Coastguard Worker
1362*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
1363*f6dc9357SAndroid Build Coastguard Worker eo.Properties = options.Properties;
1364*f6dc9357SAndroid Build Coastguard Worker #endif
1365*f6dc9357SAndroid Build Coastguard Worker
1366*f6dc9357SAndroid Build Coastguard Worker UString errorMessage;
1367*f6dc9357SAndroid Build Coastguard Worker CDecompressStat stat;
1368*f6dc9357SAndroid Build Coastguard Worker CHashBundle hb;
1369*f6dc9357SAndroid Build Coastguard Worker IHashCalc *hashCalc = NULL;
1370*f6dc9357SAndroid Build Coastguard Worker
1371*f6dc9357SAndroid Build Coastguard Worker if (!options.HashMethods.IsEmpty())
1372*f6dc9357SAndroid Build Coastguard Worker {
1373*f6dc9357SAndroid Build Coastguard Worker hashCalc = &hb;
1374*f6dc9357SAndroid Build Coastguard Worker ThrowException_if_Error(hb.SetMethods(EXTERNAL_CODECS_VARS_L options.HashMethods));
1375*f6dc9357SAndroid Build Coastguard Worker // hb.Init();
1376*f6dc9357SAndroid Build Coastguard Worker }
1377*f6dc9357SAndroid Build Coastguard Worker
1378*f6dc9357SAndroid Build Coastguard Worker hresultMain = Extract(
1379*f6dc9357SAndroid Build Coastguard Worker // EXTERNAL_CODECS_VARS_L
1380*f6dc9357SAndroid Build Coastguard Worker codecs,
1381*f6dc9357SAndroid Build Coastguard Worker types,
1382*f6dc9357SAndroid Build Coastguard Worker excludedFormats,
1383*f6dc9357SAndroid Build Coastguard Worker ArchivePathsSorted,
1384*f6dc9357SAndroid Build Coastguard Worker ArchivePathsFullSorted,
1385*f6dc9357SAndroid Build Coastguard Worker options.Censor.Pairs.Front().Head,
1386*f6dc9357SAndroid Build Coastguard Worker eo,
1387*f6dc9357SAndroid Build Coastguard Worker ecs, ecs, ecs,
1388*f6dc9357SAndroid Build Coastguard Worker hashCalc, errorMessage, stat);
1389*f6dc9357SAndroid Build Coastguard Worker
1390*f6dc9357SAndroid Build Coastguard Worker ecs->ClosePercents();
1391*f6dc9357SAndroid Build Coastguard Worker
1392*f6dc9357SAndroid Build Coastguard Worker if (!errorMessage.IsEmpty())
1393*f6dc9357SAndroid Build Coastguard Worker {
1394*f6dc9357SAndroid Build Coastguard Worker if (g_ErrStream)
1395*f6dc9357SAndroid Build Coastguard Worker *g_ErrStream << endl << "ERROR:" << endl << errorMessage << endl;
1396*f6dc9357SAndroid Build Coastguard Worker if (hresultMain == S_OK)
1397*f6dc9357SAndroid Build Coastguard Worker hresultMain = E_FAIL;
1398*f6dc9357SAndroid Build Coastguard Worker }
1399*f6dc9357SAndroid Build Coastguard Worker
1400*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *so = g_StdStream;
1401*f6dc9357SAndroid Build Coastguard Worker
1402*f6dc9357SAndroid Build Coastguard Worker bool isError = false;
1403*f6dc9357SAndroid Build Coastguard Worker
1404*f6dc9357SAndroid Build Coastguard Worker if (so)
1405*f6dc9357SAndroid Build Coastguard Worker {
1406*f6dc9357SAndroid Build Coastguard Worker *so << endl;
1407*f6dc9357SAndroid Build Coastguard Worker
1408*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumTryArcs > 1)
1409*f6dc9357SAndroid Build Coastguard Worker {
1410*f6dc9357SAndroid Build Coastguard Worker *so << "Archives: " << ecs->NumTryArcs << endl;
1411*f6dc9357SAndroid Build Coastguard Worker *so << "OK archives: " << ecs->NumOkArcs << endl;
1412*f6dc9357SAndroid Build Coastguard Worker }
1413*f6dc9357SAndroid Build Coastguard Worker }
1414*f6dc9357SAndroid Build Coastguard Worker
1415*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumCantOpenArcs != 0)
1416*f6dc9357SAndroid Build Coastguard Worker {
1417*f6dc9357SAndroid Build Coastguard Worker isError = true;
1418*f6dc9357SAndroid Build Coastguard Worker if (so)
1419*f6dc9357SAndroid Build Coastguard Worker *so << "Can't open as archive: " << ecs->NumCantOpenArcs << endl;
1420*f6dc9357SAndroid Build Coastguard Worker }
1421*f6dc9357SAndroid Build Coastguard Worker
1422*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumArcsWithError != 0)
1423*f6dc9357SAndroid Build Coastguard Worker {
1424*f6dc9357SAndroid Build Coastguard Worker isError = true;
1425*f6dc9357SAndroid Build Coastguard Worker if (so)
1426*f6dc9357SAndroid Build Coastguard Worker *so << "Archives with Errors: " << ecs->NumArcsWithError << endl;
1427*f6dc9357SAndroid Build Coastguard Worker }
1428*f6dc9357SAndroid Build Coastguard Worker
1429*f6dc9357SAndroid Build Coastguard Worker if (so)
1430*f6dc9357SAndroid Build Coastguard Worker {
1431*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumArcsWithWarnings != 0)
1432*f6dc9357SAndroid Build Coastguard Worker *so << "Archives with Warnings: " << ecs->NumArcsWithWarnings << endl;
1433*f6dc9357SAndroid Build Coastguard Worker
1434*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumOpenArcWarnings != 0)
1435*f6dc9357SAndroid Build Coastguard Worker {
1436*f6dc9357SAndroid Build Coastguard Worker *so << endl;
1437*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumOpenArcWarnings != 0)
1438*f6dc9357SAndroid Build Coastguard Worker *so << "Warnings: " << ecs->NumOpenArcWarnings << endl;
1439*f6dc9357SAndroid Build Coastguard Worker }
1440*f6dc9357SAndroid Build Coastguard Worker }
1441*f6dc9357SAndroid Build Coastguard Worker
1442*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumOpenArcErrors != 0)
1443*f6dc9357SAndroid Build Coastguard Worker {
1444*f6dc9357SAndroid Build Coastguard Worker isError = true;
1445*f6dc9357SAndroid Build Coastguard Worker if (so)
1446*f6dc9357SAndroid Build Coastguard Worker {
1447*f6dc9357SAndroid Build Coastguard Worker *so << endl;
1448*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumOpenArcErrors != 0)
1449*f6dc9357SAndroid Build Coastguard Worker *so << "Open Errors: " << ecs->NumOpenArcErrors << endl;
1450*f6dc9357SAndroid Build Coastguard Worker }
1451*f6dc9357SAndroid Build Coastguard Worker }
1452*f6dc9357SAndroid Build Coastguard Worker
1453*f6dc9357SAndroid Build Coastguard Worker if (isError)
1454*f6dc9357SAndroid Build Coastguard Worker retCode = NExitCode::kFatalError;
1455*f6dc9357SAndroid Build Coastguard Worker
1456*f6dc9357SAndroid Build Coastguard Worker if (so) {
1457*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumArcsWithError != 0 || ecs->NumFileErrors != 0)
1458*f6dc9357SAndroid Build Coastguard Worker {
1459*f6dc9357SAndroid Build Coastguard Worker // if (ecs->NumArchives > 1)
1460*f6dc9357SAndroid Build Coastguard Worker {
1461*f6dc9357SAndroid Build Coastguard Worker *so << endl;
1462*f6dc9357SAndroid Build Coastguard Worker if (ecs->NumFileErrors != 0)
1463*f6dc9357SAndroid Build Coastguard Worker *so << "Sub items Errors: " << ecs->NumFileErrors << endl;
1464*f6dc9357SAndroid Build Coastguard Worker }
1465*f6dc9357SAndroid Build Coastguard Worker }
1466*f6dc9357SAndroid Build Coastguard Worker else if (hresultMain == S_OK)
1467*f6dc9357SAndroid Build Coastguard Worker {
1468*f6dc9357SAndroid Build Coastguard Worker if (stat.NumFolders != 0)
1469*f6dc9357SAndroid Build Coastguard Worker *so << "Folders: " << stat.NumFolders << endl;
1470*f6dc9357SAndroid Build Coastguard Worker if (stat.NumFiles != 1 || stat.NumFolders != 0 || stat.NumAltStreams != 0)
1471*f6dc9357SAndroid Build Coastguard Worker *so << "Files: " << stat.NumFiles << endl;
1472*f6dc9357SAndroid Build Coastguard Worker if (stat.NumAltStreams != 0)
1473*f6dc9357SAndroid Build Coastguard Worker {
1474*f6dc9357SAndroid Build Coastguard Worker *so << "Alternate Streams: " << stat.NumAltStreams << endl;
1475*f6dc9357SAndroid Build Coastguard Worker *so << "Alternate Streams Size: " << stat.AltStreams_UnpackSize << endl;
1476*f6dc9357SAndroid Build Coastguard Worker }
1477*f6dc9357SAndroid Build Coastguard Worker
1478*f6dc9357SAndroid Build Coastguard Worker *so
1479*f6dc9357SAndroid Build Coastguard Worker << "Size: " << stat.UnpackSize << endl
1480*f6dc9357SAndroid Build Coastguard Worker << "Compressed: " << stat.PackSize << endl;
1481*f6dc9357SAndroid Build Coastguard Worker if (hashCalc)
1482*f6dc9357SAndroid Build Coastguard Worker {
1483*f6dc9357SAndroid Build Coastguard Worker *so << endl;
1484*f6dc9357SAndroid Build Coastguard Worker PrintHashStat(*so, hb);
1485*f6dc9357SAndroid Build Coastguard Worker }
1486*f6dc9357SAndroid Build Coastguard Worker }
1487*f6dc9357SAndroid Build Coastguard Worker } // if (so)
1488*f6dc9357SAndroid Build Coastguard Worker }
1489*f6dc9357SAndroid Build Coastguard Worker else // if_(!isExtractGroupCommand)
1490*f6dc9357SAndroid Build Coastguard Worker {
1491*f6dc9357SAndroid Build Coastguard Worker UInt64 numErrors = 0;
1492*f6dc9357SAndroid Build Coastguard Worker UInt64 numWarnings = 0;
1493*f6dc9357SAndroid Build Coastguard Worker
1494*f6dc9357SAndroid Build Coastguard Worker // options.ExtractNtOptions.StoreAltStreams = true, if -sns[-] is not definmed
1495*f6dc9357SAndroid Build Coastguard Worker
1496*f6dc9357SAndroid Build Coastguard Worker CListOptions lo;
1497*f6dc9357SAndroid Build Coastguard Worker lo.ExcludeDirItems = options.Censor.ExcludeDirItems;
1498*f6dc9357SAndroid Build Coastguard Worker lo.ExcludeFileItems = options.Censor.ExcludeFileItems;
1499*f6dc9357SAndroid Build Coastguard Worker lo.DisablePercents = options.DisablePercents;
1500*f6dc9357SAndroid Build Coastguard Worker
1501*f6dc9357SAndroid Build Coastguard Worker hresultMain = ListArchives(
1502*f6dc9357SAndroid Build Coastguard Worker lo,
1503*f6dc9357SAndroid Build Coastguard Worker codecs,
1504*f6dc9357SAndroid Build Coastguard Worker types,
1505*f6dc9357SAndroid Build Coastguard Worker excludedFormats,
1506*f6dc9357SAndroid Build Coastguard Worker options.StdInMode,
1507*f6dc9357SAndroid Build Coastguard Worker ArchivePathsSorted,
1508*f6dc9357SAndroid Build Coastguard Worker ArchivePathsFullSorted,
1509*f6dc9357SAndroid Build Coastguard Worker options.ExtractOptions.NtOptions.AltStreams.Val,
1510*f6dc9357SAndroid Build Coastguard Worker options.AltStreams.Val, // we don't want to show AltStreams by default
1511*f6dc9357SAndroid Build Coastguard Worker options.Censor.Pairs.Front().Head,
1512*f6dc9357SAndroid Build Coastguard Worker options.EnableHeaders,
1513*f6dc9357SAndroid Build Coastguard Worker options.TechMode,
1514*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
1515*f6dc9357SAndroid Build Coastguard Worker options.PasswordEnabled,
1516*f6dc9357SAndroid Build Coastguard Worker options.Password,
1517*f6dc9357SAndroid Build Coastguard Worker #endif
1518*f6dc9357SAndroid Build Coastguard Worker &options.Properties,
1519*f6dc9357SAndroid Build Coastguard Worker numErrors, numWarnings);
1520*f6dc9357SAndroid Build Coastguard Worker
1521*f6dc9357SAndroid Build Coastguard Worker if (options.EnableHeaders)
1522*f6dc9357SAndroid Build Coastguard Worker if (numWarnings > 0)
1523*f6dc9357SAndroid Build Coastguard Worker g_StdOut << endl << "Warnings: " << numWarnings << endl;
1524*f6dc9357SAndroid Build Coastguard Worker
1525*f6dc9357SAndroid Build Coastguard Worker if (numErrors > 0)
1526*f6dc9357SAndroid Build Coastguard Worker {
1527*f6dc9357SAndroid Build Coastguard Worker if (options.EnableHeaders)
1528*f6dc9357SAndroid Build Coastguard Worker g_StdOut << endl << "Errors: " << numErrors << endl;
1529*f6dc9357SAndroid Build Coastguard Worker retCode = NExitCode::kFatalError;
1530*f6dc9357SAndroid Build Coastguard Worker }
1531*f6dc9357SAndroid Build Coastguard Worker } // if_(isExtractGroupCommand)
1532*f6dc9357SAndroid Build Coastguard Worker } // if_(hresultMain == S_OK)
1533*f6dc9357SAndroid Build Coastguard Worker }
1534*f6dc9357SAndroid Build Coastguard Worker else if (options.Command.IsFromUpdateGroup())
1535*f6dc9357SAndroid Build Coastguard Worker {
1536*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY
1537*f6dc9357SAndroid Build Coastguard Worker throw "update commands are not implemented";
1538*f6dc9357SAndroid Build Coastguard Worker #else
1539*f6dc9357SAndroid Build Coastguard Worker CUpdateOptions &uo = options.UpdateOptions;
1540*f6dc9357SAndroid Build Coastguard Worker if (uo.SfxMode && uo.SfxModule.IsEmpty())
1541*f6dc9357SAndroid Build Coastguard Worker uo.SfxModule = kDefaultSfxModule;
1542*f6dc9357SAndroid Build Coastguard Worker
1543*f6dc9357SAndroid Build Coastguard Worker COpenCallbackConsole openCallback;
1544*f6dc9357SAndroid Build Coastguard Worker openCallback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
1545*f6dc9357SAndroid Build Coastguard Worker
1546*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
1547*f6dc9357SAndroid Build Coastguard Worker bool passwordIsDefined =
1548*f6dc9357SAndroid Build Coastguard Worker (options.PasswordEnabled && !options.Password.IsEmpty());
1549*f6dc9357SAndroid Build Coastguard Worker openCallback.PasswordIsDefined = passwordIsDefined;
1550*f6dc9357SAndroid Build Coastguard Worker openCallback.Password = options.Password;
1551*f6dc9357SAndroid Build Coastguard Worker #endif
1552*f6dc9357SAndroid Build Coastguard Worker
1553*f6dc9357SAndroid Build Coastguard Worker CUpdateCallbackConsole callback;
1554*f6dc9357SAndroid Build Coastguard Worker callback.LogLevel = options.LogLevel;
1555*f6dc9357SAndroid Build Coastguard Worker callback.PercentsNameLevel = percentsNameLevel;
1556*f6dc9357SAndroid Build Coastguard Worker
1557*f6dc9357SAndroid Build Coastguard Worker if (percentsStream)
1558*f6dc9357SAndroid Build Coastguard Worker callback.SetWindowWidth(consoleWidth);
1559*f6dc9357SAndroid Build Coastguard Worker
1560*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
1561*f6dc9357SAndroid Build Coastguard Worker callback.PasswordIsDefined = passwordIsDefined;
1562*f6dc9357SAndroid Build Coastguard Worker callback.AskPassword = (options.PasswordEnabled && options.Password.IsEmpty());
1563*f6dc9357SAndroid Build Coastguard Worker callback.Password = options.Password;
1564*f6dc9357SAndroid Build Coastguard Worker #endif
1565*f6dc9357SAndroid Build Coastguard Worker
1566*f6dc9357SAndroid Build Coastguard Worker callback.StdOutMode = uo.StdOutMode;
1567*f6dc9357SAndroid Build Coastguard Worker callback.Init(
1568*f6dc9357SAndroid Build Coastguard Worker // NULL,
1569*f6dc9357SAndroid Build Coastguard Worker g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
1570*f6dc9357SAndroid Build Coastguard Worker
1571*f6dc9357SAndroid Build Coastguard Worker CUpdateErrorInfo errorInfo;
1572*f6dc9357SAndroid Build Coastguard Worker
1573*f6dc9357SAndroid Build Coastguard Worker /*
1574*f6dc9357SAndroid Build Coastguard Worker if (!uo.Init(codecs, types, options.ArchiveName))
1575*f6dc9357SAndroid Build Coastguard Worker throw kUnsupportedUpdateArcType;
1576*f6dc9357SAndroid Build Coastguard Worker */
1577*f6dc9357SAndroid Build Coastguard Worker hresultMain = UpdateArchive(codecs,
1578*f6dc9357SAndroid Build Coastguard Worker types,
1579*f6dc9357SAndroid Build Coastguard Worker options.ArchiveName,
1580*f6dc9357SAndroid Build Coastguard Worker options.Censor,
1581*f6dc9357SAndroid Build Coastguard Worker uo,
1582*f6dc9357SAndroid Build Coastguard Worker errorInfo, &openCallback, &callback, true);
1583*f6dc9357SAndroid Build Coastguard Worker
1584*f6dc9357SAndroid Build Coastguard Worker callback.ClosePercents2();
1585*f6dc9357SAndroid Build Coastguard Worker
1586*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *se = g_StdStream;
1587*f6dc9357SAndroid Build Coastguard Worker if (!se)
1588*f6dc9357SAndroid Build Coastguard Worker se = g_ErrStream;
1589*f6dc9357SAndroid Build Coastguard Worker
1590*f6dc9357SAndroid Build Coastguard Worker retCode = WarningsCheck(hresultMain, callback, errorInfo,
1591*f6dc9357SAndroid Build Coastguard Worker g_StdStream, se,
1592*f6dc9357SAndroid Build Coastguard Worker true // options.EnableHeaders
1593*f6dc9357SAndroid Build Coastguard Worker );
1594*f6dc9357SAndroid Build Coastguard Worker #endif
1595*f6dc9357SAndroid Build Coastguard Worker }
1596*f6dc9357SAndroid Build Coastguard Worker else if (options.Command.CommandType == NCommandType::kHash)
1597*f6dc9357SAndroid Build Coastguard Worker {
1598*f6dc9357SAndroid Build Coastguard Worker const CHashOptions &uo = options.HashOptions;
1599*f6dc9357SAndroid Build Coastguard Worker
1600*f6dc9357SAndroid Build Coastguard Worker CHashCallbackConsole callback;
1601*f6dc9357SAndroid Build Coastguard Worker if (percentsStream)
1602*f6dc9357SAndroid Build Coastguard Worker callback.SetWindowWidth(consoleWidth);
1603*f6dc9357SAndroid Build Coastguard Worker
1604*f6dc9357SAndroid Build Coastguard Worker callback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
1605*f6dc9357SAndroid Build Coastguard Worker callback.PrintHeaders = options.EnableHeaders;
1606*f6dc9357SAndroid Build Coastguard Worker callback.PrintFields = options.ListFields;
1607*f6dc9357SAndroid Build Coastguard Worker
1608*f6dc9357SAndroid Build Coastguard Worker AString errorInfoString;
1609*f6dc9357SAndroid Build Coastguard Worker hresultMain = HashCalc(EXTERNAL_CODECS_VARS_L
1610*f6dc9357SAndroid Build Coastguard Worker options.Censor, uo,
1611*f6dc9357SAndroid Build Coastguard Worker errorInfoString, &callback);
1612*f6dc9357SAndroid Build Coastguard Worker CUpdateErrorInfo errorInfo;
1613*f6dc9357SAndroid Build Coastguard Worker errorInfo.Message = errorInfoString;
1614*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *se = g_StdStream;
1615*f6dc9357SAndroid Build Coastguard Worker if (!se)
1616*f6dc9357SAndroid Build Coastguard Worker se = g_ErrStream;
1617*f6dc9357SAndroid Build Coastguard Worker retCode = WarningsCheck(hresultMain, callback, errorInfo, g_StdStream, se, options.EnableHeaders);
1618*f6dc9357SAndroid Build Coastguard Worker }
1619*f6dc9357SAndroid Build Coastguard Worker else
1620*f6dc9357SAndroid Build Coastguard Worker ShowMessageAndThrowException(kUserErrorMessage, NExitCode::kUserError);
1621*f6dc9357SAndroid Build Coastguard Worker
1622*f6dc9357SAndroid Build Coastguard Worker if (options.ShowTime && g_StdStream)
1623*f6dc9357SAndroid Build Coastguard Worker PrintStat(
1624*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
1625*f6dc9357SAndroid Build Coastguard Worker startTime
1626*f6dc9357SAndroid Build Coastguard Worker #endif
1627*f6dc9357SAndroid Build Coastguard Worker );
1628*f6dc9357SAndroid Build Coastguard Worker
1629*f6dc9357SAndroid Build Coastguard Worker ThrowException_if_Error(hresultMain);
1630*f6dc9357SAndroid Build Coastguard Worker
1631*f6dc9357SAndroid Build Coastguard Worker return retCode;
1632*f6dc9357SAndroid Build Coastguard Worker }
1633