public static nuint ZDICT_getDictHeaderSize(void *dictBuffer, nuint dictSize) { nuint headerSize; if (dictSize <= 8 || MEM_readLE32(dictBuffer) != 0xEC30A437) { return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_dictionary_corrupted))); } { ZSTD_compressedBlockState_t *bs = (ZSTD_compressedBlockState_t *)(malloc((nuint)(4592))); uint *wksp = (uint *)(malloc((nuint)(((6 << 10) + 256)))); if (bs == null || wksp == null) { headerSize = (unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_memory_allocation))); } else { ZSTD_reset_compressedBlockState(bs); headerSize = ZSTD_loadCEntropy(bs, (void *)wksp, dictBuffer, dictSize); } free((void *)bs); free((void *)wksp); } return(headerSize); }
/** ZSTD_compressSubBlock_multi() : * Breaks super-block into multiple sub-blocks and compresses them. * Entropy will be written to the first block. * The following blocks will use repeat mode to compress. * All sub-blocks are compressed blocks (no raw or rle blocks). * @return : compressed size of the super block (which is multiple ZSTD blocks) * Or 0 if it failed to compress. */ private static nuint ZSTD_compressSubBlock_multi(seqStore_t *seqStorePtr, ZSTD_compressedBlockState_t *prevCBlock, ZSTD_compressedBlockState_t *nextCBlock, ZSTD_entropyCTablesMetadata_t *entropyMetadata, ZSTD_CCtx_params_s *cctxParams, void *dst, nuint dstCapacity, void *src, nuint srcSize, int bmi2, uint lastBlock, void *workspace, nuint wkspSize) { seqDef_s *sstart = seqStorePtr->sequencesStart; seqDef_s *send = seqStorePtr->sequences; seqDef_s *sp = sstart; byte * lstart = seqStorePtr->litStart; byte * lend = seqStorePtr->lit; byte * lp = lstart; byte * ip = (byte *)(src); byte * iend = ip + srcSize; byte * ostart = (byte *)(dst); byte * oend = ostart + dstCapacity; byte * op = ostart; byte * llCodePtr = seqStorePtr->llCode; byte * mlCodePtr = seqStorePtr->mlCode; byte * ofCodePtr = seqStorePtr->ofCode; nuint targetCBlockSize = cctxParams->targetCBlockSize; nuint litSize, seqCount; int writeLitEntropy = ((entropyMetadata->hufMetadata.hType == symbolEncodingType_e.set_compressed) ? 1 : 0); int writeSeqEntropy = 1; int lastSequence = 0; litSize = 0; seqCount = 0; do { nuint cBlockSizeEstimate = 0; if (sstart == send) { lastSequence = 1; } else { seqDef_s *sequence = sp + seqCount; lastSequence = ((sequence == send - 1) ? 1 : 0); litSize += ZSTD_getSequenceLength(seqStorePtr, sequence).litLength; seqCount++; } if (lastSequence != 0) { assert(lp <= lend); assert(litSize <= (nuint)(lend - lp)); litSize = (nuint)(lend - lp); } cBlockSizeEstimate = ZSTD_estimateSubBlockSize(lp, litSize, ofCodePtr, llCodePtr, mlCodePtr, seqCount, &nextCBlock->entropy, entropyMetadata, workspace, wkspSize, writeLitEntropy, writeSeqEntropy); if (cBlockSizeEstimate > targetCBlockSize || lastSequence != 0) { int litEntropyWritten = 0; int seqEntropyWritten = 0; nuint decompressedSize = ZSTD_seqDecompressedSize(seqStorePtr, sp, seqCount, litSize, lastSequence); nuint cSize = ZSTD_compressSubBlock(&nextCBlock->entropy, entropyMetadata, sp, seqCount, lp, litSize, llCodePtr, mlCodePtr, ofCodePtr, cctxParams, (void *)op, (nuint)(oend - op), bmi2, writeLitEntropy, writeSeqEntropy, &litEntropyWritten, &seqEntropyWritten, ((lastBlock != 0 && lastSequence != 0) ? 1U : 0U)); { nuint err_code = (cSize); if ((ERR_isError(err_code)) != 0) { return(err_code); } } if (cSize > 0 && cSize < decompressedSize) { assert(ip + decompressedSize <= iend); ip += decompressedSize; sp += seqCount; lp += litSize; op += cSize; llCodePtr += seqCount; mlCodePtr += seqCount; ofCodePtr += seqCount; litSize = 0; seqCount = 0; if (litEntropyWritten != 0) { writeLitEntropy = 0; } if (seqEntropyWritten != 0) { writeSeqEntropy = 0; } } } }while (lastSequence == 0); if (writeLitEntropy != 0) { memcpy((void *)(&nextCBlock->entropy.huf), (void *)(&prevCBlock->entropy.huf), ((nuint)(sizeof(ZSTD_hufCTables_t)))); } if (writeSeqEntropy != 0 && (ZSTD_needSequenceEntropyTables(&entropyMetadata->fseMetadata)) != 0) { return(0); } if (ip < iend) { nuint cSize = ZSTD_noCompressBlock((void *)op, (nuint)(oend - op), (void *)ip, (nuint)(iend - ip), lastBlock); { nuint err_code = (cSize); if ((ERR_isError(err_code)) != 0) { return(err_code); } } assert(cSize != 0); op += cSize; if (sp < send) { seqDef_s * seq; repcodes_s rep; memcpy((void *)(&rep), (void *)(prevCBlock->rep), ((nuint)(sizeof(repcodes_s)))); for (seq = sstart; seq < sp; ++seq) { rep = ZSTD_updateRep(rep.rep, seq->offset - 1, ((ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0) ? 1U : 0U)); } memcpy((void *)(nextCBlock->rep), (void *)(&rep), ((nuint)(sizeof(repcodes_s)))); } } return((nuint)(op - ostart)); }