mame/3rdparty/lzma/CPP/7zip/UI/Console/MainAr.cpp
2023-12-06 07:58:49 +11:00

228 lines
4.9 KiB
C++

// MainAr.cpp
#include "StdAfx.h"
#ifdef _WIN32
#include "../../../../C/DllSecur.h"
#endif
#include "../../../../C/CpuArch.h"
#include "../../../Common/MyException.h"
#include "../../../Common/StdOutStream.h"
#include "../../../Windows/ErrorMsg.h"
#include "../../../Windows/NtCheck.h"
#include "../Common/ArchiveCommandLine.h"
#include "../Common/ExitCode.h"
#include "ConsoleClose.h"
using namespace NWindows;
extern
CStdOutStream *g_StdStream;
CStdOutStream *g_StdStream = NULL;
extern
CStdOutStream *g_ErrStream;
CStdOutStream *g_ErrStream = NULL;
extern int Main2(
#ifndef _WIN32
int numArgs, char *args[]
#endif
);
static const char * const kException_CmdLine_Error_Message = "Command Line Error:";
static const char * const kExceptionErrorMessage = "ERROR:";
static const char * const kUserBreakMessage = "Break signaled";
static const char * const kMemoryExceptionMessage = "ERROR: Can't allocate required memory!";
static const char * const kUnknownExceptionMessage = "Unknown Error";
static const char * const kInternalExceptionMessage = "\n\nInternal Error #";
static void FlushStreams()
{
if (g_StdStream)
g_StdStream->Flush();
}
static void PrintError(const char *message)
{
FlushStreams();
if (g_ErrStream)
*g_ErrStream << "\n\n" << message << endl;
}
#if defined(_WIN32) && defined(_UNICODE) && !defined(_WIN64) && !defined(UNDER_CE)
#define NT_CHECK_FAIL_ACTION *g_StdStream << "Unsupported Windows version"; return NExitCode::kFatalError;
#endif
static inline bool CheckIsa()
{
// __try
{
#if defined(__AVX2__)
if (!CPU_IsSupported_AVX2())
return false;
#elif defined(__AVX__)
if (!CPU_IsSupported_AVX())
return false;
#elif defined(__SSE2__) && !defined(MY_CPU_AMD64) || defined(_M_IX86_FP) && (_M_IX86_FP >= 2)
if (!CPU_IsSupported_SSE2())
return false;
#elif defined(__SSE__) && !defined(MY_CPU_AMD64) || defined(_M_IX86_FP) && (_M_IX86_FP >= 1)
if (!CPU_IsSupported_SSE() ||
!CPU_IsSupported_CMOV())
return false;
#endif
/*
__asm
{
_emit 0fH
_emit 038H
_emit 0cbH
_emit (0c0H + 0 * 8 + 0)
}
*/
return true;
}
/*
__except (EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
*/
}
int Z7_CDECL main
(
#ifndef _WIN32
int numArgs, char *args[]
#endif
)
{
g_ErrStream = &g_StdErr;
g_StdStream = &g_StdOut;
// #if (defined(_MSC_VER) && defined(_M_IX86))
if (!CheckIsa())
{
PrintError("ERROR: processor doesn't support required ISA extension");
return NExitCode::kFatalError;
}
// #endif
NT_CHECK
NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter;
int res = 0;
try
{
#ifdef _WIN32
My_SetDefaultDllDirectories();
#endif
res = Main2(
#ifndef _WIN32
numArgs, args
#endif
);
}
catch(const CNewException &)
{
PrintError(kMemoryExceptionMessage);
return (NExitCode::kMemoryError);
}
catch(const NConsoleClose::CCtrlBreakException &)
{
PrintError(kUserBreakMessage);
return (NExitCode::kUserBreak);
}
catch(const CMessagePathException &e)
{
PrintError(kException_CmdLine_Error_Message);
if (g_ErrStream)
*g_ErrStream << e << endl;
return (NExitCode::kUserError);
}
catch(const CSystemException &systemError)
{
if (systemError.ErrorCode == E_OUTOFMEMORY)
{
PrintError(kMemoryExceptionMessage);
return (NExitCode::kMemoryError);
}
if (systemError.ErrorCode == E_ABORT)
{
PrintError(kUserBreakMessage);
return (NExitCode::kUserBreak);
}
if (g_ErrStream)
{
PrintError("System ERROR:");
*g_ErrStream << NError::MyFormatMessage(systemError.ErrorCode) << endl;
}
return (NExitCode::kFatalError);
}
catch(NExitCode::EEnum exitCode)
{
FlushStreams();
if (g_ErrStream)
*g_ErrStream << kInternalExceptionMessage << exitCode << endl;
return (exitCode);
}
catch(const UString &s)
{
if (g_ErrStream)
{
PrintError(kExceptionErrorMessage);
*g_ErrStream << s << endl;
}
return (NExitCode::kFatalError);
}
catch(const AString &s)
{
if (g_ErrStream)
{
PrintError(kExceptionErrorMessage);
*g_ErrStream << s << endl;
}
return (NExitCode::kFatalError);
}
catch(const char *s)
{
if (g_ErrStream)
{
PrintError(kExceptionErrorMessage);
*g_ErrStream << s << endl;
}
return (NExitCode::kFatalError);
}
catch(const wchar_t *s)
{
if (g_ErrStream)
{
PrintError(kExceptionErrorMessage);
*g_ErrStream << s << endl;
}
return (NExitCode::kFatalError);
}
catch(int t)
{
if (g_ErrStream)
{
FlushStreams();
*g_ErrStream << kInternalExceptionMessage << t << endl;
return (NExitCode::kFatalError);
}
}
catch(...)
{
PrintError(kUnknownExceptionMessage);
return (NExitCode::kFatalError);
}
return res;
}