]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Change name to to findFrameCompressedSize and add skippable support
authorSean Purcell <me@seanp.xyz>
Wed, 22 Feb 2017 20:12:32 +0000 (12:12 -0800)
committerSean Purcell <me@seanp.xyz>
Wed, 22 Feb 2017 20:12:34 +0000 (12:12 -0800)
20 files changed:
NEWS
lib/decompress/zstd_decompress.c
lib/legacy/zstd_legacy.h
lib/legacy/zstd_v01.c
lib/legacy/zstd_v01.h
lib/legacy/zstd_v02.c
lib/legacy/zstd_v02.h
lib/legacy/zstd_v03.c
lib/legacy/zstd_v03.h
lib/legacy/zstd_v04.c
lib/legacy/zstd_v04.h
lib/legacy/zstd_v05.c
lib/legacy/zstd_v05.h
lib/legacy/zstd_v06.c
lib/legacy/zstd_v06.h
lib/legacy/zstd_v07.c
lib/legacy/zstd_v07.h
lib/zstd.h
tests/fuzzer.c
tests/symbols.c

diff --git a/NEWS b/NEWS
index be334975433f068d14a394769f141178b9b26b91..96ff25fd75b608747fe08794ae86b998f20647a6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,7 @@ v1.1.4
 cli : new : can compress in *.gz format, using --format=gzip command, by Przemyslaw Skibinski
 cli : new : advanced benchmark command --priority=rt
 cli : fix : write on sparse-enabled file systems in 32-bits mode, by @ds77
-API : new : ZSTD_getFrameCompressedSize(), ZSTD_getFrameContentSize(), ZSTD_findDecompressedSize(), by Sean Purcell
+API : new : ZSTD_findFrameCompressedSize(), ZSTD_getFrameContentSize(), ZSTD_findDecompressedSize(), by Sean Purcell
 API : change : ZSTD_compress*() with srcSize==0 create an empty-frame of known size
 build:new : meson build system in contrib/meson, by Dima Krasner
 doc : new : educational decoder, by Sean Purcell
index eda8b9dd50f9f4e29d6385d5afceef16303abd1b..362da1a76608c973e26c3ca63c6e48c949d5072b 100644 (file)
@@ -369,7 +369,7 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
                 totalDstSize += ret;
             }
             {
-                size_t const frameSrcSize = ZSTD_getFrameCompressedSize(src, srcSize);
+                size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
                 if (ZSTD_isError(frameSrcSize)) {
                     return ZSTD_CONTENTSIZE_ERROR;
                 }
@@ -1437,17 +1437,20 @@ size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t len
     return length;
 }
 
-/** ZSTD_getFrameCompressedSize() :
+/** ZSTD_findFrameCompressedSize() :
  *  compatible with legacy mode
  *  `src` must point to the start of a ZSTD or ZSTD legacy frame
  *  `srcSize` must be at least as large as the frame contained
  *  @return : the compressed size of the frame starting at `src` */
