]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Implement skippable frame function
authorsenhuang42 <senhuang96@fb.com>
Mon, 21 Dec 2020 16:13:22 +0000 (11:13 -0500)
committersenhuang42 <senhuang96@fb.com>
Mon, 21 Dec 2020 16:13:22 +0000 (11:13 -0500)
lib/compress/zstd_compress.c
lib/zstd.h

index 386b051df635abd6bc4d1a1e0b3a4eeb7d1bca35..3e6bf7464e934dc54674420e30bb8cee36c6941b 100644 (file)
@@ -2954,6 +2954,26 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
     return pos;
 }
 
+/* ZSTD_generateSkippableFrame_advanced() :
+ * Writes out a skippable frame with the specified magic number variant (16 are supported), 
+ * from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15, and the desired source data.
+ * 
+ * Returns the total number of bytes written, or a ZSTD error code.
+ */
+size_t ZSTD_generateSkippableFrame_advanced(void* dst, size_t dstCapacity,
+                                            const void* src, size_t srcSize, U32 magicVariant) {
+    BYTE* op = dst;
+    RETURN_ERROR_IF(dstCapacity < srcSize + 8 /* Skippable frame overhead */,
+                    dstSize_tooSmall, "Not enough room for skippable frame");
+    RETURN_ERROR_IF(srcSize > (unsigned)0xFFFFFFFF, srcSize_wrong, "Src size too large for skippable frame");
+    RETURN_ERROR_IF(magicVariant > 15, parameter_outOfBound, "Skippable frame magic number variant not supported");
+
+    MEM_writeLE32(op, (U32)(ZSTD_MAGIC_SKIPPABLE_START + magicVariant));
+    MEM_writeLE32(op+4, (U32)srcSize);
+    ZSTD_memcpy(op+8, src, srcSize);
+    return srcSize + 8;
+}
+
 /* ZSTD_writeLastEmptyBlock() :
  * output an empty Block with end-of-frame mark to complete a frame
  * @return : size of data written into `dst` (== ZSTD_blockHeaderSize (defined in zstd_internal.h))
index b0ecdf55385cb34fa843411ddae3c78b6ff521e1..c34b439762de76a446a4a21ec198957003f2d8aa 100644 (file)
@@ -1372,6 +1372,22 @@ ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size
                                   const void* src, size_t srcSize);
 
 
+/*! ZSTD_generateSkippableFrame() :
+ * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer.
+ * 
+ * Skippable frames have a 4-byte magic number, which can range from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15.
+ * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so
+ * the final magic number will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant.
+ * 
+ * Returns an error if destination buffer is not large enough, if the source size is not representable
+ * with a 4-byte unsigned int, or if the magicVariant is greater than 15.
+ * 
+ * @return : number of bytes written or a ZSTD error.
+ */
+ZSTDLIB_API size_t ZSTD_generateSkippableFrame(void* dst, size_t dstCapacity,
+                                               const void* src, size_t srcSize, unsigned magicVariant);
+
+
 /***************************************
 *  Memory management
 ***************************************/