| 15739 | |
| 15740 | |
| 15741 | static 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 |
no test coverage detected