| 2911 | |
| 2912 | |
| 2913 | static 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 |
no test coverage detected