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

Function ZSTD_writeFrameHeader

freebsd/contrib/zstd/lib/compress/zstd_compress.c:2913–2955  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2911
2912
2913static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
2914 const ZSTD_CCtx_params* params, U64 pledgedSrcSize, U32 dictID)
2915{ BYTE* const op = (BYTE*)dst;
2916 U32 const dictIDSizeCodeLength = (dictID>0) + (dictID>=256) + (dictID>=65536); /* 0-3 */
2917 U32 const dictIDSizeCode = params->fParams.noDictIDFlag ? 0 : dictIDSizeCodeLength; /* 0-3 */
2918 U32 const checksumFlag = params->fParams.checksumFlag>0;
2919 U32 const windowSize = (U32)1 << params->cParams.windowLog;
2920 U32 const singleSegment = params->fParams.contentSizeFlag && (windowSize >= pledgedSrcSize);
2921 BYTE const windowLogByte = (BYTE)((params->cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
2922 U32 const fcsCode = params->fParams.contentSizeFlag ?
2923 (pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) : 0; /* 0-3 */
2924 BYTE const frameHeaderDescriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) );
2925 size_t pos=0;
2926
2927 assert(!(params->fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN));
2928 RETURN_ERROR_IF(dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX, dstSize_tooSmall,
2929 "dst buf is too small to fit worst-case frame header size.");
2930 DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
2931 !params->fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode);
2932 if (params->format == ZSTD_f_zstd1) {
2933 MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
2934 pos = 4;
2935 }
2936 op[pos++] = frameHeaderDescriptionByte;
2937 if (!singleSegment) op[pos++] = windowLogByte;
2938 switch(dictIDSizeCode)
2939 {
2940 default: assert(0); /* impossible */
2941 case 0 : break;
2942 case 1 : op[pos] = (BYTE)(dictID); pos++; break;
2943 case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
2944 case 3 : MEM_writeLE32(op+pos, dictID); pos+=4; break;
2945 }
2946 switch(fcsCode)
2947 {
2948 default: assert(0); /* impossible */
2949 case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
2950 case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
2951 case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
2952 case 3 : MEM_writeLE64(op+pos, (U64)(pledgedSrcSize)); pos+=8; break;
2953 }
2954 return pos;
2955}
2956
2957/* ZSTD_writeLastEmptyBlock() :
2958 * output an empty Block with end-of-frame mark to complete a frame

Callers 3

ZSTD_writeEpilogueFunction · 0.70
ZSTD_compressSequencesFunction · 0.70

Calls 3

MEM_writeLE32Function · 0.50
MEM_writeLE16Function · 0.50
MEM_writeLE64Function · 0.50

Tested by

no test coverage detected