diff --git a/.gitignore b/.gitignore index a20e50d..3e55b04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,2 @@ -bin -vault -packed_lzsa -packed_lz4 -packed_lizard -packed_lz5 -packed_zx7 -packed_rnc obj lzsa diff --git a/src/expand.c b/src/expand.c index 64617b6..25aed75 100755 --- a/src/expand.c +++ b/src/expand.c @@ -152,6 +152,17 @@ static inline FORCE_INLINE int lzsa_expand_match_slow(const unsigned char **ppIn return 0; } +/** + * Decompress one data block + * + * @param pInBlock pointer to compressed data + * @param nInBlockSize size of compressed data, in bytes + * @param pOutData pointer to output decompression buffer (previously decompressed bytes + room for decompressing this block) + * @param nOutDataOffset starting index of where to store decompressed bytes in output buffer (and size of previously decompressed bytes) + * @param nBlockMaxSize total size of output decompression buffer, in bytes + * + * @return size of decompressed data in bytes, or -1 for error + */ int lzsa_expand_block(const unsigned char *pInBlock, int nBlockSize, unsigned char *pOutData, int nOutDataOffset, int nBlockMaxSize) { const unsigned char *pInBlockEnd = pInBlock + nBlockSize; const unsigned char *pInBlockFastEnd = pInBlock + nBlockSize - 16; diff --git a/src/expand.h b/src/expand.h index bfd7ef9..06cbcf9 100755 --- a/src/expand.h +++ b/src/expand.h @@ -23,6 +23,17 @@ #ifndef _EXPAND_H #define _EXPAND_H +/** + * Decompress one data block + * + * @param pInBlock pointer to compressed data + * @param nInBlockSize size of compressed data, in bytes + * @param pOutData pointer to output decompression buffer (previously decompressed bytes + room for decompressing this block) + * @param nOutDataOffset starting index of where to store decompressed bytes in output buffer (and size of previously decompressed bytes) + * @param nBlockMaxSize total size of output decompression buffer, in bytes + * + * @return size of decompressed data in bytes, or -1 for error + */ int lzsa_expand_block(const unsigned char *pInBlock, int nBlockSize, unsigned char *pOutData, int nOutDataOffset, int nBlockMaxSize); #endif /* _EXPAND_H */ diff --git a/src/shrink.c b/src/shrink.c index f4a056f..b991d86 100755 --- a/src/shrink.c +++ b/src/shrink.c @@ -44,20 +44,34 @@ #define LEAVE_ALONE_MATCH_SIZE 600 -int lzsa_compressor_init(lsza_compressor *pCompressor, const int nMaxDataSize) { - pCompressor->intervals = (int *)malloc(nMaxDataSize * sizeof(int)); +/** One match */ +typedef struct _lzsa_match { + unsigned short length; + unsigned short offset; +} lzsa_match; + +/** + * Initialize compression context + * + * @param pCompressor compression context to initialize + * @param nMaxWindowSize maximum size of input data window (previously compressed bytes + bytes to compress) + * + * @return 0 for success, non-zero for failure + */ +int lzsa_compressor_init(lsza_compressor *pCompressor, const int nMaxWindowSize) { + pCompressor->intervals = (int *)malloc(nMaxWindowSize * sizeof(int)); pCompressor->pos_data = NULL; pCompressor->open_intervals = NULL; pCompressor->match = NULL; if (pCompressor->intervals) { - pCompressor->pos_data = (int *)malloc(nMaxDataSize * sizeof(int)); + pCompressor->pos_data = (int *)malloc(nMaxWindowSize * sizeof(int)); if (pCompressor->pos_data) { pCompressor->open_intervals = (int *)malloc((LCP_MAX + 1) * sizeof(int)); if (pCompressor->open_intervals) { - pCompressor->match = (lzsa_match *)malloc(nMaxDataSize * NMATCHES_PER_OFFSET * sizeof(lzsa_match)); + pCompressor->match = (lzsa_match *)malloc(nMaxWindowSize * NMATCHES_PER_OFFSET * sizeof(lzsa_match)); if (pCompressor->match) return 0; @@ -77,6 +91,11 @@ int lzsa_compressor_init(lsza_compressor *pCompressor, const int nMaxDataSize) { return 100; } +/** + * Clean up compression context and free up any associated resources + * + * @param pCompressor compression context to clean up + */ void lzsa_compressor_destroy(lsza_compressor *pCompressor) { if (pCompressor->match) { free(pCompressor->match); @@ -531,6 +550,18 @@ static int lzsa_write_block(lsza_compressor *pCompressor, const unsigned char *p return nOutOffset; } +/** + * Compress one block of data + * + * @param pCompressor compression context + * @param pInWindow pointer to input data window (previously compressed bytes + bytes to compress) + * @param nPreviousBlockSize number of previously compressed bytes (or 0 for none) + * @param nInDataSize number of input bytes to compress + * @param pOutData pointer to output buffer + * @param nMaxOutDataSize maximum size of output buffer, in bytes + * + * @return size of compressed data in output buffer, or -1 if the data is uncompressible + */ int lzsa_shrink_block(lsza_compressor *pCompressor, const unsigned char *pInWindow, const int nPreviousBlockSize, const int nInDataSize, unsigned char *pOutData, const int nMaxOutDataSize) { lzsa_build_suffix_array(pCompressor, pInWindow, nPreviousBlockSize + nInDataSize); if (nPreviousBlockSize) { diff --git a/src/shrink.h b/src/shrink.h index dc6aa0c..1591332 100755 --- a/src/shrink.h +++ b/src/shrink.h @@ -23,11 +23,10 @@ #ifndef _SHRINK_H #define _SHRINK_H -typedef struct { - unsigned short length; - unsigned short offset; -} lzsa_match; +/* Forward declarations */ +typedef struct _lzsa_match lzsa_match; +/** Compression context */ typedef struct { int *intervals; int *pos_data; @@ -35,8 +34,35 @@ typedef struct { lzsa_match *match; } lsza_compressor; -int lzsa_compressor_init(lsza_compressor *pCompressor, const int nMaxDataSize); +/** + * Initialize compression context + * + * @param pCompressor compression context to initialize + * @param nMaxWindowSize maximum size of input data window (previously compressed bytes + bytes to compress) + * + * @return 0 for success, non-zero for failure + */ +int lzsa_compressor_init(lsza_compressor *pCompressor, const int nMaxWindowSize); + +/** + * Clean up compression context and free up any associated resources + * + * @param pCompressor compression context to clean up + */ void lzsa_compressor_destroy(lsza_compressor *pCompressor); + +/** + * Compress one block of data + * + * @param pCompressor compression context + * @param pInWindow pointer to input data window (previously compressed bytes + bytes to compress) + * @param nPreviousBlockSize number of previously compressed bytes (or 0 for none) + * @param nInDataSize number of input bytes to compress + * @param pOutData pointer to output buffer + * @param nMaxOutDataSize maximum size of output buffer, in bytes + * + * @return size of compressed data in output buffer, or -1 if the data is uncompressible + */ int lzsa_shrink_block(lsza_compressor *pCompressor, const unsigned char *pInWindow, const int nPreviousBlockSize, const int nInDataSize, unsigned char *pOutData, const int nMaxOutDataSize); #endif /* _SHRINK_H */