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
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;
}
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() :
#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;
}
}
-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);
}
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;
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
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;
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)
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
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;
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)
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
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;
#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); }
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
#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;
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
#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;
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
#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;
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 */
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
***************************************/