MCPcopy Create free account
hub / github.com/F-Stack/f-stack / ZSTD_writeFrameHeader

Function ZSTD_writeFrameHeader

freebsd/contrib/openzfs/module/zstd/lib/zstd.c:15741–15784  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15739
15740
15741static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
15742 const ZSTD_CCtx_params* params, U64 pledgedSrcSize, U32 dictID)
15743{ BYTE* const op = (BYTE*)dst;
15744 U32 const dictIDSizeCodeLength = (dictID>0) + (dictID>=256) + (dictID>=65536); /* 0-3 */
15745 U32 const dictIDSizeCode = params->fParams.noDictIDFlag ? 0 : dictIDSizeCodeLength; /* 0-3 */
15746 U32 const checksumFlag = params->fParams.checksumFlag>0;
15747 U32 const windowSize = (U32)1 << params->cParams.windowLog;
15748 U32 const singleSegment = params->fParams.contentSizeFlag && (windowSize >= pledgedSrcSize);
15749 BYTE const windowLogByte = (BYTE)((params->cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
15750 U32 const fcsCode = params->fParams.contentSizeFlag ?
15751 (pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) : 0; /* 0-3 */
15752 BYTE const frameHeaderDescriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) );
15753 size_t pos=0;
15754
15755 assert(!(params->fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN));
15756 RETURN_ERROR_IF(dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX, dstSize_tooSmall,
15757 "dst buf is too small to fit worst-case frame header size.");
15758 DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
15759 !params->fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode);
15760
15761 if (params->format == ZSTD_f_zstd1) {
15762 MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
15763 pos = 4;
15764 }
15765 op[pos++] = frameHeaderDescriptionByte;
15766 if (!singleSegment) op[pos++] = windowLogByte;
15767 switch(dictIDSizeCode)
15768 {
15769 default: assert(0); /* impossible */
15770 case 0 : break;
15771 case 1 : op[pos] = (BYTE)(dictID); pos++; break;
15772 case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
15773 case 3 : MEM_writeLE32(op+pos, dictID); pos+=4; break;
15774 }
15775 switch(fcsCode)
15776 {
15777 default: assert(0); /* impossible */
15778 case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
15779 case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
15780 case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
15781 case 3 : MEM_writeLE64(op+pos, (U64)(pledgedSrcSize)); pos+=8; break;
15782 }
15783 return pos;
15784}
15785
15786/* ZSTD_writeLastEmptyBlock() :
15787 * output an empty Block with end-of-frame mark to complete a frame

Callers 2

ZSTD_writeEpilogueFunction · 0.70

Calls 3

MEM_writeLE32Function · 0.70
MEM_writeLE16Function · 0.70
MEM_writeLE64Function · 0.70

Tested by

no test coverage detected