int64_t lzbench_brieflz_compress(char *inbuf, size_t insize, char *outbuf, size_t outsize, size_t level, size_t, char* workmem) { if (!workmem) return 0; int64_t res = blz_pack(inbuf, outbuf, insize, (void*)workmem); return res; }
static SquashStatus squash_brieflz_compress_buffer (SquashCodec* codec, size_t* compressed_size, uint8_t compressed[SQUASH_ARRAY_PARAM(*compressed_size)], size_t uncompressed_size, const uint8_t uncompressed[SQUASH_ARRAY_PARAM(uncompressed_size)], SquashOptions* options) { uint8_t *dst = compressed; void *workmem = NULL; size_t size; #if ULONG_MAX < SIZE_MAX if (SQUASH_UNLIKELY(ULONG_MAX < uncompressed_size) || SQUASH_UNLIKELY(ULONG_MAX < *compressed_size)) return squash_error (SQUASH_RANGE); #endif if (SQUASH_UNLIKELY((unsigned long) *compressed_size < squash_brieflz_get_max_compressed_size (codec, uncompressed_size))) { return squash_error (SQUASH_BUFFER_FULL); } size = write_varuint64 (dst, *compressed_size, uncompressed_size); if (SQUASH_UNLIKELY(size == 0)) { return squash_error (SQUASH_BUFFER_FULL); } dst += size; workmem = malloc (blz_workmem_size ((unsigned long) uncompressed_size)); if (SQUASH_UNLIKELY(workmem == NULL)) { return squash_error (SQUASH_MEMORY); } size += blz_pack (uncompressed, dst, (unsigned long) uncompressed_size, workmem); free(workmem); #if SIZE_MAX < ULONG_MAX if (SQUASH_UNLIKELY(SIZE_MAX < size)) return squash_error (SQUASH_RANGE); #endif *compressed_size = size; return SQUASH_OK; }
int MDFN_StateEvil(int rewind) { if(!EvilEnabled) return(0); if(rewind) { int32 next_bcspos = bcspos; bool NeedDataFlush = FALSE; bcspos--; if(bcspos < 0) bcspos += SRW_NUM; if(!bcs[bcspos].data) bcspos = (bcspos + 1) % SRW_NUM; else NeedDataFlush = TRUE; if(bcs[bcspos].compressed_len) { uint8 *tmp_buf; lzo_uint dst_len = bcs[bcspos].uncompressed_len; tmp_buf = (uint8 *)malloc(bcs[bcspos].uncompressed_len); if(SRWCompressor == SRW_COMPRESSOR_QUICKLZ) { //static char workmem[QLZ_SCRATCH_DECOMPRESS]; dst_len = qlz_decompress((char*)bcs[bcspos].data, tmp_buf); //, workmem); } else if(SRWCompressor == SRW_COMPRESSOR_MINILZO) lzo1x_decompress(bcs[bcspos].data, bcs[bcspos].compressed_len, tmp_buf, &dst_len, NULL); else if(SRWCompressor == SRW_COMPRESSOR_BLZ) { dst_len = blz_unpack(bcs[bcspos].data, tmp_buf); } for(uint32 x = 0; x < bcs[bcspos].uncompressed_len && x < bcs[next_bcspos].uncompressed_len; x++) tmp_buf[x] ^= bcs[next_bcspos].data[x]; free(bcs[bcspos].data); bcs[bcspos].data = tmp_buf; bcs[bcspos].compressed_len = 0; } if(NeedDataFlush) { if(bcs[next_bcspos].MovieLove.data) { free(bcs[next_bcspos].MovieLove.data); bcs[next_bcspos].MovieLove.data = NULL; } free(bcs[next_bcspos].data); bcs[next_bcspos].data = NULL; bcs[next_bcspos].compressed_len = 0; bcs[next_bcspos].uncompressed_len = 0; } if(bcs[bcspos].uncompressed_len) { StateMem sm; sm.data = bcs[bcspos].data; sm.loc = 0; sm.initial_malloc = 0; sm.malloced = sm.len = bcs[bcspos].uncompressed_len; MDFNSS_LoadSM(&sm, 0, 1); // free(MDFNMOV_GrabRewindJoy().data); return(1); } } else { StateMem sm; int32 prev_bcspos = bcspos; bcspos = (bcspos + 1) % SRW_NUM; // if(MDFNMOV_IsRecording()) { if(bcs[bcspos].data && bcs[bcspos].MovieLove.data) { //printf("Force: %d\n", bcspos); // MDFNMOV_ForceRecord(&bcs[bcspos].MovieLove); free(bcs[bcspos].MovieLove.data); bcs[bcspos].MovieLove.data = NULL; } } if(bcs[bcspos].data) { free(bcs[bcspos].data); bcs[bcspos].data = NULL; } if(bcs[bcspos].MovieLove.data) { free(bcs[bcspos].MovieLove.data); bcs[bcspos].MovieLove.data = NULL; } memset(&sm, 0, sizeof(sm)); // MDFNSS_SaveSM(&sm, 0, 1); bcs[bcspos].data = sm.data; bcs[bcspos].compressed_len = 0; bcs[bcspos].uncompressed_len = sm.len; // Compress the previous save state. if(bcs[prev_bcspos].data) { for(uint32 x = 0; x < bcs[prev_bcspos].uncompressed_len && x < sm.len; x++) bcs[prev_bcspos].data[x] ^= sm.data[x]; if(SRWCompressor == SRW_COMPRESSOR_QUICKLZ) { //static char workmem[QLZ_SCRATCH_COMPRESS]; uint8 *tmp_buf = (uint8 *)malloc(bcs[prev_bcspos].uncompressed_len + 36000); uint32 dst_len = bcs[prev_bcspos].uncompressed_len + 36000; dst_len = qlz_compress(bcs[prev_bcspos].data, (char*)tmp_buf, bcs[prev_bcspos].uncompressed_len); //, workmem); free(bcs[prev_bcspos].data); bcs[prev_bcspos].data = (uint8 *)realloc(tmp_buf, dst_len); bcs[prev_bcspos].compressed_len = dst_len; } else if(SRWCompressor == SRW_COMPRESSOR_MINILZO) { uint8 workmem[LZO1X_1_MEM_COMPRESS]; uint8 * tmp_buf = (uint8 *)malloc((size_t)(1.10 * bcs[prev_bcspos].uncompressed_len)); lzo_uint dst_len = (lzo_uint)(1.10 * bcs[prev_bcspos].uncompressed_len); lzo1x_1_compress(bcs[prev_bcspos].data, bcs[prev_bcspos].uncompressed_len, tmp_buf, &dst_len, workmem); free(bcs[prev_bcspos].data); bcs[prev_bcspos].data = (uint8 *)realloc(tmp_buf, dst_len); bcs[prev_bcspos].compressed_len = dst_len; } else if(SRWCompressor == SRW_COMPRESSOR_BLZ) { blz_pack_t workmem; uint8 * tmp_buf = (uint8 *)malloc((size_t)(bcs[prev_bcspos].uncompressed_len + blz_pack_extra)); uint32 dst_len = bcs[prev_bcspos].uncompressed_len + blz_pack_extra; dst_len = blz_pack(bcs[prev_bcspos].data, bcs[prev_bcspos].uncompressed_len, tmp_buf, &workmem); free(bcs[prev_bcspos].data); bcs[prev_bcspos].data = (uint8 *)realloc(tmp_buf, dst_len); bcs[prev_bcspos].compressed_len = dst_len; } } // if(MDFNMOV_IsRecording()) // bcs[bcspos].MovieLove = MDFNMOV_GrabRewindJoy(); } return(0); }