]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Expose frameSrcSize to experimental API 536/head
authorSean Purcell <me@seanp.xyz>
Fri, 10 Feb 2017 19:38:57 +0000 (11:38 -0800)
committerSean Purcell <me@seanp.xyz>
Fri, 10 Feb 2017 19:55:44 +0000 (11:55 -0800)
17 files changed:
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

index 18ee070cfc4974da52a596f7efae92ea384030cd..b8670315cf9d07c3fe2511eb29b6acc16415c82b 100644 (file)
@@ -306,8 +306,6 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
     return 0;
 }
 
-static size_t ZSTD_frameSrcSize(const void* src, size_t srcSize);
-
 /** ZSTD_getFrameContentSize() :
 *   compatible with legacy mode
 *   @return : decompressed size of the single frame pointed to be `src` if known, otherwise
@@ -371,17 +369,7 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
                 totalDstSize += ret;
             }
             {
-                size_t frameSrcSize;
-#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
-                if (ZSTD_isLegacy(src, srcSize))
-                {
-                    frameSrcSize = ZSTD_frameSrcSizeLegacy(src, srcSize);
-                }
-                else
-#endif
-                {
-                    frameSrcSize = ZSTD_frameSrcSize(src, srcSize);
-                }
+                size_t const frameSrcSize = ZSTD_getFrameCompressedSize(src, srcSize);
                 if (ZSTD_isError(frameSrcSize)) {
                     return ZSTD_CONTENTSIZE_ERROR;
                 }
@@ -1449,47 +1437,57 @@ size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t len
     return length;
 }
 
-static size_t ZSTD_frameSrcSize(const void *src, size_t srcSize)
+/** ZSTD_getFrameCompressedSize() :
+ *  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)
 {
-    const BYTE* ip = (const BYTE*)src;
-    const BYTE* const ipstart = ip;
-    size_t remainingSize = srcSize;
-    ZSTD_frameParams fParams;
+#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
+    if (ZSTD_isLegacy(src, srcSize)) return ZSTD_getFrameCompressedSizeLegacy(src, srcSize);
+#endif
+    {
+        const BYTE* ip = (const BYTE*)src;
+        const BYTE* const ipstart = ip;
+        size_t remainingSize = srcSize;
+        ZSTD_frameParams fParams;
 
-    size_t const headerSize = ZSTD_frameHeaderSize(ip, remainingSize);
-    if (ZSTD_isError(headerSize)) return headerSize;
+        size_t const headerSize = ZSTD_frameHeaderSize(ip, remainingSize);
+        if (ZSTD_isError(headerSize)) return headerSize;
 
-    /* Frame Header */
-    {
-        size_t const ret = ZSTD_getFrameParams(&fParams, ip, remainingSize);
-        if (ZSTD_isError(ret)) return ret;
-        if (ret > 0) return ERROR(srcSize_wrong);
-    }
+        /* Frame Header */
+        {
+            size_t const ret = ZSTD_getFrameParams(&fParams, ip, remainingSize);
+            if (ZSTD_isError(ret)) return ret;
+            if (ret > 0) return ERROR(srcSize_wrong);
+        }
 
-    ip += headerSize;
-    remainingSize -= headerSize;
+        ip += headerSize;
+        remainingSize -= headerSize;
 
-    /* Loop on each block */
-    while (1) {
-        blockProperties_t blockProperties;
-        size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
-        if (ZSTD_isError(cBlockSize)) return cBlockSize;
+        /* Loop on each block */
+        while (1) {
+            blockProperties_t blockProperties;
+            size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
+            if (ZSTD_isError(cBlockSize)) return cBlockSize;
 
-        if (ZSTD_blockHeaderSize + cBlockSize > remainingSize) return ERROR(srcSize_wrong);
+            if (ZSTD_blockHeaderSize + cBlockSize > remainingSize) return ERROR(srcSize_wrong);
 
-        ip += ZSTD_blockHeaderSize + cBlockSize;
-        remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
+            ip += ZSTD_blockHeaderSize + cBlockSize;
+            remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
 
-        if (blockProperties.lastBlock) break;
-    }
+            if (blockProperties.lastBlock) break;
+        }
 
