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 Workerstatic 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 Workerstatic 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 Workerstatic 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 Workerint 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