// SPDX-License-Identifier: LGPL-3.0-or-later /** * \file cpr/bzip2.h * * Burrows–Wheeler bzip2 compression streaming support library. * * \copyright The DoubleFourteen Code Forge (C) All Rights Reserved * \author Lorenzo Cogotti */ #ifndef DF_CPR_BZIP2_H_ #define DF_CPR_BZIP2_H_ #include "stm.h" /// Bzip2 stream handle. typedef struct Bzip2StmObj *Bzip2StmHn; /** * \brief BZip2 Compression options. * * \see `Bz2_InitCompress()` */ typedef struct { /** * \brief Compression level, from 1 to 9 inclusive. * * Higher values imply better compression, at the price of speed loss * and memory consumption. * Out of range values are silently clamped to allowed range. */ int compression; /// Compressor load factor. int factor; /// Compressor buffer size in bytes, 0 to use suggested value. size_t bufsiz; /** * \brief Debugging message verbosity. * * Values higher than 0 make the stream log debug messages to standard * error, debugging level goes from 0 to 4 inclusive. * Larger values are silently truncated to the maximum allowed. */ unsigned verbose; } Bzip2CprOpts; /** * \brief Decompression options. * * \see `Bz2_InitDecompress()` */ typedef struct { /// Decompressor buffer size in bytes, 0 to use suggested value. size_t bufsiz; /// Conserve memory during decompression, in spite of speed. Boolean low_mem; /** * \brief Debugging message verbosity. * * Values higher than 0 make the stream log debug messages to standard * error, debugging level goes from 0 to 4 inclusive. * Larger values are implicitly truncated to the maximum allowed. */ unsigned verbose; } Bzip2DecOpts; /// BZip2 result status, returned by `Bzip2_GetErrStat()`. typedef int Bzip2Ret; // 0 == OK /// Implementation of `StmOps` for BZip2 compression/decompression. extern const StmOps *const Bzip2_StmOps; /// Non-closing variant of `Bzip2_StmOps`. extern const StmOps *const Bzip2_NcStmOps; /// Return last BZip2 operation result. Bzip2Ret Bzip2_GetErrStat(void); /// Convert `Bzip2Ret` value to human readable string. const char *Bzip2_ErrorString(Bzip2Ret ret); /** * \brief Open stream for compression. * * \param [in,out] streamp Output stream for compressed data * \param [in] ops Write operations interface for `streamp`, must not be `NULL` and provide `Write()` * \param [in] opts Compression options, may be `NULL` for defaults * * \return The BZip2 compressor handle on success, `NULL` on failure. */ Bzip2StmHn Bzip2_OpenCompress(void *streamp, const StmOps *ops, const Bzip2CprOpts *opts); /** * \brief Open a stream for decompressing. * * \param [in,out] streamp Input stream for BZip2 compressed data * \param [in] ops Read operations interface for `streamp`, must not be `NULL` and provide `Read()` * \param [in] opts Decompression options, may be `NULL` for defaults * * \return The BZip2 decompressor handle on success, `NULL` on failure. */ Bzip2StmHn Bzip2_OpenDecompress(void *streamp, const StmOps *ops, const Bzip2DecOpts *opts); /** * \brief Decompress `nbytes` bytes from `hn` to `buf`. * * \return Number of actual bytes written to `buf`, 0 on end of stream, * -1 on error. */ Sint64 Bzip2_Read(Bzip2StmHn hn, void *buf, size_t nbytes); /** * \brief Compress `nbytes` bytes from `buf` to `hn`. * * \return Number of bytes actually written to `hn`, which may be less * than `nbytes`, -1 on error. * * \note Compression should be finalized with `Bzip2_Finish()` once all * data is written. */ Sint64 Bzip2_Write(Bzip2StmHn hn, const void *buf, size_t nbytes); /** * \brief Flush Bzip2 encoder. * * Should be called before closing a BZip2 encoder. * * \param [in,out] hn Stream to be finalized, must not be `NULL` * * \return `OK` on success, `NG` on failure. */ Judgement Bzip2_Finish(Bzip2StmHn hn); /// Close a Bzip2 stream. void Bzip2_Close(Bzip2StmHn hn); #endif