metaforce/hecl-gui/Common.cpp

154 lines
4.2 KiB
C++

#include "Common.hpp"
#include <QStringList>
#include <csignal>
#ifndef _WIN32
#include <unistd.h>
#endif
#if __APPLE__
const QString CurPlatformString = QStringLiteral("macos");
#elif _WIN32
const QString CurPlatformString = QStringLiteral("win32");
#elif __linux__
const QString CurPlatformString = QStringLiteral("linux");
#else
#error HECL does not know which OS to fetch for
#endif
QString PlatformToString(Platform plat) {
switch (plat) {
case Platform::MacOS:
return QStringLiteral("macos");
case Platform::Win32:
return QStringLiteral("win32");
case Platform::Linux:
return QStringLiteral("linux");
default:
return QString();
}
}
Architecture CurArchitecture = Architecture::Invalid;
QString CurArchitectureString;
Platform StringToPlatform(const QString& str) {
for (int i = 1; i < int(Platform::MAXPlatform); ++i)
if (!str.compare(PlatformToString(Platform(i)), Qt::CaseInsensitive))
return Platform(i);
return Platform::Invalid;
}
QString ArchitectureToString(Architecture arch) {
switch (arch) {
case Architecture::X86:
return QStringLiteral("x86");
case Architecture::X86_64:
return QStringLiteral("x86_64");
case Architecture::ARM:
return QStringLiteral("arm");
case Architecture::AARCH64:
return QStringLiteral("aarch64");
default:
return QString();
}
}
Architecture StringToArchitecture(const QString& str) {
for (int i = 1; i < int(Architecture::MAXArchitecture); ++i)
if (!str.compare(ArchitectureToString(Architecture(i)), Qt::CaseInsensitive))
return Architecture(i);
return Architecture::Invalid;
}
QString VectorISAToString(VectorISA visa) {
switch (visa) {
case VectorISA::X87:
return QStringLiteral("x87");
case VectorISA::SSE:
return QStringLiteral("sse");
case VectorISA::SSE2:
return QStringLiteral("sse2");
case VectorISA::SSE3:
return QStringLiteral("sse3");
case VectorISA::SSE41:
return QStringLiteral("sse41");
case VectorISA::AVX:
return QStringLiteral("avx");
case VectorISA::AVX2:
return QStringLiteral("avx2");
default:
return QString();
}
}
VectorISA StringToVectorISA(const QString& str) {
for (int i = 1; i < int(VectorISA::MAXVectorISA); ++i)
if (!str.compare(VectorISAToString(VectorISA(i)), Qt::CaseInsensitive))
return VectorISA(i);
return VectorISA::Invalid;
}
URDEVersion::URDEVersion(const QString& filename) {
int idx;
QString useFilename = filename;
if ((idx = filename.indexOf(QLatin1Char{'.'})) >= 0) {
m_extension = QString(filename).remove(0, idx);
useFilename.truncate(idx);
}
const QStringList list = useFilename.split(QLatin1Char{'-'});
if (list.size() >= 2) {
m_version = list[1].toInt();
}
if (list.size() >= 3) {
m_platform = StringToPlatform(list[2]);
}
if (list.size() >= 4) {
m_architecture = StringToArchitecture(list[3]);
}
if (list.size() >= 5) {
m_vectorISA = StringToVectorISA(list[4]);
}
}
QString URDEVersion::fileString(bool withExtension) const {
if (m_version < 0) {
return {};
}
if (withExtension && !m_extension.isEmpty()) {
return QStringLiteral("urde-%1-%2-%3-%4%5")
.arg(QString::number(m_version), PlatformToString(m_platform), ArchitectureToString(m_architecture),
VectorISAToString(m_vectorISA), m_extension);
} else {
return QStringLiteral("urde-%1-%2-%3-%4")
.arg(QString::number(m_version), PlatformToString(m_platform), ArchitectureToString(m_architecture),
VectorISAToString(m_vectorISA));
}
}
#ifndef _WIN32
static void HUPHandler(int) {}
#endif
void InitializePlatform() {
#ifndef _WIN32
/* This can happen when terminating hecl - do nothing */
signal(SIGHUP, HUPHandler);
#endif
#if ZEUS_ARCH_X86_64
const_cast<Architecture&>(CurArchitecture) = Architecture::X86_64;
#elif ZEUS_ARCH_X86
#if !defined(__APPLE__) && !defined(_WIN32)
const_cast<Architecture&>(CurArchitecture) = (sysconf(_SC_WORD_BIT) == 64 ? Architecture::X86_64 : Architecture::X86);
#elif _WIN32
bool isWOW = false;
IsWow64Process(GetCurrentProcess(), &isWOW);
const_cast<Architecture&>(CurArchitecture) = (isWOW ? Architecture::X86_64 : Architecture::X86);
#endif
#endif
const_cast<QString&>(CurArchitectureString) = ArchitectureToString(CurArchitecture);
}