xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Console/MainAr.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // MainAr.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/DllSecur.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyException.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StdOutStream.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/NtCheck.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveCommandLine.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ExitCode.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h"
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker extern
24*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *g_StdStream;
25*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *g_StdStream = NULL;
26*f6dc9357SAndroid Build Coastguard Worker extern
27*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *g_ErrStream;
28*f6dc9357SAndroid Build Coastguard Worker CStdOutStream *g_ErrStream = NULL;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker extern int Main2(
31*f6dc9357SAndroid Build Coastguard Worker   #ifndef _WIN32
32*f6dc9357SAndroid Build Coastguard Worker   int numArgs, char *args[]
33*f6dc9357SAndroid Build Coastguard Worker   #endif
34*f6dc9357SAndroid Build Coastguard Worker );
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker static const char * const kException_CmdLine_Error_Message = "Command Line Error:";
37*f6dc9357SAndroid Build Coastguard Worker static const char * const kExceptionErrorMessage = "ERROR:";
38*f6dc9357SAndroid Build Coastguard Worker static const char * const kUserBreakMessage  = "Break signaled";
39*f6dc9357SAndroid Build Coastguard Worker static const char * const kMemoryExceptionMessage = "ERROR: Can't allocate required memory!";
40*f6dc9357SAndroid Build Coastguard Worker static const char * const kUnknownExceptionMessage = "Unknown Error";
41*f6dc9357SAndroid Build Coastguard Worker static const char * const kInternalExceptionMessage = "\n\nInternal Error #";
42*f6dc9357SAndroid Build Coastguard Worker 
FlushStreams()43*f6dc9357SAndroid Build Coastguard Worker static void FlushStreams()
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker   if (g_StdStream)
46*f6dc9357SAndroid Build Coastguard Worker     g_StdStream->Flush();
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker 
PrintError(const char * message)49*f6dc9357SAndroid Build Coastguard Worker static void PrintError(const char *message)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   FlushStreams();
52*f6dc9357SAndroid Build Coastguard Worker   if (g_ErrStream)
53*f6dc9357SAndroid Build Coastguard Worker     *g_ErrStream << "\n\n" << message << endl;
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(_UNICODE) && !defined(_WIN64) && !defined(UNDER_CE)
57*f6dc9357SAndroid Build Coastguard Worker #define NT_CHECK_FAIL_ACTION *g_StdStream << "Unsupported Windows version"; return NExitCode::kFatalError;
58*f6dc9357SAndroid Build Coastguard Worker #endif
59*f6dc9357SAndroid Build Coastguard Worker 
CheckIsa()60*f6dc9357SAndroid Build Coastguard Worker static inline bool CheckIsa()
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   // __try
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     // some compilers (e2k) support SSE/AVX, but cpuid() can be unavailable or return lower isa support
65*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
66*f6dc9357SAndroid Build Coastguard Worker     #if 0 && (defined(__AVX512F__) && defined(__AVX512VL__))
67*f6dc9357SAndroid Build Coastguard Worker       if (!CPU_IsSupported_AVX512F_AVX512VL())
68*f6dc9357SAndroid Build Coastguard Worker         return false;
69*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__AVX2__)
70*f6dc9357SAndroid Build Coastguard Worker       if (!CPU_IsSupported_AVX2())
71*f6dc9357SAndroid Build Coastguard Worker         return false;
72*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__AVX__)
73*f6dc9357SAndroid Build Coastguard Worker       if (!CPU_IsSupported_AVX())
74*f6dc9357SAndroid Build Coastguard Worker         return false;
75*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__SSE2__) && !defined(MY_CPU_AMD64) || defined(_M_IX86_FP) && (_M_IX86_FP >= 2)
76*f6dc9357SAndroid Build Coastguard Worker       if (!CPU_IsSupported_SSE2())
77*f6dc9357SAndroid Build Coastguard Worker         return false;
78*f6dc9357SAndroid Build Coastguard Worker     #elif defined(__SSE__) && !defined(MY_CPU_AMD64) || defined(_M_IX86_FP) && (_M_IX86_FP >= 1)
79*f6dc9357SAndroid Build Coastguard Worker       if (!CPU_IsSupported_SSE() ||
80*f6dc9357SAndroid Build Coastguard Worker           !CPU_IsSupported_CMOV())
81*f6dc9357SAndroid Build Coastguard Worker         return false;
82*f6dc9357SAndroid Build Coastguard Worker     #endif
83*f6dc9357SAndroid Build Coastguard Worker #endif
84*f6dc9357SAndroid Build Coastguard Worker     /*
85*f6dc9357SAndroid Build Coastguard Worker     __asm
86*f6dc9357SAndroid Build Coastguard Worker     {
87*f6dc9357SAndroid Build Coastguard Worker       _emit 0fH
88*f6dc9357SAndroid Build Coastguard Worker       _emit 038H
89*f6dc9357SAndroid Build Coastguard Worker       _emit 0cbH
90*f6dc9357SAndroid Build Coastguard Worker       _emit (0c0H + 0 * 8 + 0)
91*f6dc9357SAndroid Build Coastguard Worker     }
92*f6dc9357SAndroid Build Coastguard Worker     */
93*f6dc9357SAndroid Build Coastguard Worker     return true;
94*f6dc9357SAndroid Build Coastguard Worker   }
95*f6dc9357SAndroid Build Coastguard Worker   /*
96*f6dc9357SAndroid Build Coastguard Worker   __except (EXCEPTION_EXECUTE_HANDLER)
97*f6dc9357SAndroid Build Coastguard Worker   {
98*f6dc9357SAndroid Build Coastguard Worker     return false;
99*f6dc9357SAndroid Build Coastguard Worker   }
100*f6dc9357SAndroid Build Coastguard Worker   */
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker 
main(int numArgs,char * args[])103*f6dc9357SAndroid Build Coastguard Worker int Z7_CDECL main
104*f6dc9357SAndroid Build Coastguard Worker (
105*f6dc9357SAndroid Build Coastguard Worker   #ifndef _WIN32
106*f6dc9357SAndroid Build Coastguard Worker   int numArgs, char *args[]
107*f6dc9357SAndroid Build Coastguard Worker   #endif
108*f6dc9357SAndroid Build Coastguard Worker )
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker   g_ErrStream = &g_StdErr;
111*f6dc9357SAndroid Build Coastguard Worker   g_StdStream = &g_StdOut;
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   // #if (defined(_MSC_VER) && defined(_M_IX86))
114*f6dc9357SAndroid Build Coastguard Worker   if (!CheckIsa())
115*f6dc9357SAndroid Build Coastguard Worker   {
116*f6dc9357SAndroid Build Coastguard Worker     PrintError("ERROR: processor doesn't support required ISA extension");
117*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
118*f6dc9357SAndroid Build Coastguard Worker   }
119*f6dc9357SAndroid Build Coastguard Worker   // #endif
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker   NT_CHECK
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter;
124*f6dc9357SAndroid Build Coastguard Worker   int res = 0;
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker   try
127*f6dc9357SAndroid Build Coastguard Worker   {
128*f6dc9357SAndroid Build Coastguard Worker     #ifdef _WIN32
129*f6dc9357SAndroid Build Coastguard Worker     My_SetDefaultDllDirectories();
130*f6dc9357SAndroid Build Coastguard Worker     #endif
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker     res = Main2(
133*f6dc9357SAndroid Build Coastguard Worker     #ifndef _WIN32
134*f6dc9357SAndroid Build Coastguard Worker     numArgs, args
135*f6dc9357SAndroid Build Coastguard Worker     #endif
136*f6dc9357SAndroid Build Coastguard Worker     );
137*f6dc9357SAndroid Build Coastguard Worker   }
138*f6dc9357SAndroid Build Coastguard Worker   catch(const CNewException &)
139*f6dc9357SAndroid Build Coastguard Worker   {
140*f6dc9357SAndroid Build Coastguard Worker     PrintError(kMemoryExceptionMessage);
141*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kMemoryError);
142*f6dc9357SAndroid Build Coastguard Worker   }
143*f6dc9357SAndroid Build Coastguard Worker /*
144*f6dc9357SAndroid Build Coastguard Worker   catch(const NConsoleClose::CCtrlBreakException &)
145*f6dc9357SAndroid Build Coastguard Worker   {
146*f6dc9357SAndroid Build Coastguard Worker     PrintError(kUserBreakMessage);
147*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kUserBreak);
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker */
150*f6dc9357SAndroid Build Coastguard Worker   catch(const CMessagePathException &e)
151*f6dc9357SAndroid Build Coastguard Worker   {
152*f6dc9357SAndroid Build Coastguard Worker     PrintError(kException_CmdLine_Error_Message);
153*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
154*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << e << endl;
155*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kUserError);
156*f6dc9357SAndroid Build Coastguard Worker   }
157*f6dc9357SAndroid Build Coastguard Worker   catch(const CSystemException &systemError)
158*f6dc9357SAndroid Build Coastguard Worker   {
159*f6dc9357SAndroid Build Coastguard Worker     if (systemError.ErrorCode == E_OUTOFMEMORY)
160*f6dc9357SAndroid Build Coastguard Worker     {
161*f6dc9357SAndroid Build Coastguard Worker       PrintError(kMemoryExceptionMessage);
162*f6dc9357SAndroid Build Coastguard Worker       return (NExitCode::kMemoryError);
163*f6dc9357SAndroid Build Coastguard Worker     }
164*f6dc9357SAndroid Build Coastguard Worker     if (systemError.ErrorCode == E_ABORT)
165*f6dc9357SAndroid Build Coastguard Worker     {
166*f6dc9357SAndroid Build Coastguard Worker       PrintError(kUserBreakMessage);
167*f6dc9357SAndroid Build Coastguard Worker       return (NExitCode::kUserBreak);
168*f6dc9357SAndroid Build Coastguard Worker     }
169*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
170*f6dc9357SAndroid Build Coastguard Worker     {
171*f6dc9357SAndroid Build Coastguard Worker       PrintError("System ERROR:");
172*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << NError::MyFormatMessage(systemError.ErrorCode) << endl;
173*f6dc9357SAndroid Build Coastguard Worker     }
174*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
175*f6dc9357SAndroid Build Coastguard Worker   }
176*f6dc9357SAndroid Build Coastguard Worker   catch(NExitCode::EEnum exitCode)
177*f6dc9357SAndroid Build Coastguard Worker   {
178*f6dc9357SAndroid Build Coastguard Worker     FlushStreams();
179*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
180*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << kInternalExceptionMessage << exitCode << endl;
181*f6dc9357SAndroid Build Coastguard Worker     return (exitCode);
182*f6dc9357SAndroid Build Coastguard Worker   }
183*f6dc9357SAndroid Build Coastguard Worker   catch(const UString &s)
184*f6dc9357SAndroid Build Coastguard Worker   {
185*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
186*f6dc9357SAndroid Build Coastguard Worker     {
187*f6dc9357SAndroid Build Coastguard Worker       PrintError(kExceptionErrorMessage);
188*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << s << endl;
189*f6dc9357SAndroid Build Coastguard Worker     }
190*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
191*f6dc9357SAndroid Build Coastguard Worker   }
192*f6dc9357SAndroid Build Coastguard Worker   catch(const AString &s)
193*f6dc9357SAndroid Build Coastguard Worker   {
194*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
195*f6dc9357SAndroid Build Coastguard Worker     {
196*f6dc9357SAndroid Build Coastguard Worker       PrintError(kExceptionErrorMessage);
197*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << s << endl;
198*f6dc9357SAndroid Build Coastguard Worker     }
199*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
200*f6dc9357SAndroid Build Coastguard Worker   }
201*f6dc9357SAndroid Build Coastguard Worker   catch(const char *s)
202*f6dc9357SAndroid Build Coastguard Worker   {
203*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
204*f6dc9357SAndroid Build Coastguard Worker     {
205*f6dc9357SAndroid Build Coastguard Worker       PrintError(kExceptionErrorMessage);
206*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << s << endl;
207*f6dc9357SAndroid Build Coastguard Worker     }
208*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
209*f6dc9357SAndroid Build Coastguard Worker   }
210*f6dc9357SAndroid Build Coastguard Worker   catch(const wchar_t *s)
211*f6dc9357SAndroid Build Coastguard Worker   {
212*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
213*f6dc9357SAndroid Build Coastguard Worker     {
214*f6dc9357SAndroid Build Coastguard Worker       PrintError(kExceptionErrorMessage);
215*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << s << endl;
216*f6dc9357SAndroid Build Coastguard Worker     }
217*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
218*f6dc9357SAndroid Build Coastguard Worker   }
219*f6dc9357SAndroid Build Coastguard Worker   catch(int t)
220*f6dc9357SAndroid Build Coastguard Worker   {
221*f6dc9357SAndroid Build Coastguard Worker     if (g_ErrStream)
222*f6dc9357SAndroid Build Coastguard Worker     {
223*f6dc9357SAndroid Build Coastguard Worker       FlushStreams();
224*f6dc9357SAndroid Build Coastguard Worker       *g_ErrStream << kInternalExceptionMessage << t << endl;
225*f6dc9357SAndroid Build Coastguard Worker       return (NExitCode::kFatalError);
226*f6dc9357SAndroid Build Coastguard Worker     }
227*f6dc9357SAndroid Build Coastguard Worker   }
228*f6dc9357SAndroid Build Coastguard Worker   catch(...)
229*f6dc9357SAndroid Build Coastguard Worker   {
230*f6dc9357SAndroid Build Coastguard Worker     PrintError(kUnknownExceptionMessage);
231*f6dc9357SAndroid Build Coastguard Worker     return (NExitCode::kFatalError);
232*f6dc9357SAndroid Build Coastguard Worker   }
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker   return res;
235*f6dc9357SAndroid Build Coastguard Worker }
236