diff --git a/src/openrct2/util/sawyercoding.c b/src/openrct2/util/sawyercoding.c index eb8481525f..dac796bd48 100644 --- a/src/openrct2/util/sawyercoding.c +++ b/src/openrct2/util/sawyercoding.c @@ -40,111 +40,6 @@ uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length) return checksum; } -/** - * - * rct2: 0x00676FD2 - */ -sint32 sawyercoding_validate_checksum(SDL_RWops* rw) -{ - size_t i, dataSize; - uint32 checksum, fileChecksum; - uint8 buffer[1024]; - - // Get data size - SDL_RWseek(rw, 0, RW_SEEK_END); - // for whatever the reason, SDL_RWtell return Sint64 instead of size_t. - dataSize = (size_t)SDL_RWtell(rw); - if (dataSize < 8) - return 0; - dataSize -= 4; - - // Calculate checksum - SDL_RWseek(rw, 0, RW_SEEK_SET); - checksum = 0; - do { - size_t bufferSize = min(dataSize, 1024); - if (SDL_RWread(rw, buffer, bufferSize, 1) != 1) - return 0; - - for (i = 0; i < bufferSize; i++) - checksum += buffer[i]; - dataSize -= bufferSize; - } while (dataSize != 0); - - // Read file checksum - if (SDL_RWread(rw, &fileChecksum, sizeof(fileChecksum), 1) != 1) - return 0; - - // Reset file position - SDL_RWseek(rw, 0, RW_SEEK_SET); - - // Validate - return checksum == fileChecksum; -} - -bool sawyercoding_read_chunk_safe(SDL_RWops *rw, void *dst, size_t dstLength) -{ - // Allocate 16 MB to store uncompressed data - uint8 *tempBuffer = malloc(16 * 1024 * 1024); - size_t uncompressedLength = sawyercoding_read_chunk_with_size(rw, tempBuffer, 16 * 1024 * 1024); - if (uncompressedLength == SIZE_MAX) { - free(tempBuffer); - return false; - } else { - memcpy(dst, tempBuffer, min(dstLength, uncompressedLength)); - free(tempBuffer); - return true; - } -} - -bool sawyercoding_skip_chunk(SDL_RWops *rw) -{ - // Read chunk header - sawyercoding_chunk_header chunkHeader; - if (SDL_RWread(rw, &chunkHeader, sizeof(sawyercoding_chunk_header), 1) != 1) { - log_error("Unable to read chunk header!"); - return false; - } - - // Skip chunk data - SDL_RWseek(rw, chunkHeader.length, RW_SEEK_CUR); - return true; -} - -/** - * - * rct2: 0x0067685F - * buffer (esi) - */ -size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const size_t buffer_size) -{ - sawyercoding_chunk_header chunkHeader; - - // Read chunk header - if (SDL_RWread(rw, &chunkHeader, sizeof(sawyercoding_chunk_header), 1) != 1) { - log_error("Unable to read chunk header!"); - return -1; - } - - uint8* src_buffer = malloc(chunkHeader.length); - if (src_buffer == NULL) { - log_error("Unable to read chunk data!"); - return -1; - } - - // Read chunk data - if (SDL_RWread(rw, src_buffer, chunkHeader.length, 1) != 1) { - free(src_buffer); - log_error("Unable to read chunk data!"); - return -1; - } - - // Decode chunk data - size_t data_size = sawyercoding_read_chunk_buffer(buffer, src_buffer, chunkHeader, buffer_size); - free(src_buffer); - return data_size; -} - size_t sawyercoding_read_chunk_buffer(uint8 *dst_buffer, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader, size_t dst_buffer_size) { switch (chunkHeader.encoding) { case CHUNK_ENCODING_NONE: diff --git a/src/openrct2/util/sawyercoding.h b/src/openrct2/util/sawyercoding.h index f4acdf1479..73571111fc 100644 --- a/src/openrct2/util/sawyercoding.h +++ b/src/openrct2/util/sawyercoding.h @@ -49,11 +49,7 @@ enum { FILE_TYPE_SC4 = (2 << 2) }; -sint32 sawyercoding_validate_checksum(SDL_RWops* rw); uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length); -bool sawyercoding_read_chunk_safe(SDL_RWops *rw, void *dst, size_t dstLength); -bool sawyercoding_skip_chunk(SDL_RWops *rw); -size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const size_t buffer_size); size_t sawyercoding_read_chunk_buffer(uint8 *dst_buffer, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader, size_t dst_buffer_size); size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader); size_t sawyercoding_decode_sv4(const uint8 *src, uint8 *dst, size_t length, size_t bufferLength);