From d9553fd2180535a11dcb4e2f5a3197202befc2c0 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 31 Oct 2024 14:04:11 -0700 Subject: [PATCH 1/3] elevated ZSTD_getErrorCode() to stable status answering #4183 --- doc/zstd_manual.html | 149 ++++++++++++++++++++++++------------------- lib/zstd.h | 44 ++++++++----- lib/zstd_errors.h | 8 --- 3 files changed, 109 insertions(+), 92 deletions(-) diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 56bfbcd81..7a1cbbd3e 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -10,7 +10,7 @@
  1. Introduction
  2. Version
  3. -
  4. Simple API
  5. +
  6. Simple Core API
  7. Explicit context
  8. Advanced compression API (Requires v1.4.0+)
  9. Advanced decompression API (Requires v1.4.0+)
  10. @@ -74,7 +74,7 @@

    Return runtime library version, like "1.4.5". Requires v1.3.0+.


    -

    Simple API

    
    +

    Simple Core API

    
     
     
    size_t ZSTD_compress( void* dst, size_t dstCapacity,
                     const void* src, size_t srcSize,
    @@ -88,38 +88,42 @@
     
     
    size_t ZSTD_decompress( void* dst, size_t dstCapacity,
                       const void* src, size_t compressedSize);
    -

    `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. - `dstCapacity` is an upper bound of originalSize to regenerate. - If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. - @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), - or an errorCode if it fails (which can be tested using ZSTD_isError()). +

    `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. + Multiple compressed frames can be decompressed at once with this method. + The result will be the concatenation of all decompressed frames, back to back. + `dstCapacity` is an upper bound of originalSize to regenerate. + First frame's decompressed size can be extracted using ZSTD_getFrameContentSize(). + If maximum upper bound isn't known, prefer using streaming mode to decompress data. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTD_isError()).


    +

    Decompression helper functions


    #define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1)
     #define ZSTD_CONTENTSIZE_ERROR   (0ULL - 2)
     unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize);
    -

    `src` should point to the start of a ZSTD encoded frame. - `srcSize` must be at least as large as the frame header. - hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. - @return : - decompressed size of `src` frame content, if known - - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined - - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) - note 1 : a 0 return value means the frame is valid but "empty". - note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode. - When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. - In which case, it's necessary to use streaming mode to decompress data. - Optionally, application can rely on some implicit limit, - as ZSTD_decompress() only needs an upper bound of decompressed size. - (For example, data could be necessarily cut into blocks <= 16 KB). - note 3 : decompressed size is always present when compression is completed using single-pass functions, - such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). - note 4 : decompressed size can be very large (64-bits value), - potentially larger than what local system can handle as a single memory segment. - In which case, it's necessary to use streaming mode to decompress data. - note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. - Always ensure return value fits within application's authorized limits. - Each application can set its own limits. - note 6 : This function replaces ZSTD_getDecompressedSize() +

    `src` should point to the start of a ZSTD encoded frame. + `srcSize` must be at least as large as the frame header. + hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. + @return : - decompressed size of `src` frame content, if known + - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) + note 1 : a 0 return value means the frame is valid but "empty". + note 2 : decompressed size is an optional field, it may not be present (typically in streaming mode). + When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + In which case, it's necessary to use streaming mode to decompress data. + Optionally, application can rely on some implicit limit, + as ZSTD_decompress() only needs an upper bound of decompressed size. + (For example, data could be necessarily cut into blocks <= 16 KB). + note 3 : decompressed size is always present when compression is completed using single-pass functions, + such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). + note 4 : decompressed size can be very large (64-bits value), + potentially larger than what local system can handle as a single memory segment. + In which case, it's necessary to use streaming mode to decompress data. + note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. + Always ensure return value fits within application's authorized limits. + Each application can set its own limits. + note 6 : This function replaces ZSTD_getDecompressedSize()


    ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
    @@ -140,35 +144,21 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
             or an error code if input is invalid 
     


    -

    Helper functions

    /* ZSTD_compressBound() :
    - * maximum compressed size in worst case single-pass scenario.
    - * When invoking `ZSTD_compress()` or any other one-pass compression function,
    - * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)
    - * as it eliminates one potential failure scenario,
    - * aka not enough room in dst buffer to write the compressed frame.
    - * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE .
    - *        In which case, ZSTD_compressBound() will return an error code
    - *        which can be tested using ZSTD_isError().
    - *
    - * ZSTD_COMPRESSBOUND() :
    - * same as ZSTD_compressBound(), but as a macro.
    - * It can be used to produce constants, which can be useful for static allocation,
    - * for example to size a static array on stack.
    - * Will produce constant value 0 if srcSize too large.
    - */
    -#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00ULL : 0xFF00FF00U)
    -#define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
    -size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
    +

    Compression helper functions


    +
    size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
    +

    +

    Error helper functions

    #include "zstd_errors.h" /* list of errors */
     /* ZSTD_isError() :
      * Most ZSTD_* functions returning a size_t value can be tested for error,
      * using ZSTD_isError().
      * @return 1 if error, 0 otherwise
      */
    -unsigned    ZSTD_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
    -const char* ZSTD_getErrorName(size_t code);     /*!< provides readable string from an error code */
    -int         ZSTD_minCLevel(void);               /*!< minimum negative compression level allowed, requires v1.4.0+ */
    -int         ZSTD_maxCLevel(void);               /*!< maximum compression level available */
    -int         ZSTD_defaultCLevel(void);           /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
    +unsigned     ZSTD_isError(size_t code);        /*!< tells if a `size_t` function result is an error code */
    +ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); /* convert a result into an error code, which can be compared to error enum list */
    +const char*  ZSTD_getErrorName(size_t code);   /*!< provides readable string from an error code */
    +int          ZSTD_minCLevel(void);             /*!< minimum negative compression level allowed, requires v1.4.0+ */
    +int          ZSTD_maxCLevel(void);             /*!< maximum compression level available */
    +int          ZSTD_defaultCLevel(void);         /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
     

    Explicit context

    
     
    @@ -718,7 +708,7 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
     

    Streaming decompression - HowTo

       A ZSTD_DStream object is required to track streaming operations.
       Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources.
    -  ZSTD_DStream objects can be reused multiple times.
    +  ZSTD_DStream objects can be re-employed multiple times.
     
       Use ZSTD_initDStream() to start a new decompression operation.
      @return : recommended first input size
    @@ -728,16 +718,21 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
       The function will update both `pos` fields.
       If `input.pos < input.size`, some input has not been consumed.
       It's up to the caller to present again remaining data.
    +
       The function tries to flush all data decoded immediately, respecting output buffer size.
       If `output.pos < output.size`, decoder has flushed everything it could.
    -  But if `output.pos == output.size`, there might be some data left within internal buffers.,
    +
    +  However, when `output.pos == output.size`, it's more difficult to know.
    +  If @return > 0, the frame is not complete, meaning
    +  either there is still some data left to flush within internal buffers,
    +  or there is more input to read to complete the frame (or both).
       In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer.
       Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX.
      @return : 0 when a frame is completely decoded and fully flushed,
             or an error code, which can be tested using ZSTD_isError(),
             or any other value > 0, which means there is still some decoding or flushing to do to complete current frame :
                                     the return value is a suggested next input size (just a hint for better latency)
    -                                that will never request more than the remaining frame size.
    +                                that will never request more than the remaining content of the compressed frame.
      
     
    @@ -763,9 +758,10 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);
    /* accept NULL pointer */ Function will update both input and output `pos` fields exposing current state via these fields: - `input.pos < input.size`, some input remaining and caller should provide remaining input on the next call. - - `output.pos < output.size`, decoder finished and flushed all remaining buffers. - - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, - call ZSTD_decompressStream() again to flush remaining data to output. + - `output.pos < output.size`, decoder flushed internal output buffer. + - `output.pos == output.size`, unflushed data potentially present in the internal buffers, + check ZSTD_decompressStream() @return value, + if > 0, invoke it again to flush remaining data to output. Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. @return : 0 when a frame is completely decoded and fully flushed, @@ -1311,19 +1307,37 @@ ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr,


    -

    Generate sequences using ZSTD_compress2(), given a source buffer. +

    ZSTD_DEPRECATED("For debugging only, will be replaced by ZSTD_extractSequences()")
    +ZSTDLIB_STATIC_API size_t
    +ZSTD_generateSequences(ZSTD_CCtx* zc,
    +           ZSTD_Sequence* outSeqs, size_t outSeqsSize,
    +           const void* src, size_t srcSize);
    +

    WARNING: This function is meant for debugging and informational purposes ONLY! + Its implementation is flawed, and it will be deleted in a future version. + It is not guaranteed to succeed, as there are several cases where it will give + up and fail. You should NOT use this function in production code. + + This function is deprecated, and will be removed in a future version. + + Generate sequences using ZSTD_compress2(), given a source buffer. + + @param zc The compression context to be used for ZSTD_compress2(). Set any + compression parameters you need on this context. + @param outSeqs The output sequences buffer of size @p outSeqsSize + @param outSeqsSize The size of the output sequences buffer. + ZSTD_sequenceBound(srcSize) is an upper bound on the number + of sequences that can be generated. + @param src The source buffer to generate sequences from of size @p srcSize. + @param srcSize The size of the source buffer. Each block will end with a dummy sequence with offset == 0, matchLength == 0, and litLength == length of last literals. litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) simply acts as a block delimiter. - @zc can be used to insert custom compression params. - This function invokes ZSTD_compress2(). - - The output of this function can be fed into ZSTD_compressSequences() with CCtx - setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters - @return : number of sequences generated + @returns The number of sequences generated, necessarily less than + ZSTD_sequenceBound(srcSize), or an error code that can be checked + with ZSTD_isError().


    @@ -1512,13 +1526,14 @@ static #ifdef __GNUC__ __attribute__((__unused__)) #endif -ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };
    /**< this constant defers to stdlib's functions */

    These prototypes make it possible to pass your own allocation/free functions. ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. All allocation/free operations will be completed using these custom variants instead of regular ones.


    +
    ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /**< this constant defers to stdlib's functions */
    +

    typedef struct POOL_ctx_s ZSTD_threadPool;
     ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads);
     ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool);  /* accept NULL pointer */
    diff --git a/lib/zstd.h b/lib/zstd.h
    index ecf837bc9..22aca768c 100644
    --- a/lib/zstd.h
    +++ b/lib/zstd.h
    @@ -15,7 +15,6 @@ extern "C" {
     #define ZSTD_H_235446
     
     /* ======   Dependencies   ======*/
    -#include    /* INT_MAX */
     #include    /* size_t */
     
     
    @@ -106,7 +105,7 @@ extern "C" {
     /*------   Version   ------*/
     #define ZSTD_VERSION_MAJOR    1
     #define ZSTD_VERSION_MINOR    5
    -#define ZSTD_VERSION_RELEASE  6
    +#define ZSTD_VERSION_RELEASE  7
     #define ZSTD_VERSION_NUMBER  (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
     
     /*! ZSTD_versionNumber() :
    @@ -144,7 +143,7 @@ ZSTDLIB_API const char* ZSTD_versionString(void);
     
     
     /***************************************
    -*  Simple API
    +*  Simple Core API
     ***************************************/
     /*! ZSTD_compress() :
      *  Compresses `src` content as a single zstd compressed frame into already allocated `dst`.
    @@ -168,6 +167,9 @@ ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
     ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
                                   const void* src, size_t compressedSize);
     
    +
    +/*======  Decompression helper functions  ======*/
    +
     /*! ZSTD_getFrameContentSize() : requires v1.3.0+
      * `src` should point to the start of a ZSTD encoded frame.
      * `srcSize` must be at least as large as the frame header.
    @@ -214,10 +216,11 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
     ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
     
     
    -/*======  Helper functions  ======*/
    +/*======  Compression helper functions  ======*/
    +
     /* ZSTD_compressBound() :
      * maximum compressed size in worst case single-pass scenario.
    - * When invoking `ZSTD_compress()` or any other one-pass compression function,
    + * When invoking `ZSTD_compress()`, or any other one-pass compression function,
      * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)
      * as it eliminates one potential failure scenario,
      * aka not enough room in dst buffer to write the compressed frame.
    @@ -229,21 +232,26 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
      * same as ZSTD_compressBound(), but as a macro.
      * It can be used to produce constants, which can be useful for static allocation,
      * for example to size a static array on stack.
    - * Will produce constant value 0 if srcSize too large.
    + * Will produce constant value 0 if srcSize is too large.
      */
     #define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00ULL : 0xFF00FF00U)
     #define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
     ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
    +
    +
    +/*======  Error helper functions  ======*/
    +#include "zstd_errors.h" /* list of errors */
     /* ZSTD_isError() :
      * Most ZSTD_* functions returning a size_t value can be tested for error,
      * using ZSTD_isError().
      * @return 1 if error, 0 otherwise
      */
    -ZSTDLIB_API unsigned    ZSTD_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
    -ZSTDLIB_API const char* ZSTD_getErrorName(size_t code);     /*!< provides readable string from an error code */
    -ZSTDLIB_API int         ZSTD_minCLevel(void);               /*!< minimum negative compression level allowed, requires v1.4.0+ */
    -ZSTDLIB_API int         ZSTD_maxCLevel(void);               /*!< maximum compression level available */
    -ZSTDLIB_API int         ZSTD_defaultCLevel(void);           /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
    +ZSTDLIB_API unsigned     ZSTD_isError(size_t result);      /*!< tells if a `size_t` function result is an error code */
    +ZSTDLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); /* convert a result into an error code, which can be compared to error enum list */
    +ZSTDLIB_API const char*  ZSTD_getErrorName(size_t result); /*!< provides readable string from a function result */
    +ZSTDLIB_API int          ZSTD_minCLevel(void);             /*!< minimum negative compression level allowed, requires v1.4.0+ */
    +ZSTDLIB_API int          ZSTD_maxCLevel(void);             /*!< maximum compression level available */
    +ZSTDLIB_API int          ZSTD_defaultCLevel(void);         /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
     
     
     /***************************************
    @@ -251,17 +259,17 @@ ZSTDLIB_API int         ZSTD_defaultCLevel(void);           /*!< default compres
     ***************************************/
     /*= Compression context
      *  When compressing many times,
    - *  it is recommended to allocate a context just once,
    + *  it is recommended to allocate a compression context just once,
      *  and reuse it for each successive compression operation.
    - *  This will make workload friendlier for system's memory.
    + *  This will make the workload easier for system's memory.
      *  Note : re-using context is just a speed / resource optimization.
      *         It doesn't change the compression ratio, which remains identical.
    - *  Note 2 : In multi-threaded environments,
    - *         use one different context per thread for parallel execution.
    + *  Note 2: For parallel execution in multi-threaded environments,
    + *         use one different context per thread .
      */
     typedef struct ZSTD_CCtx_s ZSTD_CCtx;
     ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
    -ZSTDLIB_API size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* accept NULL pointer */
    +ZSTDLIB_API size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* compatible with NULL pointer */
     
     /*! ZSTD_compressCCtx() :
      *  Same as ZSTD_compress(), using an explicit ZSTD_CCtx.
    @@ -269,7 +277,7 @@ ZSTDLIB_API size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* accept NULL pointer *
      *  this function compresses at the requested compression level,
      *  __ignoring any other advanced parameter__ .
      *  If any advanced parameter was set using the advanced API,
    - *  they will all be reset. Only `compressionLevel` remains.
    + *  they will all be reset. Only @compressionLevel remains.
      */
     ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
                                          void* dst, size_t dstCapacity,
    @@ -1207,6 +1215,8 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
     #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
     #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY
     
    +#include    /* INT_MAX */
    +
     /* This can be overridden externally to hide static symbols. */
     #ifndef ZSTDLIB_STATIC_API
     #  if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
    diff --git a/lib/zstd_errors.h b/lib/zstd_errors.h
    index dc75eeeba..20e488f15 100644
    --- a/lib/zstd_errors.h
    +++ b/lib/zstd_errors.h
    @@ -15,10 +15,6 @@
     extern "C" {
     #endif
     
    -/*===== dependency =====*/
    -#include    /* size_t */
    -
    -
     /* =====   ZSTDERRORLIB_API : control library symbols visibility   ===== */
     #ifndef ZSTDERRORLIB_VISIBLE
        /* Backwards compatibility with old macro name */
    @@ -100,10 +96,6 @@ typedef enum {
       ZSTD_error_maxCode = 120  /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */
     } ZSTD_ErrorCode;
     
    -/*! ZSTD_getErrorCode() :
    -    convert a `size_t` function result into a `ZSTD_ErrorCode` enum type,
    -    which can be used to compare with enum list published above */
    -ZSTDERRORLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult);
     ZSTDERRORLIB_API const char* ZSTD_getErrorString(ZSTD_ErrorCode code);   /**< Same as ZSTD_getErrorName, but using a `ZSTD_ErrorCode` enum argument */
     
     
    
    From adbb536d00a1a67f2654040fd201760e2abfb20c Mon Sep 17 00:00:00 2001
    From: Yann Collet 
    Date: Thu, 31 Oct 2024 14:38:36 -0700
    Subject: [PATCH 2/3] fixed single file library test
    
    copy "zstd_errors.h" alongside "zstd.h" to pass compilation test.
    ---
     build/single_file_libs/build_library_test.sh | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/build/single_file_libs/build_library_test.sh b/build/single_file_libs/build_library_test.sh
    index f4ba109ab..b67cd99a0 100755
    --- a/build/single_file_libs/build_library_test.sh
    +++ b/build/single_file_libs/build_library_test.sh
    @@ -70,6 +70,7 @@ echo "Single file library creation script: PASSED"
     
     # Copy the header to here (for the tests)
     cp "$ZSTD_SRC_ROOT/zstd.h" examples/zstd.h
    +cp "$ZSTD_SRC_ROOT/zstd_errors.h" examples/zstd_errors.h
     
     # Compile the generated output
     cc -Wall -Wextra -Werror -Wshadow -pthread -I. -Os -g0 -o $OUT_FILE zstd.c examples/roundtrip.c
    
    From 2e02cd330dee3fcf9a8609b90ed7b965e0a6f9a1 Mon Sep 17 00:00:00 2001
    From: Yann Collet 
    Date: Thu, 31 Oct 2024 15:06:48 -0700
    Subject: [PATCH 3/3] inform manual users that it's automatically generated
    
    suggested by @Eugeny1
    ---
     contrib/gen_html/gen_html.cpp |  1 +
     doc/zstd_manual.html          | 49 +++++++++++++++++++++++++----------
     lib/zstd.h                    |  2 +-
     3 files changed, 37 insertions(+), 15 deletions(-)
    
    diff --git a/contrib/gen_html/gen_html.cpp b/contrib/gen_html/gen_html.cpp
    index 1da5879ad..adf0f41b9 100644
    --- a/contrib/gen_html/gen_html.cpp
    +++ b/contrib/gen_html/gen_html.cpp
    @@ -211,6 +211,7 @@ int main(int argc, char *argv[]) {
     
         ostream << "\n\n\n" << version << "\n\n" << endl;
         ostream << "

    " << version << "

    \n"; + ostream << "Note: the content of this file has been automatically generated by parsing \"zstd.h\" \n"; ostream << "
    \n

    Contents

    \n
      \n"; for (size_t i=0; i -zstd 1.5.6 Manual +zstd 1.5.7 Manual -

      zstd 1.5.6 Manual

      +

      zstd 1.5.7 Manual

      +Note: the content of this file has been automatically generated by parsing "zstd.h"

      Contents

        @@ -145,17 +146,35 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);


    Compression helper functions


    -
    size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
    -

    +
    #define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00ULL : 0xFF00FF00U)
    +#define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
    +size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
    +

    maximum compressed size in worst case single-pass scenario. + When invoking `ZSTD_compress()`, or any other one-pass compression function, + it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + as it eliminates one potential failure scenario, + aka not enough room in dst buffer to write the compressed frame. + Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + In which case, ZSTD_compressBound() will return an error code + which can be tested using ZSTD_isError(). + + ZSTD_COMPRESSBOUND() : + same as ZSTD_compressBound(), but as a macro. + It can be used to produce constants, which can be useful for static allocation, + for example to size a static array on stack. + Will produce constant value 0 if srcSize is too large. + +


    +

    Error helper functions

    #include "zstd_errors.h" /* list of errors */
     /* ZSTD_isError() :
      * Most ZSTD_* functions returning a size_t value can be tested for error,
      * using ZSTD_isError().
      * @return 1 if error, 0 otherwise
      */
    -unsigned     ZSTD_isError(size_t code);        /*!< tells if a `size_t` function result is an error code */
    +unsigned     ZSTD_isError(size_t result);      /*!< tells if a `size_t` function result is an error code */
     ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); /* convert a result into an error code, which can be compared to error enum list */
    -const char*  ZSTD_getErrorName(size_t code);   /*!< provides readable string from an error code */
    +const char*  ZSTD_getErrorName(size_t result); /*!< provides readable string from a function result */
     int          ZSTD_minCLevel(void);             /*!< minimum negative compression level allowed, requires v1.4.0+ */
     int          ZSTD_maxCLevel(void);             /*!< maximum compression level available */
     int          ZSTD_defaultCLevel(void);         /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
    @@ -163,17 +182,17 @@ int          ZSTD_defaultCLevel(void);         /*!< default compression leve
     

    Explicit context

    
     
     

    Compression context

      When compressing many times,
    -  it is recommended to allocate a context just once,
    +  it is recommended to allocate a compression context just once,
       and reuse it for each successive compression operation.
    -  This will make workload friendlier for system's memory.
    +  This will make the workload easier for system's memory.
       Note : re-using context is just a speed / resource optimization.
              It doesn't change the compression ratio, which remains identical.
    -  Note 2 : In multi-threaded environments,
    -         use one different context per thread for parallel execution.
    +  Note 2: For parallel execution in multi-threaded environments,
    +         use one different context per thread .
      
     
    typedef struct ZSTD_CCtx_s ZSTD_CCtx;
     ZSTD_CCtx* ZSTD_createCCtx(void);
    -size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* accept NULL pointer */
    +size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* compatible with NULL pointer */
     

    size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
                              void* dst, size_t dstCapacity,
    @@ -184,7 +203,7 @@ size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* accept NULL pointer */
       this function compresses at the requested compression level,
       __ignoring any other advanced parameter__ .
       If any advanced parameter was set using the advanced API,
    -  they will all be reset. Only `compressionLevel` remains.
    +  they will all be reset. Only @compressionLevel remains.
      
     


    @@ -384,7 +403,8 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
    /* accept NULL pointer */ * ZSTD_c_stableOutBuffer * ZSTD_c_blockDelimiters * ZSTD_c_validateSequences - * ZSTD_c_useBlockSplitter + * ZSTD_c_blockSplitterLevel + * ZSTD_c_splitAfterSequences * ZSTD_c_useRowMatchFinder * ZSTD_c_prefetchCDictTables * ZSTD_c_enableSeqProducerFallback @@ -411,7 +431,8 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ ZSTD_c_experimentalParam16=1013, ZSTD_c_experimentalParam17=1014, ZSTD_c_experimentalParam18=1015, - ZSTD_c_experimentalParam19=1016 + ZSTD_c_experimentalParam19=1016, + ZSTD_c_experimentalParam20=1017 } ZSTD_cParameter;

    typedef struct {
    diff --git a/lib/zstd.h b/lib/zstd.h
    index 22aca768c..d2d6795e4 100644
    --- a/lib/zstd.h
    +++ b/lib/zstd.h
    @@ -218,7 +218,7 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
     
     /*======  Compression helper functions  ======*/
     
    -/* ZSTD_compressBound() :
    +/*! ZSTD_compressBound() :
      * maximum compressed size in worst case single-pass scenario.
      * When invoking `ZSTD_compress()`, or any other one-pass compression function,
      * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)