@@ -105,7 +105,7 @@ struct ZSTD_DCtx_s
105
105
const void * vBase ; /* virtual start of previous segment if it was just before current one */
106
106
const void * dictEnd ; /* end of previous segment */
107
107
size_t expected ;
108
- ZSTD_frameParams fParams ;
108
+ ZSTD_frameHeader fParams ;
109
109
blockType_e bType ; /* used in ZSTD_decompressContinue(), to transfer blockType between header decoding and block decoding stages */
110
110
ZSTD_dStage stage ;
111
111
U32 litEntropy ;
@@ -219,22 +219,23 @@ static size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
219
219
}
220
220
221
221
222
- /** ZSTD_getFrameParams () :
222
+ /** ZSTD_getFrameHeader () :
223
223
* decode Frame Header, or require larger `srcSize`.
224
- * @return : 0, `fparamsPtr ` is correctly filled,
224
+ * @return : 0, `zfhPtr ` is correctly filled,
225
225
* >0, `srcSize` is too small, result is expected `srcSize`,
226
226
* or an error code, which can be tested using ZSTD_isError() */
227
- size_t ZSTD_getFrameParams ( ZSTD_frameParams * fparamsPtr , const void * src , size_t srcSize )
227
+ size_t ZSTD_getFrameHeader ( ZSTD_frameHeader * zfhPtr , const void * src , size_t srcSize )
228
228
{
229
229
const BYTE * ip = (const BYTE * )src ;
230
-
231
230
if (srcSize < ZSTD_frameHeaderSize_prefix ) return ZSTD_frameHeaderSize_prefix ;
231
+
232
232
if (MEM_readLE32 (src ) != ZSTD_MAGICNUMBER ) {
233
233
if ((MEM_readLE32 (src ) & 0xFFFFFFF0U ) == ZSTD_MAGIC_SKIPPABLE_START ) {
234
+ /* skippable frame */
234
235
if (srcSize < ZSTD_skippableHeaderSize ) return ZSTD_skippableHeaderSize ; /* magic number + skippable frame length */
235
- memset (fparamsPtr , 0 , sizeof (* fparamsPtr ));
236
- fparamsPtr -> frameContentSize = MEM_readLE32 ((const char * )src + 4 );
237
- fparamsPtr -> windowSize = 0 ; /* windowSize==0 means a frame is skippable */
236
+ memset (zfhPtr , 0 , sizeof (* zfhPtr ));
237
+ zfhPtr -> frameContentSize = MEM_readLE32 ((const char * )src + 4 );
238
+ zfhPtr -> windowSize = 0 ; /* windowSize==0 means a frame is skippable */
238
239
return 0 ;
239
240
}
240
241
return ERROR (prefix_unknown );
@@ -281,10 +282,10 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
281
282
}
282
283
if (!windowSize ) windowSize = (U32 )frameContentSize ;
283
284
if (windowSize > windowSizeMax ) return ERROR (frameParameter_windowTooLarge );
284
- fparamsPtr -> frameContentSize = frameContentSize ;
285
- fparamsPtr -> windowSize = windowSize ;
286
- fparamsPtr -> dictID = dictID ;
287
- fparamsPtr -> checksumFlag = checksumFlag ;
285
+ zfhPtr -> frameContentSize = frameContentSize ;
286
+ zfhPtr -> windowSize = windowSize ;
287
+ zfhPtr -> dictID = dictID ;
288
+ zfhPtr -> checksumFlag = checksumFlag ;
288
289
}
289
290
return 0 ;
290
291
}
@@ -302,9 +303,8 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
302
303
return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret ;
303
304
}
304
305
#endif
305
- {
306
- ZSTD_frameParams fParams ;
307
- if (ZSTD_getFrameParams (& fParams , src , srcSize ) != 0 ) return ZSTD_CONTENTSIZE_ERROR ;
306
+ { ZSTD_frameHeader fParams ;
307
+ if (ZSTD_getFrameHeader (& fParams , src , srcSize ) != 0 ) return ZSTD_CONTENTSIZE_ERROR ;
308
308
if (fParams .windowSize == 0 ) {
309
309
/* Either skippable or empty frame, size == 0 either way */
310
310
return 0 ;
@@ -389,7 +389,7 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
389
389
* @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
390
390
static size_t ZSTD_decodeFrameHeader (ZSTD_DCtx * dctx , const void * src , size_t headerSize )
391
391
{
392
- size_t const result = ZSTD_getFrameParams (& (dctx -> fParams ), src , headerSize );
392
+ size_t const result = ZSTD_getFrameHeader (& (dctx -> fParams ), src , headerSize );
393
393
if (ZSTD_isError (result )) return result ; /* invalid header */
394
394
if (result > 0 ) return ERROR (srcSize_wrong ); /* headerSize too small */
395
395
if (dctx -> fParams .dictID && (dctx -> dictID != dctx -> fParams .dictID )) return ERROR (dictionary_wrong );
@@ -1364,13 +1364,13 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
1364
1364
const BYTE * ip = (const BYTE * )src ;
1365
1365
const BYTE * const ipstart = ip ;
1366
1366
size_t remainingSize = srcSize ;
1367
- ZSTD_frameParams fParams ;
1367
+ ZSTD_frameHeader fParams ;
1368
1368
1369
1369
size_t const headerSize = ZSTD_frameHeaderSize (ip , remainingSize );
1370
1370
if (ZSTD_isError (headerSize )) return headerSize ;
1371
1371
1372
1372
/* Frame Header */
1373
- { size_t const ret = ZSTD_getFrameParams (& fParams , ip , remainingSize );
1373
+ { size_t const ret = ZSTD_getFrameHeader (& fParams , ip , remainingSize );
1374
1374
if (ZSTD_isError (ret )) return ret ;
1375
1375
if (ret > 0 ) return ERROR (srcSize_wrong );
1376
1376
}
@@ -1969,6 +1969,14 @@ size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
1969
1969
}
1970
1970
}
1971
1971
1972
+ /*! ZSTD_estimateDDictSize() :
1973
+ * Estimate amount of memory that will be needed to create a dictionary for decompression.
1974
+ * Note : if dictionary is created "byReference", reduce this amount by dictSize */
1975
+ size_t ZSTD_estimateDDictSize (size_t dictSize )
1976
+ {
1977
+ return dictSize + sizeof (ZSTD_DDict );
1978
+ }
1979
+
1972
1980
size_t ZSTD_sizeof_DDict (const ZSTD_DDict * ddict )
1973
1981
{
1974
1982
if (ddict == NULL ) return 0 ; /* support sizeof on NULL */
@@ -2008,11 +2016,11 @@ unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
2008
2016
* Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`.
2009
2017
* - This is not a Zstandard frame.
2010
2018
* When identifying the exact failure cause, it's possible to use
2011
- * ZSTD_getFrameParams (), which will provide a more precise error code. */
2019
+ * ZSTD_getFrameHeader (), which will provide a more precise error code. */
2012
2020
unsigned ZSTD_getDictID_fromFrame (const void * src , size_t srcSize )
2013
2021
{
2014
- ZSTD_frameParams zfp = { 0 , 0 , 0 , 0 };
2015
- size_t const hError = ZSTD_getFrameParams (& zfp , src , srcSize );
2022
+ ZSTD_frameHeader zfp = { 0 , 0 , 0 , 0 };
2023
+ size_t const hError = ZSTD_getFrameHeader (& zfp , src , srcSize );
2016
2024
if (ZSTD_isError (hError )) return 0 ;
2017
2025
return zfp .dictID ;
2018
2026
}
@@ -2045,7 +2053,7 @@ struct ZSTD_DStream_s {
2045
2053
ZSTD_DCtx * dctx ;
2046
2054
ZSTD_DDict * ddictLocal ;
2047
2055
const ZSTD_DDict * ddict ;
2048
- ZSTD_frameParams fParams ;
2056
+ ZSTD_frameHeader fParams ;
2049
2057
ZSTD_dStreamStage stage ;
2050
2058
char * inBuff ;
2051
2059
size_t inBuffSize ;
@@ -2175,6 +2183,15 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds)
2175
2183
+ zds -> inBuffSize + zds -> outBuffSize ;
2176
2184
}
2177
2185
2186
+ size_t ZSTD_estimateDStreamSize (ZSTD_frameHeader fHeader )
2187
+ {
2188
+ size_t const windowSize = fHeader .windowSize ;
2189
+ size_t const blockSize = MIN (windowSize , ZSTD_BLOCKSIZE_ABSOLUTEMAX );
2190
+ size_t const inBuffSize = blockSize ; /* no block can be larger */
2191
+ size_t const outBuffSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2 );
2192
+ return sizeof (ZSTD_DStream ) + ZSTD_estimateDCtxSize () + inBuffSize + outBuffSize ;
2193
+ }
2194
+
2178
2195
2179
2196
/* ***** Decompression ***** */
2180
2197
@@ -2209,7 +2226,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
2209
2226
/* fall-through */
2210
2227
2211
2228
case zdss_loadHeader :
2212
- { size_t const hSize = ZSTD_getFrameParams (& zds -> fParams , zds -> headerBuffer , zds -> lhSize );
2229
+ { size_t const hSize = ZSTD_getFrameHeader (& zds -> fParams , zds -> headerBuffer , zds -> lhSize );
2213
2230
if (ZSTD_isError (hSize ))
2214
2231
#if defined(ZSTD_LEGACY_SUPPORT ) && (ZSTD_LEGACY_SUPPORT >=1 )
2215
2232
{ U32 const legacyVersion = ZSTD_isLegacy (istart , iend - istart );
0 commit comments