/* Decompresses 'size' bytes from 'data'. Returns the address of a malloc'd buffer containing the decompressed data and its size in '*out_sizep'. In case of error, returns 0 and does not modify '*out_sizep'. */ uint8_t * bbdecompress( const uint8_t * const data, const int size, uint8_t * new_data, int * const out_sizep ) { struct LZ_Decoder * const decoder = LZ_decompress_open(); if( !decoder || LZ_decompress_errno( decoder ) != LZ_ok ) { LZ_decompress_close( decoder ); return 0; } const int delta_size = size; /* size must be > zero */ int new_data_size = delta_size; /* initial size */ //uint8_t * new_data = (uint8_t *)malloc( new_data_size ); //if( !new_data ) // { LZ_decompress_close( decoder ); return 0; } int new_pos = 0; int written = 0; bool error = false; while( true ) { if( LZ_decompress_write_size( decoder ) > 0 ) { if( written < size ) { const int wr = LZ_decompress_write( decoder, data + written, size - written ); if( wr < 0 ) { error = true; break; } written += wr; } if( written >= size ) LZ_decompress_finish( decoder ); } const int rd = LZ_decompress_read( decoder, new_data + new_pos, new_data_size - new_pos ); if( rd < 0 ) { error = true; break; } new_pos += rd; if( LZ_decompress_finished( decoder ) == 1 ) break; /*if( new_pos >= new_data_size ) { uint8_t * const tmp = (uint8_t *)realloc( new_data, new_data_size + delta_size ); if( !tmp ) { error = true; break; } new_data = tmp; new_data_size += delta_size; }*/ } if( LZ_decompress_close( decoder ) < 0 ) error = true; if( error ) { /*free( new_data );*/ return 0; } *out_sizep = new_pos; return new_data; }
int64_t lzbench_lzlib_decompress(char *inbuf, size_t insize, char *outbuf, size_t outsize, size_t, size_t, char*) { struct LZ_Decoder * const decoder = LZ_decompress_open(); uint8_t * new_data = (uint8_t*)outbuf; int new_data_size = outsize; /* initial size */ int new_pos = 0; int written = 0; bool error = false; uint8_t *data = (uint8_t*)inbuf; if( !decoder || LZ_decompress_errno( decoder ) != LZ_ok ) { LZ_decompress_close( decoder ); return 0; } while( true ) { int rd; if( LZ_decompress_write_size( decoder ) > 0 ) { if( written < insize ) { const int wr = LZ_decompress_write( decoder, data + written, insize - written ); // printf("write=%d written=%d left=%d\n", wr, written, insize - written); if( wr < 0 ) { error = true; break; } written += wr; } if( written >= insize ) LZ_decompress_finish( decoder ); } rd = LZ_decompress_read( decoder, new_data + new_pos, new_data_size - new_pos ); // printf("read=%d new_pos=%d\n", rd, new_pos); if( rd < 0 ) { error = true; break; } new_pos += rd; if( LZ_decompress_finished( decoder ) == 1 ) break; } if( LZ_decompress_close( decoder ) < 0 ) error = true; return new_pos; }