]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
created ZSTD_writeFrameHeader()
authorYann Collet <yann.collet.73@gmail.com>
Tue, 12 Apr 2016 12:14:10 +0000 (14:14 +0200)
committerYann Collet <yann.collet.73@gmail.com>
Tue, 12 Apr 2016 12:14:10 +0000 (14:14 +0200)
lib/zstd_compress.c

index e9960a91a23c3899d6d67f0e3dbaef43ffc82ed8..eb5d8ae922c54ec154da970b250030b88b8cfe7b 100644 (file)
@@ -2249,6 +2249,30 @@ static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx* zc, const void* dict, si
     }
 }
 
+
+static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
+                                    ZSTD_parameters params, U64 pledgedSrcSize)
+{   BYTE* const op = (BYTE*)dst;
+    U32 const fcsId = (pledgedSrcSize>0) + (pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256);   /* 0-3 */
+    BYTE const fdescriptor = (BYTE)((params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN)   /* windowLog : 4 KB - 128 MB */
+                                  | (fcsId << 6) );
+    size_t const hSize = ZSTD_frameHeaderSize_min + ZSTD_fcs_fieldSize[fcsId];
+    if (hSize > dstCapacity) return ERROR(dstSize_tooSmall);
+
+    MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
+    op[4] = fdescriptor;
+    switch(fcsId)
+    {
+        default:   /* impossible */
+        case 0 : break;
+        case 1 : op[5] = (BYTE)(pledgedSrcSize); break;
+        case 2 : MEM_writeLE16(op+5, (U16)(pledgedSrcSize-256)); break;
+        case 3 : MEM_writeLE64(op+5, (U64)(pledgedSrcSize)); break;
+    }
+    return hSize;
+}
+
+
 /*! ZSTD_compressBegin_internal() :
 *   @return : 0, or an error code */
 static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* zc,
@@ -2263,22 +2287,8 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* zc,
       if (ZSTD_isError(resetError)) return resetError; }
 
     /* Write Frame Header into ctx headerBuffer */
-    MEM_writeLE32(zc->headerBuffer, ZSTD_MAGICNUMBER);
-    {   BYTE* const op = (BYTE*)zc->headerBuffer;
-        U32 const fcsId = (pledgedSrcSize>0) + (pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256);   /* 0-3 */
-        BYTE fdescriptor = (BYTE)(params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN);   /* windowLog : 4 KB - 128 MB */
-        fdescriptor |= (BYTE)(fcsId << 6);
-        op[4] = fdescriptor;
-        switch(fcsId)
-        {
-            default:   /* impossible */
-            case 0 : break;
-            case 1 : op[5] = (BYTE)(pledgedSrcSize); break;
-            case 2 : MEM_writeLE16(op+5, (U16)(pledgedSrcSize-256)); break;
-            case 3 : MEM_writeLE64(op+5, (U64)(pledgedSrcSize)); break;
-        }
-        zc->hbSize = ZSTD_frameHeaderSize_min + ZSTD_fcs_fieldSize[fcsId];
-    }
+    zc->hbSize = ZSTD_writeFrameHeader(zc->headerBuffer, ZSTD_FRAMEHEADERSIZE_MAX,
+                                       params, pledgedSrcSize);
 
     return ZSTD_compress_insertDictionary(zc, dict, dictSize);
 }