@ -15,6 +15,7 @@
# include <mutex>
# include <numeric>
# include <utility>
# include <zstd.h>
# include "common/timing.h"
# include "common/util.h"
@ -300,7 +301,7 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool>
if ( bzerror = = BZ_OK & & prev_write_pos = = strm . next_out ) {
// content is corrupt
bzerror = BZ_STREAM_END ;
rWarning ( " decompressBZ2 error : content is corrupt " ) ;
rWarning ( " decompressBZ2 error: content is corrupt " ) ;
break ;
}
@ -318,6 +319,40 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool>
return { } ;
}
std : : string decompressZST ( const std : : string & in , std : : atomic < bool > * abort ) {
return decompressZST ( ( std : : byte * ) in . data ( ) , in . size ( ) , abort ) ;
}
std : : string decompressZST ( const std : : byte * in , size_t in_size , std : : atomic < bool > * abort ) {
ZSTD_DCtx * dctx = ZSTD_createDCtx ( ) ;
assert ( dctx ! = nullptr ) ;
// Initialize input and output buffers
ZSTD_inBuffer input = { in , in_size , 0 } ;
std : : string decompressedData ;
const size_t bufferSize = ZSTD_DStreamOutSize ( ) ; // recommended output buffer size
std : : string outputBuffer ( bufferSize , ' \0 ' ) ;
while ( input . pos < input . size & & ! ( abort & & * abort ) ) {
ZSTD_outBuffer output = { outputBuffer . data ( ) , bufferSize , 0 } ;
size_t result = ZSTD_decompressStream ( dctx , & output , & input ) ;
if ( ZSTD_isError ( result ) ) {
rWarning ( " decompressZST error: content is corrupt " ) ;
break ;
}
decompressedData . append ( outputBuffer . data ( ) , output . pos ) ;
}
ZSTD_freeDCtx ( dctx ) ;
if ( ! ( abort & & * abort ) ) {
decompressedData . shrink_to_fit ( ) ;
return decompressedData ;
}
return { } ;
}
void precise_nano_sleep ( int64_t nanoseconds , std : : atomic < bool > & should_exit ) {
struct timespec req , rem ;
req . tv_sec = nanoseconds / 1000000000 ;