mirror of https://github.com/mgba-emu/mgba.git
Move file CRC32 code into crc32.h
This commit is contained in:
parent
7a0f86ae99
commit
381fc94d73
|
@ -42,6 +42,12 @@
|
||||||
|
|
||||||
#include "util/crc32.h"
|
#include "util/crc32.h"
|
||||||
|
|
||||||
|
#include "util/vfs.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
BUFFER_SIZE = 1024
|
||||||
|
};
|
||||||
|
|
||||||
static uint32_t crc32Table[] = {
|
static uint32_t crc32Table[] = {
|
||||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
||||||
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||||
|
@ -102,3 +108,26 @@ uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size) {
|
||||||
|
|
||||||
return ~crc;
|
return ~crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t fileCrc32(struct VFile* vf, size_t endOffset) {
|
||||||
|
char buffer[BUFFER_SIZE];
|
||||||
|
size_t blocksize;
|
||||||
|
size_t alreadyRead = 0;
|
||||||
|
if (vf->seek(vf, 0, SEEK_SET) < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
uint32_t crc = 0;
|
||||||
|
while (alreadyRead < endOffset) {
|
||||||
|
size_t toRead = sizeof(buffer);
|
||||||
|
if (toRead + alreadyRead > endOffset) {
|
||||||
|
toRead = endOffset - alreadyRead;
|
||||||
|
}
|
||||||
|
blocksize = vf->read(vf, buffer, toRead);
|
||||||
|
alreadyRead += blocksize;
|
||||||
|
crc = updateCrc32(crc, buffer, blocksize);
|
||||||
|
if (blocksize < toRead) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
struct VFile;
|
||||||
|
|
||||||
uint32_t crc32(const void* buf, size_t size);
|
uint32_t crc32(const void* buf, size_t size);
|
||||||
uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size);
|
uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size);
|
||||||
|
uint32_t fileCrc32(struct VFile* file, size_t endOffset);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,8 +8,6 @@ enum {
|
||||||
IN_CHECKSUM = -12,
|
IN_CHECKSUM = -12,
|
||||||
OUT_CHECKSUM = -8,
|
OUT_CHECKSUM = -8,
|
||||||
PATCH_CHECKSUM = -4,
|
PATCH_CHECKSUM = -4,
|
||||||
|
|
||||||
BUFFER_SIZE = 1024
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static size_t _UPSOutputSize(struct Patch* patch, size_t inSize);
|
static size_t _UPSOutputSize(struct Patch* patch, size_t inSize);
|
||||||
|
@ -19,7 +17,7 @@ static size_t _UPSDecodeLength(struct VFile* vf);
|
||||||
bool loadPatchUPS(struct Patch* patch) {
|
bool loadPatchUPS(struct Patch* patch) {
|
||||||
patch->vf->seek(patch->vf, 0, SEEK_SET);
|
patch->vf->seek(patch->vf, 0, SEEK_SET);
|
||||||
|
|
||||||
char buffer[BUFFER_SIZE];
|
char buffer[4];
|
||||||
if (patch->vf->read(patch->vf, buffer, 4) != 4) {
|
if (patch->vf->read(patch->vf, buffer, 4) != 4) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -36,23 +34,7 @@ bool loadPatchUPS(struct Patch* patch) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t blocksize;
|
uint32_t crc = fileCrc32(patch->vf, filesize + PATCH_CHECKSUM);
|
||||||
size_t alreadyRead = 0;
|
|
||||||
patch->vf->seek(patch->vf, 0, SEEK_SET);
|
|
||||||
uint32_t crc = 0;
|
|
||||||
while (alreadyRead < filesize + PATCH_CHECKSUM) {
|
|
||||||
size_t toRead = sizeof(buffer);
|
|
||||||
if (toRead + alreadyRead > filesize + PATCH_CHECKSUM) {
|
|
||||||
toRead = filesize + PATCH_CHECKSUM - alreadyRead;
|
|
||||||
}
|
|
||||||
blocksize = patch->vf->read(patch->vf, buffer, toRead);
|
|
||||||
alreadyRead += blocksize;
|
|
||||||
crc = updateCrc32(crc, buffer, blocksize);
|
|
||||||
if (blocksize < toRead) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crc != goodCrc32) {
|
if (crc != goodCrc32) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue