#include #include "athena/MemoryReader.hpp" #include "athena/FileWriter.hpp" #include "athena/Checksums.hpp" #if __BYTE_ORDER__ == __BIG_ENDIAN #define SBIG(q) q #else #define SBIG(q) ( ( (q) & 0x000000FF ) << 24 | ( (q) & 0x0000FF00 ) << 8 \ | ( (q) & 0x00FF0000 ) >> 8 | ( (q) & 0xFF000000 ) >> 24 ) #endif int main(int argc, char* argv[]) { if (argc < 2) { printf("mpcksum [output]\n"); return 1; } athena::io::MemoryCopyReader in(argv[1]); std::unique_ptr out; if (argc > 2) out.reset(new athena::io::FileWriter(argv[2])); else out.reset(new athena::io::FileWriter(argv[1])); atUint32 magic; in.readUBytesToBuf(&magic, 4); if (magic != SBIG('GM8E') && magic != SBIG('GM8P') && magic != SBIG('GM8J')) { printf("Unsupported file, MP .gci file expected\n"); return 1; } if (in.length() != 8256) { printf("File too small expected 8,256 bytes got %" PRIu64, in.length()); return 1; } atUint8* data = in.data(); atUint32 newCkSum = athena::Checksums::crc32(data + 68, 8188, 0); *(atUint32*)(data + 64) = SBIG(newCkSum); out->writeBytes(data, 8256); delete data; return 0; }