-    if (fParams.checksumFlag) {   /* Frame content checksum verification */
-        if (remainingSize < 4) return ERROR(srcSize_wrong);
-        ip += 4;
-        remainingSize -= 4;
-    }
+        if (fParams.checksumFlag) {   /* Frame content checksum */
+            if (remainingSize < 4) return ERROR(srcSize_wrong);
+            ip += 4;
+            remainingSize -= 4;
+        }
 
-    return ip - ipstart;
+        return ip - ipstart;
+    }
 }
 
 /*! ZSTD_decompressFrame() :
@@ -1578,7 +1576,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_frameSrcSizeLegacy(src, srcSize);
+            size_t const frameSize = ZSTD_getFrameCompressedSizeLegacy(src, srcSize);
             size_t decodedSize;
             if (ZSTD_isError(frameSize)) return frameSize;
 
index c0369ab4f4618aa8c1685023217e6ccb535a58ba..b0a7b71d63e6e8199b40fe39500f4d9db0bd2e84 100644 (file)
@@ -123,26 +123,26 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
     }
 }
 
-MEM_STATIC size_t ZSTD_frameSrcSizeLegacy(const void *src,
+MEM_STATIC size_t ZSTD_getFrameCompressedSizeLegacy(const void *src,
                                              size_t compressedSize)
 {
     U32 const version = ZSTD_isLegacy(src, compressedSize);
     switch(version)
     {
         case 1 :
-            return ZSTDv01_frameSrcSize(src, compressedSize);
+            return ZSTDv01_getFrameCompressedSize(src, compressedSize);
         case 2 :
-            return ZSTDv02_frameSrcSize(src, compressedSize);
+            return ZSTDv02_getFrameCompressedSize(src, compressedSize);
         case 3 :
-            return ZSTDv03_frameSrcSize(src, compressedSize);
+            return ZSTDv03_getFrameCompressedSize(src, compressedSize);
         case 4 :
-            return ZSTDv04_frameSrcSize(src, compressedSize);
+            return ZSTDv04_getFrameCompressedSize(src, compressedSize);
         case 5 :
-            return ZSTDv05_frameSrcSize(src, compressedSize);
+            return ZSTDv05_getFrameCompressedSize(src, compressedSize);
         case 6 :
-            return ZSTDv06_frameSrcSize(src, compressedSize);
+            return ZSTDv06_getFrameCompressedSize(src, compressedSize);
         case 7 :
-            return ZSTDv07_frameSrcSize(src, compressedSize);
+            return ZSTDv07_getFrameCompressedSize(src, compressedSize);
         default :
             return ERROR(prefix_unknown);
     }
index c9b676ad8dca35308dd561cea1e18c01e159f0f3..a0c78a4b8e82e2e606dc2b5079e4da4d9c77a971 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_frameSrcSize(const void* src, size_t srcSize)
+size_t ZSTDv01_getFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index 9e5d553bfb733a3a123597ef815d75fdb0a4819b..21959fcd6a6a581547aa5c34a4bf5157bad9e709 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv01_getFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv01_isError() : tells if the result of ZSTDv01_decompress() is an error
index f3b107af3e56ce1eeddd5460d2432b46e45284d1..6cbf80234a5567ca664f622387e9db647441e6d0 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_frameSrcSize(const void *src, size_t srcSize)
+static size_t ZSTD_getFrameCompressedSize(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_frameSrcSize(const void *src, size_t compressedSize)
+size_t ZSTDv02_getFrameCompressedSize(const void *src, size_t compressedSize)
 {
-    return ZSTD_frameSrcSize(src, compressedSize);
+    return ZSTD_getFrameCompressedSize(src, compressedSize);
 }
 
 ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
index 45dc5f6ca074cdda6f1df7de1384689258e4bf36..9542fc0ee87d3eb143887a26bbbc770f97fb7dd4 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv02_getFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv02_isError() : tells if the result of ZSTDv02_decompress() is an error
index 2eba77ccc7d2ae8e42a9c92f077ba0e2751fb7d1..98b93c49b53592ca3280d0f3ed1ea08bba2cf2bc 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_frameSrcSize(const void* src, size_t srcSize)
+static size_t ZSTD_getFrameCompressedSize(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_frameSrcSize(const void* src, size_t srcSize)
+size_t ZSTDv03_getFrameCompressedSize(const void* src, size_t srcSize)
 {
-    return ZSTD_frameSrcSize(src, srcSize);
+    return ZSTD_getFrameCompressedSize(src, srcSize);
 }
 
 ZSTDv03_Dctx* ZSTDv03_createDCtx(void)
index 24dba1f59c13f0efe77e93b0759d90d5cc283ef3..46969410a4933ed12d2d81f568a3864ae56d42ad 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv03_getFrameCompressedSize(const void* src, size_t compressedSize);
 
     /**
 ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error
index 7c900e1e03a7dcc19937d69ea1f4d13f94cdc775..8c929b053cb9262a3fc784c99d5c0cdf2b6677a9 100644 (file)
@@ -3326,7 +3326,7 @@ static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
     return op-ostart;
 }
 
-static size_t ZSTD_frameSrcSize(const void* src, size_t srcSize)
+static size_t ZSTD_getFrameCompressedSize(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_frameSrcSize(const void* src, size_t srcSize)
+size_t ZSTDv04_getFrameCompressedSize(const void* src, size_t srcSize)
 {
-    return ZSTD_frameSrcSize(src, srcSize);
+    return ZSTD_getFrameCompressedSize(src, srcSize);
 }
 
 size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
index 671ba6dc0060b8c73cda47416ed89e0def1306f2..bcef1fe96908a4944dc0b8a26ecac92d75e5d07b 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv04_getFrameCompressedSize(const void* src, size_t compressedSize);
 
 /**
 ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error
index 85c0f0e735295ee561f1a107563b44f1277f6182..9689b170c415b1930c06199fa2dac8faf099c5de 100644 (file)
@@ -3583,7 +3583,7 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv05_frameSrcSize(const void *src, size_t srcSize)
+size_t ZSTDv05_getFrameCompressedSize(const void *src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index ef2d18d10512af7be2d7ae5d70c294b78ea16f00..157dbc57b8f96a4986ed0460efeb352c60fbfddb 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv05_getFrameCompressedSize(const void* src, size_t compressedSize);
 
 /* *************************************
 *  Helper functions
index 92c1a45c60562648abf1ed027b2dd36051b40946..4c8f068231140369dbfbdc086628af6f488d4675 100644 (file)
@@ -3729,7 +3729,7 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv06_frameSrcSize(const void* src, size_t srcSize)
+size_t ZSTDv06_getFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index 1fad7311e7b647c7f5455a0856b781af8e9d7b0a..ef1feb2f2d97fdf11b1af2879b72e6ec6b4f2070 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv06_getFrameCompressedSize(const void* src, size_t compressedSize);
 
 /* *************************************
 *  Helper functions
index 6228ee8707e64ee6c5f6cf89d8aed85945b2f3c8..441e4bc391e80e6e546d9ca357527b7cccbe6526 100644 (file)
@@ -3968,7 +3968,7 @@ size_t ZSTDv07_decompress(void* dst, size_t dstCapacity, const void* src, size_t
 #endif
 }
 
-size_t ZSTDv07_frameSrcSize(const void* src, size_t srcSize)
+size_t ZSTDv07_getFrameCompressedSize(const void* src, size_t srcSize)
 {
     const BYTE* ip = (const BYTE*)src;
     size_t remainingSize = srcSize;
index b02b3dce46e953efa02cc65540656e9b3debe9d3..a79cbb8835d491b2b3e95e411dfb8d3dde98acc1 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_frameSrcSize(const void* src, size_t compressedSize);
+size_t ZSTDv07_getFrameCompressedSize(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 bbfefb8db0faab8da746b37e6f2e0a5dd6fd9e49..e2f752ddcb4fe84696e3b213eebbb5f2d6836d39 100644 (file)
@@ -396,6 +396,17 @@ typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
 typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
 typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
 
+/***************************************
+*  Compressed size functions
+***************************************/
+
+/*! ZSTD_getFrameCompressedSize() :
+ *  `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);
+
 /***************************************
 *  Decompressed size functions
 ***************************************/