Skip to content

Commit

Permalink
Merge pull request #4867 from lioncash/simplify
Browse files Browse the repository at this point in the history
Boot_WiiWAD: Simplify state_checksum()
  • Loading branch information
Parlane committed Mar 7, 2017
2 parents a75d38a + 3c071ce commit cfc909f
Showing 1 changed file with 16 additions and 15 deletions.
31 changes: 16 additions & 15 deletions Source/Core/Core/Boot/Boot_WiiWAD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include <array>
#include <cstddef>
#include <memory>
#include <numeric>
#include <string>

#include "Common/CommonPaths.h"
Expand All @@ -20,19 +23,6 @@
#include "DiscIO/Volume.h"
#include "DiscIO/VolumeCreator.h"

static u32 state_checksum(u32* buf, int len)
{
u32 checksum = 0;
len = len >> 2;

for (int i = 0; i < len; i++)
{
checksum += buf[i];
}

return checksum;
}

struct StateFlags
{
u32 checksum;
Expand All @@ -43,6 +33,17 @@ struct StateFlags
u32 unknown[6];
};

static u32 StateChecksum(const StateFlags& flags)
{
constexpr size_t length_in_bytes = sizeof(StateFlags) - 4;
constexpr size_t num_elements = length_in_bytes / sizeof(u32);
std::array<u32, num_elements> flag_data;

std::memcpy(flag_data.data(), &flags.flags, length_in_bytes);

return std::accumulate(flag_data.cbegin(), flag_data.cend(), 0U);
}

bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
{
std::string state_filename(Common::GetTitleDataPath(TITLEID_SYSMENU, Common::FROM_SESSION_ROOT) +
Expand All @@ -55,7 +56,7 @@ bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
state_file.ReadBytes(&state, sizeof(StateFlags));

state.type = 0x03; // TYPE_RETURN
state.checksum = state_checksum((u32*)&state.flags, sizeof(StateFlags) - 4);
state.checksum = StateChecksum(state);

state_file.Seek(0, SEEK_SET);
state_file.WriteBytes(&state, sizeof(StateFlags));
Expand All @@ -68,7 +69,7 @@ bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
memset(&state, 0, sizeof(StateFlags));
state.type = 0x03; // TYPE_RETURN
state.discstate = 0x01; // DISCSTATE_WII
state.checksum = state_checksum((u32*)&state.flags, sizeof(StateFlags) - 4);
state.checksum = StateChecksum(state);
state_file.WriteBytes(&state, sizeof(StateFlags));
}

Expand Down

0 comments on commit cfc909f

Please sign in to comment.