-size_t ZSTD_getFrameCompressedSize(const void *src, size_t srcSize)
+size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
 {
 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
-    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_getFrameCompressedSizeLegacy(src, srcSize);
+    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
 #endif
-    {
+    if (srcSize >= ZSTD_skippableHeaderSize &&
+            (MEM_readLE32(src) & 0xFFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+        return ZSTD_skippableHeaderSize + MEM_readLE32((const BYTE*)src + 4);
+    } else {
         const BYTE* ip = (const BYTE*)src;
         const BYTE* const ipstart = ip;
         size_t remainingSize = srcSize;
@@ -1576,7 +1579,7 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
 
 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
         if (ZSTD_isLegacy(src, srcSize)) {
-            size_t const frameSize = ZSTD_getFrameCompressedSizeLegacy(src, srcSize);
+            size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
             size_t decodedSize;
             if (ZSTD_isError(frameSize)) return frameSize;
 
index b0a7b71d63e6e8199b40fe39500f4d9db0bd2e84..707e76f0a080a7f066631647a48632ced216aa2a 100644 (file)
@@ -123,26 +123,26 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
     }
 }
 
-MEM_STATIC size_t ZSTD_getFrameCompressedSizeLegacy(const void *src,
+MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src,
                                              size_t compressedSize)
 {
     U32 const version = ZSTD_isLegacy(src, compressedSize);
     switch(version)
     {
         case 1 :
-            return ZSTDv01_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv01_findFrameCompressedSize(src, compressedSize);
         case 2 :
-            return ZSTDv02_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv02_findFrameCompressedSize(src, compressedSize);
         case 3 :
-            return ZSTDv03_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv03_findFrameCompressedSize(src, compressedSize);
         case 4 :
-            return ZSTDv04_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv04_findFrameCompressedSize(src, compressedSize);
         case 5 :
-            return ZSTDv05_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv05_findFrameCompressedSize(src, compressedSize);
         case 6 :
-            return ZSTDv06_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv06_findFrameCompressedSize(src, compressedSize);
         case 7 :
-            return ZSTDv07_getFrameCompressedSize(src, compressedSize);
+            return ZSTDv07_findFrameCompressedSize(src, compressedSize);
         default :
             return ERROR(prefix_unknown);
     }
index a0c78a4b8e82e2e606dc2b5079e4da4d9c77a971..bcacb8d5d7a28a2b360223192cd74cc55b2af75b 100644 (file)
@@ -1992,7 +1992,7 @@ size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t
     return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
 }
 
-size_t ZSTDv01_getFrameCompressedSize(const void* src, size_t srcSize)
+size_t ZSTDv01_findFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index 21959fcd6a6a581547aa5c34a4bf5157bad9e709..13cb3acfdc3b9a0ae8dc3e53331699f66d90776c 100644 (file)
@@ -40,7 +40,7 @@ ZSTDv01_getFrameSrcSize() : get the source length of a ZSTD frame compliant with
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv01_isError())
 */
-size_t ZSTDv01_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv01_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv01_isError() : tells if the result of ZSTDv01_decompress() is an error
index 6cbf80234a5567ca664f622387e9db647441e6d0..2297b28c8b2e49803d3606bab898691e0267be4d 100644 (file)
@@ -3378,7 +3378,7 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
     return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
 }
 
-static size_t ZSTD_getFrameCompressedSize(const void *src, size_t srcSize)
+static size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
 {
 
     const BYTE* ip = (const BYTE*)src;
@@ -3524,9 +3524,9 @@ size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
        return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
 }
 
-size_t ZSTDv02_getFrameCompressedSize(const void *src, size_t compressedSize)
+size_t ZSTDv02_findFrameCompressedSize(const void *src, size_t compressedSize)
 {
-    return ZSTD_getFrameCompressedSize(src, compressedSize);
+    return ZSTD_findFrameCompressedSize(src, compressedSize);
 }
 
 ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
index 9542fc0ee87d3eb143887a26bbbc770f97fb7dd4..d14f0293cbe2124d295dd6c1cbb9953c11803685 100644 (file)
@@ -40,7 +40,7 @@ ZSTDv02_getFrameSrcSize() : get the source length of a ZSTD frame compliant with
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv02_isError())
 */
-size_t ZSTDv02_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv02_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv02_isError() : tells if the result of ZSTDv02_decompress() is an error
index 98b93c49b53592ca3280d0f3ed1ea08bba2cf2bc..ef654931f5287cebd594f4b14e8b12b418ef2ade 100644 (file)
@@ -3019,7 +3019,7 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
     return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
 }
 
-static size_t ZSTD_getFrameCompressedSize(const void* src, size_t srcSize)
+static size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
@@ -3165,9 +3165,9 @@ size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
        return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
 }
 
-size_t ZSTDv03_getFrameCompressedSize(const void* src, size_t srcSize)
+size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t srcSize)
 {
-    return ZSTD_getFrameCompressedSize(src, srcSize);
+    return ZSTD_findFrameCompressedSize(src, srcSize);
 }
 
 ZSTDv03_Dctx* ZSTDv03_createDCtx(void)
index 46969410a4933ed12d2d81f568a3864ae56d42ad..07f7597bb7c3440d4bd710597c43b330d2a3334a 100644 (file)
@@ -40,7 +40,7 @@ ZSTDv03_getFrameSrcSize() : get the source length of a ZSTD frame compliant with
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv03_isError())
 */
-size_t ZSTDv03_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t compressedSize);
 
     /**
 ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error
index 8c929b053cb9262a3fc784c99d5c0cdf2b6677a9..09040e68ec56e7d4ffb58ee7e6f4153e051e2486 100644 (file)
@@ -3326,7 +3326,7 @@ static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
     return op-ostart;
 }
 
-static size_t ZSTD_getFrameCompressedSize(const void* src, size_t srcSize)
+static size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
@@ -3782,9 +3782,9 @@ size_t ZSTDv04_decompress(void* dst, size_t maxDstSize, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv04_getFrameCompressedSize(const void* src, size_t srcSize)
+size_t ZSTDv04_findFrameCompressedSize(const void* src, size_t srcSize)
 {
-    return ZSTD_getFrameCompressedSize(src, srcSize);
+    return ZSTD_findFrameCompressedSize(src, srcSize);
 }
 
 size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
index bcef1fe96908a4944dc0b8a26ecac92d75e5d07b..1b5439d39249625fe30eb72b89a1409b2a0564b8 100644 (file)
@@ -40,7 +40,7 @@ ZSTDv04_getFrameSrcSize() : get the source length of a ZSTD frame compliant with
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv04_isError())
 */
-size_t ZSTDv04_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv04_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error
index 9689b170c415b1930c06199fa2dac8faf099c5de..a6f5f5dbbd16cf6878e3165c6a4385d161153724 100644 (file)
@@ -3583,7 +3583,7 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv05_getFrameCompressedSize(const void *src, size_t srcSize)
+size_t ZSTDv05_findFrameCompressedSize(const void *src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index 157dbc57b8f96a4986ed0460efeb352c60fbfddb..8ce662fd9fc684e3a679a2f757774f0e707f1c49 100644 (file)
@@ -38,7 +38,7 @@ ZSTDv05_getFrameSrcSize() : get the source length of a ZSTD frame
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv05_isError())
 */
-size_t ZSTDv05_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv05_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /* *************************************
 *  Helper functions
index f586db2266d70691a5fe247b2dfc2b1cee832bd6..a4258b67a6180f44d47cdeb5fd89dc4e76e52b31 100644 (file)
@@ -3729,7 +3729,7 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv06_getFrameCompressedSize(const void* src, size_t srcSize)
+size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index ef1feb2f2d97fdf11b1af2879b72e6ec6b4f2070..10c9c77259742e9f18eefbeffdf20cc4e925c8ee 100644 (file)
@@ -47,7 +47,7 @@ ZSTDv06_getFrameSrcSize() : get the source length of a ZSTD frame
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv06_isError())
 */
-size_t ZSTDv06_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /* *************************************
 *  Helper functions
index 07099d5abd987a30b78fb58203b6736d4f075eeb..e67916b3c3d430ff2041b685a749f88e7a41a18a 100644 (file)
@@ -3968,7 +3968,7 @@ size_t ZSTDv07_decompress(void* dst, size_t dstCapacity, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv07_getFrameCompressedSize(const void* src, size_t srcSize)
+size_t ZSTDv07_findFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index a79cbb8835d491b2b3e95e411dfb8d3dde98acc1..cc95c661bc9a2b9f17cbd1b2ded84c5a360b7480 100644 (file)
@@ -54,7 +54,7 @@ ZSTDv07_getFrameSrcSize() : get the source length of a ZSTD frame
     return : the number of bytes that would be read to decompress this frame
              or an errorCode if it fails (which can be tested using ZSTDv07_isError())
 */
-size_t ZSTDv07_getFrameCompressedSize(const void* src, size_t compressedSize);
+size_t ZSTDv07_findFrameCompressedSize(const void* src, size_t compressedSize);
 
 /*======  Helper functions  ======*/
 ZSTDLIBv07_API unsigned    ZSTDv07_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
index c0a1c7d1c22ef06fc2dabc0310ee48a0cf9311f1..9820b5379f37cc11dd6e46b31360acd8ebf1183a 100644 (file)
@@ -400,12 +400,12 @@ typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; v
 *  Compressed size functions
 ***************************************/
 
-/*! ZSTD_getFrameCompressedSize() :
+/*! ZSTD_findFrameCompressedSize() :
  *  `src` should point to the start of a ZSTD encoded frame
  *  `srcSize` must be at least as large as the frame
  *  @return : the compressed size of the frame pointed to by `src`, suitable to pass to
  *      `ZSTD_decompress` or similar, or an error code if given invalid input. */
-ZSTDLIB_API size_t ZSTD_getFrameCompressedSize(const void* src, size_t srcSize);
+ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
 
 /***************************************
 *  Decompressed size functions
index 590bcb393725530a3aaf824d55315462aa258c63..0339985256223e869d42596c75b25851cab665fa 100644 (file)
@@ -545,6 +545,13 @@ static int basicUnitTests(U32 seed, double compressibility)
       if (r != _3BYTESTESTLENGTH) goto _output_error; }
     DISPLAYLEVEL(4, "OK \n");
 
+    /* findFrameCompressedSize on skippable frames */
+    DISPLAYLEVEL(4, "test%3i : frame compressed size of skippable frame : ", testNb++);
+    {   const char* frame = "\x50\x2a\x4d\x18\x05\x0\x0\0abcde";
+        size_t const frameSrcSize = 13;
+        if (ZSTD_findFrameCompressedSize(frame, frameSrcSize) != frameSrcSize) goto _output_error; }
+    DISPLAYLEVEL(4, "OK \n");
+
     /* error string tests */
     DISPLAYLEVEL(4, "test%3i : testing ZSTD error code strings : ", testNb++);
     if (strcmp("No error detected", ZSTD_getErrorName((ZSTD_ErrorCode)(0-ZSTD_error_no_error))) != 0) goto _output_error;
index afdb00064e13b9b79ade9325b1918f68fd8a891d..7dacfc05892d51735f8fa7989054dc0a28f32e24 100644 (file)
@@ -16,6 +16,7 @@ static const void *symbols[] = {
   &ZSTD_decompress,
   &ZSTD_getDecompressedSize,
   &ZSTD_findDecompressedSize,
+  &ZSTD_findFrameCompressedSize,
   &ZSTD_getFrameContentSize,
   &ZSTD_maxCLevel,
   &ZSTD_compressBound,