Merge pull request #3872 from JosJuice/movie-revision-nonhexadecimal
Movie: Improve handling of non-hexadecimal revision strings
This commit is contained in:
commit
a3e2436446
|
@ -3,6 +3,8 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <cctype>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <mbedtls/config.h>
|
#include <mbedtls/config.h>
|
||||||
#include <mbedtls/md.h>
|
#include <mbedtls/md.h>
|
||||||
|
@ -123,6 +125,35 @@ static bool IsMovieHeader(u8 magic[4])
|
||||||
magic[3] == 0x1A;
|
magic[3] == 0x1A;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::array<u8, 20> ConvertGitRevisionToBytes(const std::string& revision)
|
||||||
|
{
|
||||||
|
std::array<u8, 20> revision_bytes{};
|
||||||
|
|
||||||
|
if (revision.size() % 2 == 0 && std::all_of(revision.begin(), revision.end(), ::isxdigit))
|
||||||
|
{
|
||||||
|
// The revision string normally contains a git commit hash,
|
||||||
|
// which is 40 hexadecimal digits long. In DTM files, each pair of
|
||||||
|
// hexadecimal digits is stored as one byte, for a total of 20 bytes.
|
||||||
|
size_t bytes_to_write = std::min(revision.size() / 2, revision_bytes.size());
|
||||||
|
unsigned int temp;
|
||||||
|
for (size_t i = 0; i < bytes_to_write; ++i)
|
||||||
|
{
|
||||||
|
sscanf(&revision[2 * i], "%02x", &temp);
|
||||||
|
revision_bytes[i] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the revision string for some reason doesn't only contain hexadecimal digit
|
||||||
|
// pairs, we instead copy the string with no conversion. This probably doesn't match
|
||||||
|
// the intended design of the DTM format, but it's the most sensible fallback.
|
||||||
|
size_t bytes_to_write = std::min(revision.size(), revision_bytes.size());
|
||||||
|
std::copy_n(std::begin(revision), bytes_to_write, std::begin(revision_bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
return revision_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: GPU Thread
|
// NOTE: GPU Thread
|
||||||
std::string GetInputDisplay()
|
std::string GetInputDisplay()
|
||||||
{
|
{
|
||||||
|
@ -1389,14 +1420,8 @@ void GetSettings()
|
||||||
s_memcards |= (SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD) << 0;
|
s_memcards |= (SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD) << 0;
|
||||||
s_memcards |= (SConfig::GetInstance().m_EXIDevice[1] == EXIDEVICE_MEMORYCARD) << 1;
|
s_memcards |= (SConfig::GetInstance().m_EXIDevice[1] == EXIDEVICE_MEMORYCARD) << 1;
|
||||||
|
|
||||||
unsigned int tmp;
|
std::array<u8, 20> revision = ConvertGitRevisionToBytes(scm_rev_git_str);
|
||||||
memset(s_revision, 0, sizeof(s_revision));
|
std::copy(std::begin(revision), std::end(revision), std::begin(s_revision));
|
||||||
size_t revision_bytes_to_copy = std::min(scm_rev_git_str.size() / 2, ArraySize(s_revision));
|
|
||||||
for (size_t i = 0; i < revision_bytes_to_copy; ++i)
|
|
||||||
{
|
|
||||||
sscanf(&scm_rev_git_str[2 * i], "%02x", &tmp);
|
|
||||||
s_revision[i] = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!s_bDSPHLE)
|
if (!s_bDSPHLE)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue