]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed ZSTD_compress2()
authorYann Collet <cyan@fb.com>
Tue, 11 Dec 2018 01:33:49 +0000 (17:33 -0800)
committerYann Collet <cyan@fb.com>
Tue, 11 Dec 2018 01:33:49 +0000 (17:33 -0800)
as suggested by @terrelln

lib/compress/zstd_compress.c
lib/zstd.h

index 3b84e1b5cb50bea85cf81fc0b0780c9bfa01766b..3d6ed47eb643622508ea2ade3e14ef716e85a73c 100644 (file)
@@ -4060,19 +4060,21 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx,
                       void* dst, size_t dstCapacity,
                       const void* src, size_t srcSize)
 {
-    size_t oPos = 0;
-    size_t iPos = 0;
-    size_t const result = ZSTD_compressStream2_simpleArgs(cctx,
-                                    dst, dstCapacity, &oPos,
-                                    src, srcSize, &iPos,
-                                    ZSTD_e_end);
-    assert(iPos == srcSize);
-    if (ZSTD_isError(result)) return result;
-    if (result != 0) {  /* compression not completed, due to lack of output space */
-        assert(oPos == dstCapacity);
-        return ERROR(dstSize_tooSmall);
+    ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
+    {   size_t oPos = 0;
+        size_t iPos = 0;
+        size_t const result = ZSTD_compressStream2_simpleArgs(cctx,
+                                        dst, dstCapacity, &oPos,
+                                        src, srcSize, &iPos,
+                                        ZSTD_e_end);
+        if (ZSTD_isError(result)) return result;
+        assert(iPos == srcSize);
+        if (result != 0) {  /* compression not completed, due to lack of output space */
+            assert(oPos == dstCapacity);
+            return ERROR(dstSize_tooSmall);
+        }
+        return oPos;
     }
-    return oPos;
 }
 
 /*======   Finalize   ======*/
index 72289d99d0384ea1634dd6c57ee8062d0528093d..0de81f3acab404ba7b4ab5962b9247758cbbdd6c 100644 (file)
@@ -750,6 +750,8 @@ ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
 
 /*! ZSTD_compress2() :
  *  Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.
+ *  ZSTD_compress2() always starts a new frame.
+ *  Should cctx hold data from a previously unfinished frame, everything about it is forgotten.
  *  - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
  *  - The function is always blocking, returns when compression is completed.
  *  Hint : compression runs faster if `dstCapacity` >=  `ZSTD_compressBound(srcSize)`.